我发现了一个奇怪的JS行为:奇怪的JavaScript阵列同步技巧?
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。
请注意,如果我们直接使用值而不是数组,则这不起作用。
对我来说,它看起来像将数组推到数组中,翻译成某种方式,就好像我们只推送那些数组的引用,而不是副本,(这不是人们所期待的行为,如果我错了,请更正) 。
有人可以解释为什么吗?
数组传递给Ref,它不像你编辑一个ref,你正在编辑一个ref。你可以使用.slice()来获得一个具有相同值的新容器(浅拷贝) – dandavis
@dandavis - 你的评论在概念上是正确的,但不准确。在JavaScript中没有* byRef *这样的东西,但是传递一个对象(数组* *)会导致你描述的效果。 – Amit
没有争论的语义,在js中,它与可变/不可变的数字,字符串,布尔值是不可变的,因此通过值传递,而可变值,又名对象,作为对象引用传递。是迂腐的,objs在技术上并没有通过ref传递,它是一个指向ref的指针,通过值传递,但这只是令人困惑,其效果是传递“byRef”... – dandavis