这可能是一个老问题,但我真的很好奇javascript中通过引用复制对象作为赋值的本质。
也就是说,如果
var a = {};
var b = a;
a.name = "Renato";
console.log(b);
Object {name: "renato"}
我对 JavaScript 还比较陌生,但这个默认使用浅拷贝来赋值对象引起了我的注意。我搜索了一下,发现如果要创建深拷贝,必须创建一个 mixin。我想知道为什么选择这个作为默认值,因为它的转换似乎非常隐晦。谢谢!
这可能是一个老问题,但我真的很好奇javascript中通过引用复制对象作为赋值的本质。
也就是说,如果
var a = {};
var b = a;
a.name = "Renato";
console.log(b);
Object {name: "renato"}
我对 JavaScript 还比较陌生,但这个默认使用浅拷贝来赋值对象引起了我的注意。我搜索了一下,发现如果要创建深拷贝,必须创建一个 mixin。我想知道为什么选择这个作为默认值,因为它的转换似乎非常隐晦。谢谢!
对象和数组被视为对同一对象的引用。如果想要克隆该对象,有几种方法可以做到。
在较新的浏览器中,您可以使用以下方法:
var b = Object.assign({}, a);
如果你想使用库,lodash 提供了 _.clone
(以及_.cloneDeep
):
var b = _.clone(a);
如果你不想使用上述两种方法,你可以遍历每个键和值,并将它们分配给一个新对象。
在多个函数中传递时,通常将它们视为引用是有价值的。但是对于像数字和字符串这样的基本数据类型来说,大多数情况下这并不可行,因为那样会感觉相当反直觉。
var b = JSON.parse(JSON.stringify(a))
- Keith{ a: 'b', c: function(){} }
,将其转换为字符串将会得到 "'{'a':'b'}'"
。 - Josh Beamlet b = {...a};
。看起来这在许多浏览器中还不被支持,所以只有在使用转译器(如babel)并且目标是ES5或更早版本时才应该这样做。 - AJ Richardson