var a = [1,2,3,4,5,6]; var b = a; a = [“你”,”我”,”他”]; alert(b); //[1,2,3,4,5,6] 當被朋友問到b顯示的值是什么時?這樣一個問題,當時直接的理解,數組是引用類型,應該是傳遞的是引用值,so b也是[“你”,”我”,”他”],于是錯了。js數組傳遞是跟基本類型一樣創建副本嗎?
于是,我又做了如下測試:
var a = [1,2,3,4,5,6]; var b = a; a.length–; alert(b); // [1,2,3,4,5];
這樣好像又是引用傳遞了? 暈了?。?!
后面反復思考推敲,原理如下: a = [“你”,”我”,”他”];//改變的是a引用本身,沒有改變數組對象 a.length–;//改變的是數組對象,a引用沒有改變 b = a;//該操作后,b直接指向數組對象,不是b指向a,a再指向數組。 //所以改變a引用并不會對b引用造成影響,改變數組對象可以。
圖示:
例如:
1.var a = [1,2,3,4,5,6];
2.var b = a;
3.a = [“你”,”我”,”他”];
4.console.log(b);
此時b為多少呢?
b = [1,2,3,4,5,6];
為什么此處a的改變不會是b發生變化?關鍵問題是第3行語句的理解。
首先第一行,a引用數組[1,2,3,4,5,6],不妨先假設數組[1,2,3,4,5,6]地址為A或0x1001(內存隨機分配的); 第二行,var b = a;應理解為,b引用了a當前的指向地址,即b指向地址A,即數組[1,2,3,4,5,6]。 第三行,a = [“你”,”我”,”他”];為修改a的指向地址,使a指向數組 [“你”,”我”,”他”],不妨設其地址為B或0x1009。 所以,最終結果為,b指向地址A,數組[1,2,3,4,5,6],a指向地址B,數組 [“你”,”我”,”他”]; 其實,只要理解清楚,對數組變量的操作,實質為修改數組本身數據,還是修改變量的地址,則將一目了然。
舉個例子:
arr = [1,2,3,4];
arr.pop();//此處操作為修改arr指向的數組本身。結果為arr = [1,2,3];
//a.pop(); <=> a.length–;
//pop() 方法將刪除 arrayObject 的最后一個元素,把數組長度減 1,并且返回它刪除的元素的值。如果數組已經為空,則 pop() 不改變數組,并返回 undefined 值。
newArr = arr;//此處操作為賦予newArr指向arr所指向的地址,即數組[1,2,3]。
arr = [4,5,6];//此處操作為使arr指向新數組[4,5,6],arr指向新數組地址。
console.log(arr);//此處arr = [4,5,6]
console.log(newArr);//newArr = [1,2,3];
最后,一言以蔽之,關于數組變量的操作,應關注變量所指向地址的數組,以及操作所修改的為哪個地址的數組。
新聞熱點
疑難解答