javascript中的对象如何赋值而不是修改地址?

如题比如

<script type="text/javascript">
        a={
            q:1,
            w:2,
            e:3
        }
        b = a
        a.q='q'
        console.log(b.q)
</script>

如何让控制台输出的对象也是(我的意思是让赋值的时候不是修改b所指向的地址,而是将b的值赋给a)

{
    q:3,
    w:4,
    e:5,
}
阅读 6.3k
6 个回答

JavaScript的变量分成引用类型和基本类型。对象是引用类型的值,所以对对象的操作实际是操作对象的引用而不是操作实际的对象。所以b = a其实另b指向了a同一份内存空间,因此a.q其实也改变了b的q,输出的应该是‘q’.

写了个函数,看看还不是你想要的:

var a = {
     q:1,
     w:2,
     e:3
}

function copyAndModify(oldObj, name, value) {
    var newObj = oldObj;
    newObj[name] = value;
    return newObj;
}
var b = copyAndModify(a, 'q', 'q');

console.log(b);

DeepClone 是传统的做法,现在兴起的做法可以留意一下 Facebook 的 immutable.js,也有不少类似的。

有个笨办法是

var b = JSON.parse(JSON.stringify(a));

更靠谱的是_.clone_.cloneDeep

function extend(to, from) {
  for (var key in from) {
    to[key] = from[key];
  }
  return to;
};

var a = {
  q:1,
  w:2,
  e:3
};
var b = {};
extend(b, a);
a.q = 'q';
console.log(b.q)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏