前沿
今天在写深拷贝时候,发现传递参数为对象时候,函数内修改参数,对应的对象也会跟着被修改,于是特意研究了一下参数为对象时候的机制。
案例一
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 中所有函数的参数都是按值传递’。
基本类型就不说了。
对于引用类型,参数的传递是传递对象的引用副本。相当于传递了一份拷贝之后的新地址,这拷贝地址其实也可以理解为按值传递(也叫共享传递)了。
网友评论