JS函数参数都是按值传递的!

本文解析了JavaScript中参数传递的原理,区分了基本类型与引用类型的传递差异,并通过具体示例展示了如何影响函数内外的对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

访问变量有按值和按引用两种方式,但参数只能按值传递

在向参数传递基本类型的值时,被传递的值会被复制给命名参数,即arguments对象数组的中一个元素。在向参数传递引用类型的值时,会把这个值在内存的地址传递给命名参数即函数内的局部变量,此时若局部变量变化则可以影响到函数外部。

基本类型传值比较好理解,下面给出一个书中引用类型传值的例子:

function setName(obj){
  obj.name="nick";
}
var person=new Object();
setName(person);
alert(person.name);    //"nick"

看起来似乎是把person对象整个传递给了参数,所以才导致了全局作用域中的对象变化,但其实person还是按值传递的,请看下面这个例子:

function setName(obj){
  obj.name="nick";
  obj=new Object();
  obj.name="greg";
}

var person=new Object();
setName(person);
alert(person.name);    //"nick"

分析以上代码,用反证法证明,假设person是按引用传递的参数,则在函数中name属性已经被赋值“greg”,所以结果应该为greg才对。

其实这正是因为person是按值传递的才会有这个结果,person传递进去的是person对象的地址,当参数传递进去后被object对象实例化,就指向了一个新object实例,不再是person原来的地址了,所以再赋值也不会影响到全局作用域中的person了。

所以person只是和setName.arguments[0]的值相同,或者指向同一个对象即地址相同,只是后者被看作为一个局部变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值