首先看下面的js函數輸出什麼
function change ( o ) {
o.name = "abcd";
o = new Object();
o.name = "1234"
}
var obj= new Object();
change( obj );
console.log( obj.name );
如果你的答案是‘abcd’,那麼可以忽略下面了
咋一眼看上去,我的第一感覺是輸出 1234,但其實際的輸出爲 abcd
弄錯的原因:
認爲obj和o是同一個東西,即obj和o是內存中的同一塊地址,其實不然,obj和o是內存中兩塊不一樣的內存。這時可能會有人說,js的對象參數不是按引用傳遞的嗎?這樣obj和o不就是一樣了?
沒錯是按引用傳遞,但obj和o可以說一樣,也可以說不一樣。
一樣的點
obj和o指向(注意是指向)的是同一塊內存
不一樣的點
obj和o本質上是兩個不同的變量。
要理解上面的結果,首先得明白四個點
- 對象的創建過程
- 變量的複製過程
- 對象的賦值過程
- 參數的傳遞過程
1.對象的過程
執行下面語句時,其內存中變量的創建過程如圖所示
var obj= new Object();
即是創建了兩塊內存地址
變量的複製過程
例如執行以下語句,內存的執行的操作如下圖所示
a=5;
b=a;
而對象的複製過程一樣,知識裏面的5可以想象成是對象的內存地址
參數的傳遞過程
在參數傳遞的過程中,會複製一份所傳入變量的副本,執行以下語句時內存中的表現如下圖所示。
o=obj;
最後
由圖可以看出o和obj在內存中不是同一個內存地址,但是o和obj值指向的是同一個對象。
當執行 下面語句時,內存中表現爲如下圖所示
o.name = "abcd";
o = new Object();
o.name = "1234"
可見obj的name屬性沒有改變