深究JavaScript

js中当对象作为参数传递?

2020-01-31  本文已影响0人  景元合

前沿

今天在写深拷贝时候,发现传递参数为对象时候,函数内修改参数,对应的对象也会跟着被修改,于是特意研究了一下参数为对象时候的机制。

案例一

let person={
    name:'zhangsan'
};
function setName(obj){
    obj.name='lisi'
}
setName(person);
console.log(person.name);//lisi

案例二

let person={
    name:'zhangsan'
};
function setName(obj){
    obj={
        name:'lisi'
    }
}
setName(person);
console.log(person.name);//zhangsan

案例一中把person传给setName,其实是把person的拷贝传递给obj,传递的是地址,此时obj与person公用一个内存地址,所以修改obj的name,person的name也会改变。
案例二中同样把person传给obj,obj新创建一个对象,测试obj与person是2个不同的对象,指向不同地址。因此修改obj,person不会改变。

为什么说‘ECMAScript 中所有函数的参数都是按值传递’。

基本类型就不说了。
对于引用类型,参数的传递是传递对象的引用副本。相当于传递了一份拷贝之后的新地址,这拷贝地址其实也可以理解为按值传递(也叫共享传递)了。

上一篇下一篇

猜你喜欢

热点阅读