工具方法合集-utils.js

通用

import get from 'lodash.get'
import cloneDeep from 'lodash.clonedeep'
// 深度clone
export function deepClone(obj) {return obj ? cloneDeep(obj) : obj
}
export function lodashGet(obj, key, defaultValue = '') {//这个 defaultValue  不能给默认 值 会报错;return get(obj, key, defaultValue);
}
/*** 生成 通用唯一编码* @param len 指定长度* @param radix 基数
*/
export const createUuid = (len, radix) => {var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('')var uuid = []var iradix = radix || chars.lengthif (len) {// Compact formfor (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random() * radix]} else {// rfc4122, version 4 formvar r// rfc4122 requires these charactersuuid[8] = uuid[13] = uuid[18] = uuid[23] = '-'uuid[14] = '4'// Fill in random data.  At i==19 set the high bits of clock sequence as// per rfc4122, sec. 4.1.5for (i = 0; i < 36; i++) {if (!uuid[i]) {r = 0 | Math.random() * 16uuid[i] = chars[(i === 19) ? (r & 0x3) | 0x8 : r]}}}return uuid.join('')
}
// 获取对象的具体类型
export function getDataType(data) {if (data === null) {return 'null';}if (data instanceof Array) {return 'Array';}if (data instanceof Object) {return 'Object';}return 'param is no object type';
}// tree扁平化处理
export function treeTraversal(treeList) {let list = [];const loop = (tree) => {tree.map((item) => {const children = item.children ? item.children : '';delete item.children;list = [...list, item];return children ? loop(children) : '';});};loop(deepClone(treeList));return list;
}//根据dbid返回指定的字段 可满足filed的格式'cycleTime'或多级'processSegment.cycleTime'
export function findFiled(val, filed, data = []) {if (!val) {return '';}const list = data[0] && data[0].children ? treeTraversal(data) : data;const nameArr = list.filter(({ dbid }) => dbid === val);if (!nameArr.length) {return '';}return lodashGet(nameArr[0], filed);
}// 设置URL上的querystring
export function setQueryString(val) {let querystring = JSON.parse(localStorage.getItem('queryString'))querystring = querystring || {}const { query, hash } = router.app.$routeconst { name } = router.currentRouteconst newQuery = { ...query, ...val }querystring[name] = newQuerylocalStorage.setItem('queryString', JSON.stringify(querystring))router.replace({ query: newQuery, hash })
}// 获取URL上querystring 格式化成对象格式(vue-router)
export function getQueryString(data) {const { currentRoute, app } = router;const { name } = currentRoute;const val = deepClone(data);const { query } = app.$route;const queryKeys = Object.keys(query);if (queryKeys.length) {Object.keys(val).forEach((key) => {if (queryKeys.find(queryKey => queryKey === key)) {const item = query[key];if (getDataType(val[key]) === 'Array' && getDataType(item) !== 'Array') {val[key] = !item ? [] : [item];} else if (item === 'true') {val[key] = true;} else if (item === 'false') {val[key] = false;} else if (item) {val[key] = item;}}});return JSON.parse(JSON.stringify(val), (k, v) => {v = v && typeof v === 'string' && !Number.isNaN(Number(v)) ? Number(v) : v;return v;});}return val;
}//判断是否为浅色
export function isLight(color) {if (!color) {return false;}const colorRgb = () => {// 16进制颜色值的正则const reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;// 把颜色值变成小写color = color.toLowerCase();if (reg.test(color)) {// 如果只有三位的值,需变成六位,如:#fff => #ffffffif (color.length === 4) {let colorNew = '#';for (let i = 1; i < 4; i += 1) {colorNew += color.slice(i, i + 1).concat(color.slice(i, i + 1));}color = colorNew;}// 处理六位的颜色值,转为RGBconst colorChange = [];for (let i = 1; i < 7; i += 2) {colorChange.push(parseInt(`0x${color.slice(i, i + 2)}`, 0));}return colorChange;}const list = [];color.replace(/[0-9]*(\.[0-9]*)?/g, (e) => {if (e !== '') {list.push(Number(e));}});return list;};const [r, g, b] = colorRgb();return r * 0.299 + g * 0.578 + b * 0.114 >= 192;
}/*** 根据对象中的一个字段分组* @param groupType:Array|Object返回值格式(数组型数组或者对象型数组)* @param objModel model1|model2 对象型数组的格式* 数组型数组返回值格式为* [* [{x:0.1,y:0.3},{x:0.1,y:0.5}]* ...* ]** 对象型数组model1返回值格式为* [*  {code:'0.1',valueList:[{x:0.1,y:0.3},{x:0.1,y:0.5}]}* ...* ]*  对象型数组model2返回值格式为* [*  {code:'0.1',valueList:[0.3,0.5]}* ...* ]* @returns {Array}*/export function grouping(data, key, groupType = 'Array', objModel = 'model1') {const newArray = []data.map((item) => [item]).forEach(([{ ...item }]) => {const flag = newArray.find(([{ ...o }]) => xeGet(o, key) === xeGet(item, key))if (!flag) {newArray.push([{ ...item }])} else {newArray.forEach(([{ ...y }], index) => {if (xeGet(y, key) === xeGet(item, key)) {newArray[index].push(item)}})}})if (groupType !== 'Array') {// 返回对象型数组const ObjArray = []newArray.forEach((item) => {const obj = {}obj.groupName = xeGet(item[0], key)if (objModel === 'model1') {obj.valueList = item} else {obj.valueList = item.map((item) => item.y)}ObjArray.push(obj)})// console.log('ObjArray===', ObjArray)return ObjArray}// console.log("newArray===", newArray);// 返回数组型数组return newArray
}/***  字节单位动态转换* @param bytes 字节数值* @returns {String}*  */
export function bytesUnitTransfer(bytes) {if (bytes) {if (String(bytes) === '0') return '0 B'const k = 1024const sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']const i = Math.floor(Math.log(bytes) / Math.log(k))if (isNaN(i)) {return '-'} else {return (bytes / Math.pow(k, i)).toFixed(2) + ' ' + sizes[i]}} else {return '-'}
}function getDigit(integer) {let digit = -1while (integer >= 1) {digit++integer = integer / 10}return digit
}
// 数字过大 进行单位转换
function addWan(integer, number, mutiple, decimalDigit) {const digit = getDigit(integer)if (digit > 3) {var remainder = digit % 8if (remainder >= 5) {// ‘十万’、‘百万’、‘千万’显示为‘万’remainder = 4}return Math.round(number / Math.pow(10, remainder + mutiple - decimalDigit)) / Math.pow(10, decimalDigit) + '万'} else {return Math.round(number / Math.pow(10, mutiple - decimalDigit)) / Math.pow(10, decimalDigit)}
}
/***  数字单位动态转换* @param number 数值* @param decimalDigit 小数位* @returns {string}*  */
export function numberUnitTransfer(number, decimalDigit) {decimalDigit = decimalDigit == null ? 2 : decimalDigitconst integer = Math.floor(number)const digit = getDigit(integer)// ['个', '十', '百', '千', '万', '十万', '百万', '千万'];const unit = []if (digit > 3) {var multiple = Math.floor(digit / 8)if (multiple >= 1) {const tmp = Math.round(integer / Math.pow(10, 8 * multiple))unit.push(addWan(tmp, number, 8 * multiple, decimalDigit))for (let i = 0; i < multiple; i++) {unit.push('亿')}return unit.join('')} else {return addWan(integer, number, 0, decimalDigit)}} else {return number}
}// 数字取整
export const numRevise = (num, type) => {// if (!isNull(num) && /^[0-9]+(\.[0-9]+)?$/.test(num)) {if (!isNull(num) && !isNaN(num)) {if (isNull(type)) {// 丢弃小数部分,保留整数部分return parseInt(num)}if (type === 'ceil' || type === 'floor' || type === 'round') {// ceil向上取整; floor向下取整; round四舍五入return Math[type](num)}}return undefined
}

文件处理

// 获取file格式图片的宽高
export const getImgWidthAndH = function (file) {return new Promise((resolve, reject) => {const reader = new FileReader()reader.readAsDataURL(file)reader.onload = function (event) {const base64 = event.target.resultconst img = new Image()img.src = base64img.onload = function () {resolve({ width: img.width, height: img.height })}}})
}// 文件转base64
export function getBase64(file) {return new Promise(function (resolve, reject) {const reader = new FileReader()let imgResult = ''reader.readAsDataURL(file)reader.onload = function () {imgResult = reader.result}reader.onerror = function (error) {reject(error)}reader.onloadend = function () {resolve(imgResult)}})
}
// 图片base64转图片
export function getBase64ToUrl(base64) {const changebase64 = 'data:image/jpg;base64,' + base64.replace(/[\r\n]/g, '')return changebase64
}// 下载文件流处理
export function blobToFile(res, fileName, type = 'application/vnd.ms-excel') {const link = document.createElement('a')const blob = new Blob([res.data], {type})link.style.display = 'none'link.href = URL.createObjectURL(blob)if (fileName) {link.download = fileName // 下载的文件名} else {link.download = res.headers['content-disposition']const name = decodeURI(escape(link.download.split('=')[1])) // 乱码转义link.download = name // 下载的文件名}document.body.appendChild(link)link.click()document.body.removeChild(link)
}// 获取文件(流)头信息
export const getFileMIME = file => new Promise((resolve) => {const reader = new FileReader()reader.readAsArrayBuffer(file)reader.onload = (e) => {const typeHex = (new Uint8Array(reader.result)).subarray(0, 4).reduce((str, index) => str + index.toString(16), '').toLowerCase()resolve(typeHex ? FILE_MIME_HEX[typeHex] : '')}
})

tree合集

// 根据指定字段获取符合的项
export function getChildren(val, tree, key = 'dbid') {let hasFound = false; // 表示是否有找到id值let result = null;const fn = (data) => {if (Array.isArray(data) && !hasFound) {// 判断是否是数组并且没有的情况下,data.forEach((item) => {if (item[key] === val) {// 数据循环每个子项,并且判断子项下边是否有id值result = item; // 返回的结果等于每一项hasFound = true; // 并且找到id值} else if (item.children) {fn(item.children); // 递归调用下边的子项}});}};fn(tree); // 调用一下return result;
}//获取tree轨迹
export function getTrajectory(dataList) {let treePath = '';dataList.forEach(item => (treePath = `${treePath}/${item.nameZh}`));return treePath.substring(1);
}//获取tree叶子节点
export function getAllLeafNode(tree, key = 'dbid') {const val = [];const mapTree = (node, innerVal, innerKey) => {node.forEach((item) => {if (!item.children) {innerVal.push(item[innerKey]);} else {mapTree(item.children, innerVal, innerKey);}});};mapTree(tree, val, key);return val;
}
//获取tree 的指定字段(所有层级)
export function getTreeAppointField(tree, key = 'dbid') {const val = [];const mapTree = (node, innerVal, innerKey) => {node.forEach((item) => {innerVal.push(item[innerKey]);if (item.children) {mapTree(item.children, innerVal, innerKey);}});};mapTree(tree, val, key);return val;
}// 向tree中的每一项添加指定数据
/*** @param newData:向每一项填加的属性* @param uuid:是否要向每一项填加唯一标识* @param childrenField: 下级的字段名标识*/
export function treeTraversalToAdd(treeList, newData, uuid = true, childrenField = 'children') {const addKey = (arr) => {if (uuid) {return arr?.map((item) => ({uuid: createUuid(),...item,...newData,[childrenField]: item[childrenField] ? addKey(item[childrenField]) : []}))}return arr?.map((item) => ({...item,...newData,[childrenField]: item[childrenField] ? addKey(item[childrenField]) : []}))}const newTree = addKey(deepClone(treeList))return newTree
}/*** 向tree数据符合条件的子项前添加* @param newData:要添加的新数据* @param type:level添加平级、sub添加下级* @param first:是否是第一个元素*/export function addTreeChildren(val, tree, newData = {}, type = 'level', key = 'aid', first = false) {const newTree = deepClone(tree)let hasFound = false // 表示是否有找到值const traversal = data => {for (let i = 0; i < data.length; i++) {if (hasFound) returnconst info = data[i]if (lodashGet(info, key) !== val && info.children) {traversal(info.children)} else if (lodashGet(info, key) === val) {hasFound = true // 找到值const index = data.findIndex(item => val === lodashGet(item, key))if (type === 'level') {// 向平级添加if (first) {data.splice(index, 0, newData)return}data.splice(index + 1, 0, newData)} else {// 向下级添加(实则是替换当前项,向子级添加项)const dealData = { ...data[index], children: [newData, ...data[index]?.children] }data.splice(index, 1, dealData)}}}}traversal(newTree)return newTree
}// 删除tree数据符合条件的子项
export function delTreeChildren(val, tree, key = 'aid') {const newTree = deepClone(tree)const traversal = data => {for (let i = 0; i < data.length; i++) {const info = data[i]if (lodashGet(info, key) !== val && info.children) {traversal(info.children)} else if (lodashGet(info, key) === val) {const index = data.findIndex(item => val === item[key])data.splice(index, 1)i--}}}traversal(newTree)return newTree
}

时间处理合集(moment.js)

//处理时间拼接毫秒和正八区和负八区
export function formatTime(timeStr, format = 'YYYY-MM-DDTHH:mm:ss.SSSZ') {const getFormatString = () => {switch (format) {case 'yyyy-MM-dd':case 'YYYY-MM-dd':return 'YYYY-MM-DD';case 'yyyy-MM-dd HH:mm:ss':case 'YYYY-MM-dd HH:mm:ss':return 'YYYY-MM-DDTHH:mm:ss.SSSZ';default:return format;}};if (!timeStr) {return '';} //当点击×的时候 传过来nullif (timeStr[0] && timeStr[1]) {return [moment(timeStr[0]).format(getFormatString()), moment(timeStr[1]).format(getFormatString())];}return moment(timeStr).format(getFormatString());
}
// 截取当前时间往前1(0,1,2,3,4....)个周(年years,月months,天days)
export function subtractCurrentTime(amount = 1, unit = 'weeks') {return [formatTime(moment().subtract(amount, unit)), formatTime(moment())];
}// 截取指定日期前或后或(前和后)1(0,1,2,3,4....)个周(年years,月months,天days)
// type :1前 2后 3前和后
export function getDatePreAndNext(amount = 1, unit = 'weeks', data = '', type = 1) {const date = !data? moment().format('YYYY-MM-DD'): moment(data).format('YYYY-MM-DD')if (type === 0) {return [formatTime(moment(date).subtract(amount, unit)), formatTime(moment(`${date} 23:59:59`))]} if (type === 1) {return [formatTime(moment(date)), formatTime(moment(`${date} 23:59:59`).add(amount, unit))]}return [formatTime(moment(currentDate).subtract(amount, unit)),formatTime(moment(`${currentDate} 23:59:59`).add(amount, unit))]
}//根据时间和周期获取下一次时间
export function getTimeByDate(amount = 2, unit = 'Hours', date = new Date()) {const dDate = date || new Date();const currentDate = moment(dDate).format('YYYY-MM-DD HH:mm:ss');return formatTime(moment(currentDate).add(amount, unit));
}//截取时间1(0,1,2,3,4....)个周(年years,月months,天days)开始时间0时至结束时间24时
export function subtractStartAndEnd(amount = 1, unit = 'weeks') {const [startDate, endDate] = subtractCurrentTime(amount, unit);return [formatTime(moment(startDate).startOf(unit)), formatTime(moment(endDate).endOf(unit))];
}
// 截取当天前后1(0,1,2,3,4....)个月(年years,周weeks,天days)
//前后时间间隔不同,第一个参数传array[1,2]:取时为1个月前2个月后
export function subtractPreAndNext(amount = 1, unit = 'months', format = 'YYYY-MM-DD HH:mm:ss') {const date = moment().format('YYYY-MM-DD');if (Array.isArray(amount)) {return [formatTime(moment(date).subtract(amount[0], unit), format),formatTime(moment(`${date} 23:59:59`).add(amount[1], unit), format),];}return [formatTime(moment(date).subtract(amount, unit)), formatTime(moment(`${date} 23:59:59`).add(amount, unit))];
}
// 获取一段日期的中间日期
export function enumerateDaysBetweenDates(startDate, endDate) {const dates = [];const currDate = moment(startDate).startOf('day');const lastDate = moment(endDate).startOf('day');while (currDate.add(1, 'days').diff(lastDate) < 0) {dates.push(currDate.clone().toDate());}const { length } = dates;const i = Math.ceil(length / 2 - 1);return formatTime(dates[i]);
}
//计算时间差
export function durationTime(startTime, endTime, unit = 'minute') {if (!startTime || !endTime) {return '';}const startDate = timeFormat(startTime);const seconds = moment(endTime, 'YYYY-MM-DD HH:mm:ss').diff(startDate, 'seconds');let duration = '';switch (unit) {case 'minute':duration = `${seconds / 60} 分钟`;break;case 'hours':duration = `${seconds / 2600} 小时`;break;default:break;}return duration;
}//获取当前月初到月底
//获取当天,00:00:00到23:59:59,(unit=day)
//获取当前所在周,周一到到周日,(unit=week)
//获取当前所在月,月初到月底,(unit=month)
//获取当前所在年,年初到年末,(unit=year)
export function dateStartAndEnd(unit = 'month', date = new Date(), format = 'YYYY-MM-DDTHH:mm:ss.SSSZ') {const currentDate = moment(date).format('YYYY-MM-DD');return [formatTime(moment(currentDate).startOf(unit), format), formatTime(moment(currentDate).endOf(unit), format)];
}//获取当月初到当天23:59:59
export function monthStartAndSameDay() {const date = moment().format('YYYY-MM-DD');return [formatTime(moment().startOf('month')), formatTime(moment(`${date} 23:59:59`))];
}//获取当前天的 日期格式 20200430 字符串
export function getStandardIntervalString(unit = 'month', date = undefined) {switch (unit) {case 'day': {return moment(date).format('YYYYMMDD');}case 'month': {return moment(date).format('YYYYMM');}case 'year': {return moment(date).format('YYYY');}}
}

数组操作

// 对象数组根据某一个字段去重
export const getArrayUnique = function (arr, key) {const newArrId = []const newArrObj = []arr.forEach((item) => {if (!newArrId.includes(item[key])) {newArrId.push(item[key])newArrObj.push(item)}})return newArrObj
}
// 根据某一字段求arr2对象数组的差集
export const getArrayDifference = function (arr1, arr2, key) {const result = []for (let i = 0; i < arr2.length; i++) {const obj = arr2[i]const unique1 = obj[key]let isExist = falsefor (let j = 0; j < arr1.length; j++) {const aj = arr1[j]const unique2 = aj[key]if (unique2 === unique1) {isExist = truebreak}}if (!isExist) {result.push(obj)}}return result
}// 将数组拼成tree
export function arrayToTree(arr) {const map = {}const result = []let nodefor (let i = 0; i < arr.length; i++) {map[arr[i].id] = arr[i]arr[i].children = []}for (let i = 0; i < arr.length; i++) {node = arr[i]if (node.parentId) {map[node.parentId].children.push(node)} else {result.push(node)}}return result
}/*** 根据数组中对象的某个字段排序* @param props 进行排序的字段* @param type 排序规则 ascend 升序 descend降序* @returns {*}*/
export function sortBy(props, type) {return function (a, b) {if (type === 'ascend') {return b[props] - a[props]} else if (type === 'descend') {return a[props] - b[props]}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/700847.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

超实用,分享PostgreSQL和mysql的几点区别

前言 今天是元宵节&#xff0c;首先祝大伙元宵快乐&#xff01;上一篇文章&#xff0c;给大家讲解了一下MySQL和PostgreSQL性能上的差别。这篇文章主要是记录一下日常应用中&#xff0c;两者常见的一些语法以及一些区别。 PostgreSQL的数据类型 数值类型 字符串类型 日期|时…

harmony 鸿蒙使用N-API开发Native模块

harmony 鸿蒙使用N-API开发Native模块&#xff0c;其实就是Node.js 官网中已经给出 N-API 接口基础能力&#xff0c;同时&#xff0c;方舟 ArkTS 运行时提供的 N-API 接口&#xff0c;封装了方舟引擎的能力&#xff0c;在功能上与 Node.js 社区保持一致。 N-API 是 Node.js Add…

Java:性能优化细节11-20

Java&#xff1a;性能优化细节11-20 11. 尽量合理的创建HashMap 当你要创建一个比较大的hashMap时&#xff0c;充分利用这个构造函数 public HashMap(int initialCapacity, float loadFactor);合理初始化HashMap的容量和负载因子是提高HashMap性能的关键因素之一。HashMap在…

Linux--shell编程中分区表常用操作 全面且详细

文章中关于分区表常用操作目录&#xff1a; 一、概念 二、​​​​​​​创建分区表语法 ​​​​​​​三、创建一个表带多个分区 四、​​​​​​​加载数据到分区表中 五、加载数据到一个多分区的表中去 ​​​​​​​六、查看分区 七、​​​​​​​添加一个分区…

ChatGPT大致运用了哪些技术

ChatGPT是一个基于OpenAI的GPT&#xff08;Generative Pre-trained Transformer&#xff09;架构构建的语言模型。它的大致原理和运用的技术如下&#xff1a; Transformer架构&#xff1a;ChatGPT基于Transformer模型&#xff0c;这是一种使用自注意力机制&#xff08;self-att…

机器学习:逻辑回归原理

逻辑回归模型是一种广泛应用于分类问题的统计方法。尽管名为“回归”&#xff0c;但它实际上是一种分类算法&#xff0c;主要用于预测观察对象属于某个类别的概率。逻辑回归模型特别适用于二分类问题&#xff0c;但也可以通过一些策略扩展到多分类问题。 逻辑回归的应用与优化…

让C语言代码变抽象(二)

目录 前言&#xff1a; 代码&#xff1a; 前言&#xff1a; 在今天写代码的时候&#xff0c;我又想到一个更抽象的代码。 我在写注释的时候突然想想到条件编译的东西&#xff0c;好像也能用来注释东西。 代码&#xff1a; 我们在这直接上干货 我们知道在条件编译中有一个叫…

飞常准查航班小程序采集

仅限学习使用 <html> <head> </head> <body><script src"AesUtil.js"></script><script src"md5.js"></script><script>function test(a) { return true; }function serialize(o) {var n argumen…

【前端素材】推荐优质后台管理系统Acara平台模板(附源码)

一、需求分析 后台管理系统在多个层次上提供了丰富的功能和细致的管理手段&#xff0c;帮助管理员轻松管理和控制系统的各个方面。其灵活性和可扩展性使得后台管理系统成为各种网站、应用程序和系统不可或缺的管理工具。 后台管理系统是一种用于管理和控制网站、应用程序或系…

Map集合特点、遍历方式、TreeMap排序及Collections和Arrays

目录 ​编辑 一、集合框架 二、 Map集合 特点 遍历方式 HashMap与Hashtable的区别 TreeMap Collections Arrays 一、集合框架 二、 Map集合 Map集合是一种键值对的集合&#xff0c;其中每个键对应一个值。在Java中&#xff0c;Map接口定义了一种将键映射到值的数据结…

Python中websockets服务端从客户端接收消息并发送给多线程

思路&#xff1a; 1.websockets需要从客户端接收消息&#xff0c;由于websockets创建服务端只能绑定一个端口&#xff0c;所以需要单独占用一个线程。收到的消息&#xff0c;我们需要共享给主线程&#xff0c;然后主线程根据设备&#xff08;多线程&#xff09;分发消息给各线…

嵌入式学习-qt-Day3

嵌入式学习-qt-Day3 一、思维导图 二、作业 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳…

「Java开发指南」MyEclipse如何支持Spring Scaffolding?(三)

在上文中&#xff08;点击这里回顾>>&#xff09;&#xff0c;主要为大家介绍了CRUD Scaffolding&#xff0c;本文将继续介绍应用程序的分层、代码助手等。 MyEclipse v2023.1.2离线版下载 3. 应用程序的分层 应用程序分层是应用程序开发领域中非常常见的体系结构方法…

C++之类作用域

目录 1、全局作用域 2、类作用域 2.1、设计模式之Pimpl 2.2、单例模式的自动释放 2.2.0、检测内存泄漏的工具valgrind 2.2.1、可以使用友元形式进行设计 2.2.2、内部类加静态数据成员形式 2.2.3、atexit方式进行 2.2.4、pthread_once形式 作用域可以分为类作用域、类名…

c++学习记录 STL基本概念

1、STL基本概念 STL&#xff08;Standard Template Library&#xff0c;标准模板库&#xff09;STL广义上分为&#xff1a;容器&#xff08;container&#xff09;算法&#xff08;algorithm&#xff09;迭代器&#xff08;iterator&#xff09;容器和算法之间通过迭代器进行无…

线程共享和非共享的资源及线程优缺点

注意&#xff1a;共享的内存地址空间中不包括栈&#xff1b;共享文件描述符表&#xff0c;表示&#xff0c;同一进程中线程可以操作同一文件。

猫头虎分享已解决Bug || TypeError: Cannot read property ‘props‘ of undefined (React)

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

c++的类型转换方法

一、静态类型转换&#xff08;static_cast&#xff09; 静态类型的转换主要用于基本类型之间的转换&#xff0c;比如int类型转换为double类型。但是static_cast也可以支持上下行的转换&#xff08;存在继承关系之间的转换&#xff09; 基本类型之间的转换举例 上下行转换的举…

金航标电子位于广西柳州鹿寨县天线生产基地于大年正月初九开工了!!!

金航标kinghelm&#xff08;www.kinghelm.com.cn&#xff09;总部位于中国深圳市&#xff0c;兼顾技术、成本、管理、效率和可持续发展。东莞塘厦实验室全电波暗室、网络分析仪、高低温测试柜等仪器设备齐全&#xff0c;可进行高低温、双85等测试&#xff0c;独立完成产品的检测…

Linux内核中并发与竞争的处理方法:原子操作代码举例二

一. 简介 前面文章学习了Linux内核中处理并发与竞争的一种方法&#xff1a;原子操作&#xff0c;并编写代码说明原子操作中对整型变量的操作&#xff0c;文章地址如下&#xff1a; Linux内核中并发与竞争的处理方法&#xff1a;原子操作代码举例一-CSDN博客 本文学习原子操…