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属性没有改变

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