我發現了一個奇怪的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