【发布时间】:2022-01-02 15:38:07
【问题描述】:
不知道如何解释这个问题。这里有一些非常简单的代码来演示它。
我希望 testValue 和 testValue2 是 [20, 21, 22],因为它们是通过引用传递而不是通过值传递的,据我所知,并且看起来像因为它们更新了.push() 方法。
有人知道这里发生了什么吗?为什么我们重新分配原始数组后,testValue 和 testValue2 似乎都开始按值传递?
let testArray = [1, [10, 11, 12], 3, 4, 5];
let testValue = testArray;
testArray.push(13);
testArray = [20, 21, 22];
console.log(testArray);
console.log(testValue);
//Different attempt
let testArray2 = [1, [10, 11, 12], 3, 4, 5];
let testValue2 = testArray2[1];
testArray2.push(13);
testArray2[1] = [20, 21, 22];
console.log(testArray2);
console.log(testValue2);
【问题讨论】:
-
只是为了澄清:“因为它们是按引用传递而不是按值传递” - JavaScript 总是按值传递。但如果是对象,它不是对象本身,它是指向对象的“指针”:Is JavaScript a pass-by-reference or pass-by-value language?
-
testValue有一个指向数组[1, [10, 11, 12], ...]的指针,testArray有一个指向数组[20, 21, 22]的指针。testArray2存储指向[1, [10, 11, 12], ... ]的指针,testValue2存储指向[10, 11, 12]的指针(intestArray2)。然后你只修改testArray2[1]指向intestArray2的数组,而不是testValue2的内容。 -
恕我直言,我的“澄清”评论中的问题将成为一个很好的欺骗目标......
-
感谢您的评论! “然后您只修改 testArray2[1] 在 testArray2 中指向的数组,而不是 testValue2 的内容” 是的,但是由于 testValue2 专门指向 testArray2 中的数组,它不应该也改变吗?那么为何不?它们指向同一个数组,对吧?
-
没有。
testValue2指向(是指向)A的引用。然后用B替换testArray2中的“数组”(它的指针)。但这不会改变testValue2的内容,它仍然指向(指向)A。
标签: javascript arrays reference