js对象的深浅拷贝

js对象的深浅拷贝

针对于JavaScript的对象和数组(数组也是对象)浅拷贝只是援用,内存稳定;而深拷贝就是递归赋值。
深拷贝是差别内存,互相自力。而浅拷贝会影响

//1.轮回复制数组
var arr = [1,2,3],arr2 = [];
for(var i=0;i<arr.length;i++) {
    arr2[i] = arr[i];
}

//2.还能够用一句简朴的代码完成上面的深拷贝:
Array.prototype.push.apply(arr2,arr);

//3.先把这个对象转化为字符串,在拷贝,再转化返来即可
JSON.parse(JSON.stringify(obj))

别急着走,应用window.JSON的要领做深拷贝存在2个 瑕玷:

  • 假如你的对象里有函数,函数没法被拷贝下来
  • 没法拷贝对象原型链上的属性和要领

比方下面这类状况:对象里包含函数

var o1 = {
    name:"小明",
    age:12,
    city:"广州",
    schools:["小学","中学","大学"],
    say:function(){
            alert(this.name);
    }
}

for…in 遍历对象,找出本身的属性,且会搜刮原型,即也会查找原型上的属性
__proto__不可枚举的属性

obj.hasOwnProperty() 返回布尔值 推断属性是不是是自有属性

JSON.parse(JSON.stringify(o1)) 能够将只要属性/不存在要领的对象复制
JSON.stringify 将对象转换成字符串,转换的历程,会疏忽掉要领.

//下面的要领能够完成 深深度复制(复制包含函数)

function deepClone(oldObj){
        var newObj = {};
        for(var key in oldObj){
                if(oldObj.hasOwnProperty(key)){
                        if(oldObj[key].constructor == Array){ //推断oldObj[key]值是不是数组/对象
                                newObj[key] = oldObj[key].slice();
                        }else if(oldObj[key].constructor == Object){
                                newObj[key] == deepClone(oldObj[key]);
                        }else{
                                newObj[key] = oldObj[key];
                        }
                }
        }
        return newObj;
}
var o2 = deepClone(o1);

固然,你明白晓得他们的瑕玷后,假如他的瑕玷对你的营业需求没有影响,就能够放心使用了,一行原生代码就搞定。
现在我在拓荒营业场景中,大多还真能够疏忽上面2个瑕玷。每每须要深拷贝的对象里没有函数,也不须要拷贝它原型链上的属性。

《js对象的深浅拷贝》

js客栈

因为js中的对象都是庞杂数据类型,这类数据在内存中存储的时刻,寄存在堆中。当简朴赋值的时刻,实际上是将该对象的指针指向同一个堆地点。
简朴的数据类型寄存在栈中,当对简朴的数据类型举行赋值的时刻,实在就是直接在栈中新拓荒一个处所特地存储一样的值。

数据结构里的客栈:
栈(stack): 由编译器自动分派, 寄存函数的参数值, 局部变量的值等. 其操纵体式格局类似于数据结构中的栈.
堆(heap): 平常由顺序员分派开释, 若顺序员不开释, 顺序结束时能够由OS接纳. 这里OS是指: 操纵系统(Operating System)

    原文作者:3_hours
    原文地址: https://segmentfault.com/a/1190000018322412
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞