javascript引用傳參的坑

首先看下面的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屬性沒有改變

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章