JavaScript中的值传递

变量的传递分为两种,分别是值传递和引用传递。

但是需要注意的一点是,在JavaScript中,只存在值传递,而不存在引用传递!!!这点非常容易迷惑人,于是总结如下:

先看例子

function changeStuff(a, b, c)
{
  a = a * 10;
  b.item = "changed";
  c = {item: "changed"};
}

var num = 10;
var obj1 = {item: "unchanged"};
var obj2 = {item: "unchanged"};

changeStuff(num, obj1, obj2);

console.log(num);
console.log(obj1.item);    
console.log(obj2.item);

这段代码的执行结果是

10
changed
unchanged

这个时候就有问题了。如果你说js是值传递吧?那么函数之外的obj1的item就应该不会被修改。但你要说js是引用传递吧?那么所有值都应该被修改,num变成100,obj2.item变成changed。

怎么回事呢?不是说js中只有值传递吗?可这看上去,既不像纯粹的值传递,也不像纯粹的引用传递啊?

答案是,js中的确是值传递,只不过引用类型传递进去的值是引用而已!!这种特性,在JavaScript中,被称作—— call-by-sharing.

所以出现会两种情况:

  • 改变引用类型的属性

当在函数中改变引用类型(如对象)的属性时,是在同一个内存地址区域进行操作,所以会在函数外反映出来。也就是上面的obj1

  • 直接对整体赋值

在函数内,对形参进行了重新复制,即改变了形参的引用,(内存中的地址已经改变),与实参引用已经完全不一样了,所以不会对函数外引用类型变量参数产生影响,也就是上面的obj2

一个很绕的总结:js中只存在传递引用,不存在引用传递!!!!

猜你喜欢

转载自blog.csdn.net/the__apollo/article/details/77427523