我发现了一个奇怪的 JS 行为:
var myArray = [ [1] , [2] , [3] ];
var myArrayCopy = [];
myArrayCopy.push( myArray[1] );
alert( myArrayCopy ); // 2, as expected.
myArrayCopy[0][0] = 'foo';
alert( myArrayCopy ); // 'foo', as expected.
alert( myArray ); // 1, foo, 3 = WTF ? :)
参见 Demo .
请注意,如果我们直接推送值而不是数组,这将不起作用。
对我来说,这看起来像是将数组插入数组,以某种方式转换为好像我们只插入对这些数组的引用,而不是副本,(这不是人们期望的行为,如果我错了请更正)。
谁能解释一下为什么?
最佳答案
别名。
您在 myArrayCopy
中放入了对包含在 myArray
中的现有对象(数组)的引用。因此,当您修改该数组时,您正在修改从上述两个数组引用的实际对象。
请注意,当您在 JavaScript 中传递对象时,它们不会被复制,而是传递对实例的引用并在接收者范围内修改它会导致在调用者范围内修改对象以及。 此规则有一些明显的异常(exception)(例如原始类型,因为它们不是对象,或者字符串,因为它们实际上是在写入时复制的,等等),但让我们专注于您的问题。
考虑到数组是一个对象,它在下面的示例中发生相同,但从我的 Angular 来看它更清楚:
var o = { "foo": " bar" };
myArray[0] = o;
myArrayCopy[0] = myArray[0];
o.foo = "nolongerbar";
它返回什么 myArrayCopy[0].foo
?什么是 myArray[0].foo
?
这在大多数 OO 语言中称为别名,无论如何这是处理对象引用时的常见错误。
编辑
哦,无论如何这都不是同步技巧,它通常是恼人的错误背后的原因。 :-)
关于javascript - 奇怪的 Javascript 数组同步技巧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33750670/