javascript对象应用

存在一个旧的对象:old={num:1}
如果此时定义一个变量new,并且零new = old;
那么当我通过改变new.num = 2的时候,old对象里面的num也变了。
问题来了:以上的场景如何做到在改变new对象num的值的时候,old对象的num保持不变?
简单代码:

var a = {
            x:1
        };
    console.log(a);
    var b = a;
    b.x = 2;
    console.log(a);
    console.log(b);

代码执行效果图:
图片描述

阅读 3.7k
5 个回答

最简单的方法是使用 Object.create()函数。
clipboard.png

对象是引用类型,当你执行 new = old 时,是把 old 对象的引用赋给 new,也就是说它们指向同一块内存地址,或者说同一个「对象」。

要实现值的复制,比较直观的一个方法是枚举 old 的属性赋值给 new

const new = {};
for (key in old) {
    new[key] = old[key];
}

ES6 提供了更简单的方法

const new = Object.assign({}, old);

你要的是对象深拷贝的方法:

function isArray (obj) {
    return Object.prototype.toString.call(obj) === '[object Array]';
}
// 深度克隆
function deepClone (obj) {  
    if(typeof obj !== "object" && typeof obj !== 'function') {
        return obj;
    }
    var o = isArray(obj) ? [] : {}; 
    for(i in obj) {  
        if(obj.hasOwnProperty(i)){ 
            o[i] = typeof obj[i] === "object" ? deepClone(obj[i]) : obj[i]; 
        } 
    } 
    return o;
}

然后可以使用deepClone进行拷贝。

var oldObj = { num:1 };
var newObj = deepClone(oldObj);
newObj.num = 2;
console.log(oldObj)

如果仅仅担心b会改变a的话用Object.create就可以解决问题。但是这也意味着如果在做完Object.create后立即改a的prop会导致b的对应prop一起改变。因为本质上还是同一个prop,因为Object.create相当于:

b = new Object();
b.__proto__ = a;

注意

var a = {x: 1};
var b = Object.create(a);
console.log(b.__proto__ === a); // true

a.x = 2;
console.log(b.x); // 2

如果想要避免这个问题,最好需要需要自己写一个clone()函数。Stackoverflow上有一个比较好的样本,看最高票的那个答案(https://stackoverflow.com/que...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题