標籤:

js 數組賦值問題 :值傳遞還是引用?

var a = [1,2,3];
var b = a;
a = [4,5,6];
alert(b); //[1,2,3]

面試時被問到這樣一個問題,竟然從來沒試過... 當時直接的理解,數組是引用類型,應該是傳遞的是引用,so b也是[4,5,6],於是錯了。js數組傳遞是跟基本類型一樣創建副本嗎?

我又做了如下測試:

var a = [1,2,3];
var b = a;
a.pop();
alert(b); //[1,2]

這樣好像又是引用傳遞了? 暈了


剛好寫了一片專欄文章來解釋這個問題,有代碼示例。

JS快閃:當面試官問你「按值vs按引用傳遞」時,面試官在問什麼- 知乎專欄


a = [4,5,6];//改變的是a引用本身,沒有改變數組對象
a.pop();//改變的是數組對象,a引用沒有改變。
b = a;//該操作後,b直接指向數組對象,不是b指向a,a再指向數組。
//所以改變a引用並不會對b引用造成影響,改變數組對象可以。


JavaScript 沒有運算符重載,數組和對象的賦值操作都是引用傳遞(作為函數實參時也是往函數內部傳一個引用地址的副本)。

var b = a; // b 指向 a 所指向的數組實例
a = [4,5,6]; // a 指向了新的數組實例
a.pop(); // a 指向的數組實例發生了 pop 操作


以前對於這個傳值還是引用一直都自認為理解的很好,但是今天才發現實際應用的時候,搞了很久的問題,竟然是這個

兩個數組 等號賦值 是引用傳遞的,如果兩個數組都沒有變更指向,那麼就是同步的操作


如果不適用jquery,請參考這篇文章:

實現JS數組的深拷貝

如果使用jQuery,請參考這篇文章:

jQuery數組操作、克隆、偽類選擇器


推薦閱讀:

在自學前端,但是沒有什麼實踐的資源,大家來推薦一下論壇或者別的可供練習的資源吧?
JS立即執行如何使用?還是說圓括弧本身是用來改變JS的執行上下文環境?
js 中,不使用數組,不使用對象,可以 return 多組值嗎?
TypeScript 的命運會不會和 CoffeeScript 一樣 ?
如何看待阿里開源的Rax框架?

TAG:JavaScript |