js深浅拷贝-通俗易懂

127 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天.

  • Js基本数据类型: number string null undefined boolean
  • 引用类型: Array Object 网上说:基本类型的值在内存中占据固定的大小,被保存在栈内存中,引用类型值是对象,保存在堆内存中。 浅拷贝sliceconcatObject.assign...JSON.parse(JSON.Stringfy()) 只能浅浅的拷贝一层,第二层的引用关系还是存在的。

针对于JavaScript的对象和数组(数组也是对象)浅拷贝只是引用,内存不变;而深拷贝就是递归赋值。深拷贝是不同内存,相互独立。而浅拷贝会影响。

for...in 遍历对象,找出自身的属性,且会搜索原型,即也会查找原型上的属性
__proto__不可枚举的属性
obj.hasOwnProperty() 返回布尔值 判断属性是否是自有属性

深拷贝 递归

       function cloneDeep(obj) {
            if (obj === null) return null;
            if (obj instanceof RegExp) return new RegExp(obj.valueOf());
            if (obj instanceof Date) return new Date(obj.valueOf());
            if (obj instanceof Boolean) return new Boolean(obj.valueOf());
            if (obj instanceof String) return new String(obj.valueOf());
            if (obj instanceof Number) return new Number(obj.valueOf());
            if (typeof obj !== "object") {
                return obj;
            }
            let clone = new obj.constructor();
            for(let key in obj) {
                if(!Object.prototype.hasOwnProperty.call(obj, key)) continue;
                clone[key] = cloneDeep(obj[key]);
            }
            return clone
       }