javascript - 奇怪的 Javascript 数组同步技巧?

标签 javascript arrays html pointers

我发现了一个奇怪的 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/

相关文章:

html - 将 Bootstrap 与特定元素结合使用时出现问题

javascript - HTML5 Canvas 脏矩形错误问题

javascript - 使图表在 HighChart 中显示当前年份

javascript - 想要从javascript文件调用php文件

java - 使用 JSoup 从 HTML 中提取数据

asp.net - 尝试使用 vbscript 显示 SQL 数据库中的数据

javascript - 如何添加到 node.js 中的现有 json 文件

javascript - 将类重构为 React 中的功能组件

arrays - Google 工作表命名范围多列

php - array_merge 是否执行重建索引?