企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
>[danger] 数组/对象 -> 深拷贝/浅拷贝 ***** 参考: 1. 浅拷贝, 例如: ``` var arr = [1, 2, 3, 4]; var brr = arr; brr.push(5); console.log(arr); // 结果: [1, 2, 3, 4, 5] // 思考: 为什么往brr数组末尾插入元素5, arr数组也跟着改变了呢? ``` > 总结: 浅拷贝: 无论arr还是brr操作数组, 都会对, 对方产生影响 浅拷贝->影子.互相影响 ![](https://box.kancloud.cn/ca7884465977de19745271275142061a_1117x660.png) 2. 深拷贝, 例如: ``` var arr = [1, 2, 3, 4]; var brr = new Array(); arr.map(item => { brr.push(item); }) brr.push(5); console.log(arr); // 结果: [1, 2, 3, 4] // 思考: 为什么这次brr没有影响arr呢? ``` > 总结:, 因为brr逐级拷贝, arr的值到自己的内存中, 摆脱原来数组/对象带来的影响 深拷贝->克隆人关系, 互不影响 ![](https://box.kancloud.cn/a3adde6f76ea6c0d05c6e2a9ed20e306_1105x641.png) ***** 扩展: 项目中数组/对象常用深克隆方式 ``` function deepClone(obj){ // 判断参数是数组还是对象, 准备一个空的 let objClone = Array.isArray(obj) ? [] : {}; // 非空, 并且是对象 (array或者object的typeof都是object) if(obj && typeof obj === "object"){ // 遍历数组/对象 for(key in obj){ // 判断是否是当前对象的属性(防止复制原型链上的对象) if(obj.hasOwnProperty(key)){ //判断obj子元素是否为对象,如果是,递归复制 if(obj[key] && typeof obj[key] === "object"){ objClone[key] = deepClone(obj[key]); } else { //如果不是,简单复制 objClone[key] = obj[key]; } } } } return objClone; } ``` ***** 思考: 当数组里保存的是对象, 改变对象的值, 会不会影响数组里的对象, 举例: ``` var arr = [ { "name": "李东旭", "age": 20 } ]; for (var i = 0; i < arr.length; i++){ arr[i]['name'] = "程序员"; } console.log(arr); // 结果 里面的对象的name变成了"程序员" ``` ***** 答案: 这里是浅复制, 可以影响arr数组里的对象