当前位置: 首页 > news >正文

优秀的网站建设公司潍坊企业模板建站

优秀的网站建设公司,潍坊企业模板建站,30号长沙封城最新消息,wordpress管理员头像不显示理解深浅拷贝 深浅拷贝问题的出现是由于JavaScript对不同类型的存储方式而引发的。 对于原始数据类型,它们的值是直接存储在栈内存中; 而复杂数据类型,则在栈内存中记录它的指针,而指针指向堆内存中真正的值。 所以对于原始数据类…

理解深浅拷贝

深浅拷贝问题的出现是由于JavaScript对不同类型的存储方式而引发的。
对于原始数据类型,它们的值是直接存储在栈内存中;
而复杂数据类型,则在栈内存中记录它的指针,而指针指向堆内存中真正的值。
所以对于原始数据类型,就没有深浅拷贝一说;而对于复杂数据类型,浅拷贝就是仅复制指针,但被复制对象改变时,新复制的对象也会跟着改变;深拷贝则是连同堆内存中的数据完全拷贝一份,新旧对象的变化互不影响。

深浅拷贝的定义

浅拷贝:

拷贝复杂类型时,仅拷贝对象的指针;当原对象改变时,拷贝对象也会跟着改变。

深拷贝:

拷贝复制类型时,拷贝对象的值;当原对象改变时,拷贝对象不会跟着改变。

深浅拷贝的实现方案

浅拷贝方案:

  1. 展开运算符(ES6)
  2. Object.assign()
  3. concat

深拷贝:

  1. 手写递归
  2. JSON.parse(JSON.stringfy())
    • 先转换成字符串,再解析回对象
    • 缺点是不能处理正则表达式和函数等特殊数据类型
  3. 一些库封装的深拷贝方法,例如Lodash的_.cloneDeep()

手写实现

// 先写一个浅拷贝
function _deepClone(target) {let cloneRes = {};for(const key in target) {cloneRes[key] = target[key]}return cloneRes// 函数出口// if (typeof target !== 'obejct') return target
}// 2. 普通深拷贝(只考虑对象/非对象)
function _deepClone(target) {if (typeof target === 'object'){// 如果是对象,进行处理let cloneRes = {};for(const key in target) {cloneRes[key] = _deepClone(target[key])}return cloneRes} else {// 如果不是对象,直接返回return target}
}// 3.考虑数组的深拷贝
function _deepClone(target) {if (typeof target === 'object') {let cloneRes = Array.isArray(target) ? [] : {}; // 核心for (const key in target) {cloneRes[key] = _deepClone(target[key])}return cloneRes} else {return target}
}// 4. 考虑循环引用
// Q:为什么要用WeakMap替代Map?
// A:强引用和弱引用的区别,强引用只能手动释放,弱引用能够被垃圾回收机制释放,使用Map会造成内存额外消耗。
//    WeakMap中的键是弱引用,Map中的键是强引用
function _deepClone(target, map=new WeakMap()) {if (typeof target === 'object') {let cloneRes = Array.isArray(target) ? [] : {}; // 核心// 防止循环调用导致的栈内存溢出if (map.get(target)) {return map.get(target)}map.set(target, cloneRes)for (const key in target) {cloneRes[key] = _deepClone(target[key], map)}return cloneRes} else {return target}
}// 5. 考虑其他数据类型
function _deepClone (target, map = new WeakMap()) {if (target === null) return nullif (target instanceof Date) return new Date(target)if (target instanceof RegExp) return new RegExp(target);if (typeof target !== 'object') return targetif (map.get(target)) return map.get(target);let cloneRes = new target.constructor()map.set(target, cloneRes)for (const key in target) {if (target.hasOwnProperty(key)) {cloneRes[key] = _deepClone(target[key], map);}}return cloneRes
}
// 6. 性能优化
// 把for..in改为普通的for循环,性能会有所提高// 测试案例
const target = {field1: 1,field2: undefined,field3: {child: 'child'},field4: [2, 4, 8]
};
const newTarget = _deepClone(target)
newTarget.field4[1] = "Child2"
console.log(target);
console.log(newTarget);
console.log(target === newTarget);
// 输出:
// {
//   field1: 1,
//   field2: undefined,
//   field3: { child: 'child' },
//   field4: [ 2, 4, 8 ]
// }
// {
//   field1: 1,
//   field2: undefined,
//   field3: { child: 'child' },
//   field4: [ 2, 'Child2', 8 ]
// }
// false

参考链接&&相关文章

前端早读课【第2810期】JavaScript 深拷贝性能分析

http://www.yayakq.cn/news/146833/

相关文章:

  • 免费医疗网站模板wordpress 禁用google
  • 什么网站可以做旅行行程广州网络营销学校
  • 国外域名建站wordpress自动博客插件
  • 网站公告设计建设外贸型网站
  • 手机在线建网站云脑网络科技网站建设
  • 查询网站怎么做代做网站关键词
  • 网站服务器和网站备案织梦cms通用蓝白简介大气企业网站环保科技公司源码
  • 有网址和关键词就能刷网站排名好模板网站
  • 电子商务网站建设与维护方法分析不包括哪些推广小程序的营销策略
  • 盐城 网站开发室内艺术设计
  • 手机站网站建设网站备案一般多久
  • 中山低价网站建设被攻击网站
  • 微信小程序网站建设小图标素材vue做网站好吗
  • 经典的jq查询网站建设部注册监理工程师网站
  • 花溪网站建设手机站点cn
  • 电子商务网站建设规划书seo排名优化价格
  • 单页网站开发实例下载百度广告推广费用一年多少钱
  • 做网站自适应框架wordpress常规地址改错了怎么办
  • 买个网站域名多少钱创意ppt模板大全
  • 如何在八戒网便宜做网站wordpress文章存在哪
  • 杨凌做网站什么是网络营销与直播电商
  • 北京市建设规划网站wordpress前端发布主题
  • 西安火车站建设XART视频库WordPress
  • 哪个网站做海报好北京网站制作最新教程
  • 创建网站需要注意的问题哈尔滨城乡建设网站
  • 企业网站货物查询怎么做网站建设报价单 excel
  • 重庆万州网站建设找谁神马网站快速排名案例
  • 建一个简单的网站多少钱东莞seo外包公司哪家好
  • 网站平台之间的关系wordpress邀请奖励
  • 网站名称怎么收录公司可以网上注册吗