浅拷贝、深拷贝

2022-12-19 0 461

虽然JavaScript中第一类是提及类别,留存的是门牌号,深、浅复本的差别是,当复本完结后,在很大某种程度上发生改变原第一类中的某两个提及类别特性的值,新复本出的第一类仍然受负面影响不然,是浅复本,但若是深复本。

浅复本的三种同时实现方式

第二种方式:Object.assign()会复本原初第一类中的大部份特性到两个新第一类上,假如特性为第一类,则复本的是第一类的门牌号,发生改变第一类中的特性值,新复本出的第一类仍然会受负面影响。

varobj = {name: 李四, age: 23, isStudent: false, job: { name: FE, money: 12 } } var newObj = Object.assign({}, obj); obj.job.money =21; console.log(newObj.name); // 输入李四 console.log(newObj.age); // 输入23 console.log(newObj.job.money);// 输入21,受负面影响

第三种方式:扩充操作符是ES6新减少的文本

var obj = { name: 李四, age: 23, isStudent: false } varnewObj = {…obj};console.log(newObj.name); // 输入李四 console.log(newObj.age); // 输入23

深复本三种同时实现方式

第二种方式: 利用JSON的序列化和反序列化方式,可以同时实现简易第一类深复本,但此种方式有较大的限制:

会忽略特性值为undefined的特性会忽略特性为Symbol的特性不会序列化函数不能解决循环提及的问题,直接报错varobj = {name: 李四, age: 23, address: undefined, sayHello: function() { console.log(Hello); }, isStudent: false, job: {name: FE, money: 12 } } var newObj = JSON.parse(JSON.stringify(obj)); obj.job.money = 21; console.log(newObj.name);// 输入李四 console.log(newObj.age); // 输入23 console.log(newObj.job.money); // 输入12 console.log(newObj.address);// 报错 console.log(newObj.sayHello());// 报错

第三种: 同时实现自己简易的深复本函数

function deepClone(obj) { function isObject(o) { return (typeof o === object || typeof o === function) && o !== null; } if(!isObject(obj)) {throw new Error(非第一类); } var isArray = Array.isArray(obj); varnewObj = isArray ? […obj] : {…obj};Reflect.ownKeys(newObj).forEach(key =>{ newObj[key] = isObject(newObj[key]) ? deepClone(newObj[key]) : newObj[key]; })return newObj; } var obj = { name: AAA, age: 23, job: { name: FE, money: 12000} }var cloneObj = deepClone(obj); obj.job.money = 13000; console.log(obj.job.money); // 输入13000 console.log(cloneObj.job.money);// 输入12000

第三种方式: 使用lodash第三方函数库同时实现(需要先引入lodash.js)

var obj = { name: 李四, age: 23, isStudent: false, job: { name: FE, money: 12 } } var newObj = _.cloneDeep(obj); obj.job.money = 21; console.log(newObj.name); // 输入李四 console.log(newObj.age); // 输入23 console.log(newObj.job.money);// 输入12,不受负面影响

如若转载,请注明出处:开源字节

https://sourcebyte.cn/article/145.html

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务