淺克隆:不僅賦值,而且賦予了記憶體地址
深度克隆:賦值,記憶體地址不同 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]
這樣好像又是引用傳遞了? 暈了
答案:
a = [4,5,6];//改變的是a引用本身,沒有改變陣列物件 a.pop();//改變的是陣列物件,a引用沒有改變。 b = a;//該操作後,b直接指向陣列物件,不是b指向a,a再指向陣列。 //所以改變a引用並不會對b引用造成影響,改變陣列物件可以。
作者:Intopass
連結:https://www.zhihu.com/question/26042362/answer/31903017
來源:知乎
著作權歸作者所有,轉載請聯絡作者獲得授權。
