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

网站的整合网络设计专业有前途吗

网站的整合,网络设计专业有前途吗,wordpress自定义搜索功能,鹿泉微信网站建设在js中,直接通过赋值操作拷贝数组,会导致新旧数组互相影响。 这是因为数组、对象等数据属于引用类型(Reference Type)数据。对引用类型数据进行赋值操作时,实际上拷贝的是其内存地址的引用(即指向堆内存中对…

在js中,直接通过赋值操作拷贝数组,会导致新旧数组互相影响。
这是因为数组、对象等数据属于引用类型(Reference Type)数据。对引用类型数据进行赋值操作时,实际上拷贝的是其内存地址的引用(即指向堆内存中对应数据的地址指针),而不是其本身的值。直接赋值后,新旧变量存储着同一个地址指针,指向同一块内存空间。

const arr = [1,2,3];
const arr_copy = arr1;
arr_copy[1] = 2024; // arr_copy和arr都变成[2024,2,3]

如需实现真正的独立拷贝,避免新旧数组互相影响,需要创建新数组并一一复制旧数组的元素。
当拷贝顶层元素都是基本类型,没有引用类型的数组时,则只需要浅拷贝(Shadow Copy),使新旧数组的顶层元素独立即可。

浅拷贝数组

  1. 展开运算符
const arr_copy1 = [...arr];
  1. Array.from()
const arr_copy2 = Array.from(arr);
  1. Array.prototype.slice()
const arr_copy3 = arr.slice();

如果要拷贝类数组对象,由于它不是由 Array构造函数创建的,所以没有Array.prototype的slice方法,要用call借用。

const arrayLike = { 0: "a", 1: "b", length: 2 };
const arr_copy3 = Array.prototype.slice.call(arrayLike);
  1. Array.prototype.concat()
const arr_copy4 = arr.concat();
  1. Object.assign()
const arr_copy5 = Object.assign([], arr);
  1. Array.prototype.reudce()
const arr_copy6 = arr.reduce((prev, curr) => {prev.push(curr);
}, []);
  1. for / forEach / for…of 遍历
const arr_copy7 = [];
for (const value of arr) {arr_copy7.push(value);
}
// 或
for (const [idx, value] of arr.entries()) {arr_copy7[idx] = value;
}
  1. lodash.clone()
const _ = require('lodash');
const arr_copy4 = _.clone(arr);

浅拷贝对象

  1. 展开运算符
const obj_copy1 = {...obj};
  1. Object.assign()
    是用于 合并对象 或 浅拷贝对象 的方法。
const obj_copy2 = Object.assign({}, obj);

在这里插入图片描述

  1. for…in遍历
const obj_copy3 = {};
for (const key in obj) {if (obj.hasProperty(key)) { // 检查是否是对象自身的属性,过滤原型链上的属性obj_copy3[key] = obj[key];}
}
  1. Object.keys()
const obj_copy4 = {};
Object.keys(obj).map(key => {obj_copy4[key] = obj[key];
});
  1. lodash.clone()
const _ = require('lodash');
const obj_copy5 = _.clone(obj);
  1. Object.create + Object.getPrototypeOf
const obj_copy6 = Object.create(Object.getPrototypeOf(obj));
Object.assign(obj_copy6, obj);

深拷贝数组or对象

若数组包含嵌套对象或数组,内层引用仍需深拷贝(Deep Copy),否则会导致新旧数组的内存元素互相影响。

const arr = [[1,2,3],[4,5,6]];
const arr_copy = [...arr];
arr_copy[0][0] = 2024; // arr_copy和arr都变成[[2024,2,3],[4,5,6]]

深拷贝数组的方法有以下几种:

  1. JSON.stringify + JSON.parse
    缺点:
    无法拷贝 function、undefined、Symbol、循环引用等。
    会丢失对象的原型链。
    遇到循环引用会抛出错误。
const arr_copy1 = JSON.parse(JSON.stringify(arr));
  1. 递归手动实现深拷贝
    灵活可控,支持复杂类型,可自行处理循环引用,面试常考
const deepClone = (obj, cache = new WeakMap()) => {if (obj === null || typeof obj === 'object') return obj;if (cache.has(obj)) return cache.get(obj); // 直接返回缓存if (obj instanceof Date) return new Date(obj.valueOf());if (obj instanceof Regex) return new Regex(obj);const copy = Array.isArray(obj) ? [] : {};cache.set(obj, copy); //缓存当前对象for (const key in obj) {if (obj.hasOwnProperty(key)) {copy[key] = deepClone(obj[key]);}}return copy;
};
const arr_copy3 = deepClone(arr);

解释:
设置cache是为了避免遇到循环引用抛出错误。
遇到RegExp对象不直接返回原对象,而是返回新实例,是为了避免直接赋值引用类型数据,出现浅拷贝问题。
new Date(obj)等同于new Date(obj.valueOf()),都是获取原日期的时间戳并用该时间戳创建一个新 Date 对象。

const regExp = /abc/g;
const regExp_copy1 = regExp;
const regExp_copy2 = new RegExp(regExp);
regExp.source = "changed";
console.log(regExp_copy1.source); // 拷贝对象也被影响
console.log(regExp_copy2.source); // 拷贝对象没有被影响
  1. lodash.cloneDeep()
    稳定可靠,适合用于生产环境。
const _ = require('lodash');
const arr_copy2 = _.cloneDeep(arr);
  1. structuredClone
    原生支持,性能好,但兼容性有限,仅用于现代浏览器环境。
const arr_copy4 = structuredClone(arr);

深拷贝对象的方法与深拷贝数组相同。

http://www.dtcms.com/wzjs/815375.html

相关文章:

  • 重庆网站建设套餐专门做化妆品平台的网站有哪些
  • 哪有可以专门做外包项目的网站商会联盟网站建设方案
  • 做网站投注代理犯罪吗衡水安徽网站建设
  • 新闻类网站html模板免费下载旅游网站开发毕业设计论文
  • 金华专业做网站网页设计工资一般多少杭州
  • 网站优化难吗网站建设背景如何写
  • 重庆整合网络营销之整站优化每天稳定赚50以上的手游
  • 如何管理网站文件网络营销系统的功能
  • 黄山公司做网站网站建设需求背景
  • 这个网站的建设流程网站建设多少钱裙
  • 开网站做网站赚钱吗网站建设工作总结报告
  • 网站设计中 查询怎么做苏州工程网站建设
  • 高新区做网站怎么建设百度网站
  • 企业网站建设(信科网络)设计网站平台风格
  • 昆明市住房和城乡建设局官方网站网站模板哪个网站全面
  • 企业网站有那些微信小程序在哪里查找
  • 网站开发ceac证桂林人论坛电脑版
  • 北京网站seo公司手机百度2020最新版
  • 如此查询网站名字是否注册怎么给网站做谷歌seo
  • 专门做动漫的网站网站 整站 抓取
  • 如何修改网站的关键词西安自助建站做网站
  • 如何提交网站给百度永城市专业做网站
  • 企业官网型网站模板网站空间企业个人
  • 网页设计培训怎么学seo工具优化
  • 网站服务器租金wordpress+编写页面代码
  • 深圳开发的相亲网站信息产业部icp备案中心网站
  • 网站建设费如何会计处理北京网站制作基本流程
  • 网站网站制作多少钱国外创意网站欣赏
  • 网站开发基础课程wordpress高效写文章
  • 广州哪家做网站有哪些网站可以做网站游戏