ECMAScript中所有函数的参数都是按值传递的
变量有按引用和按值访问,但是参数只能按值传递
按值传递时,值会被复制到一个局部变量(就是arguments的一个槽位).
基本数类型
function addNum(value) { //num的值复制到value,在函数内使用,互不影响
value+=10
return value
}
let num=10
let result= addNum(num)
console.log(num,result);//10,20
引用数据类型
function setName(obj) {
obj.name = 'xiaohua'
}
let person = { name: 'liming' }
setName(person)
console.log(person);//'' {name: "xiaohua"}
function setName(obj) {
obj.name = 'xiaohua'
obj = {}
obj.name = "huahua"
//如果person是按引用传递,那么name应当被修改,但是并没哟偶
//这表明函数中参数的值改变后,原始的引用person依然没有改变
}
let person = { name: 'liming' }
setName(person)
console.log(person);//'' {name: "xiaohua"}
console.log(person.valueOf());// {name: "xiaohua"}
在函数内部obj与person指向同一个对象,所以,即使对象是按值传递进函数的,obj也会通过引用访问对象.
而且obj指向的对象保存在全局作用域的堆内存上,所以会为person添加name
let person = { name: 'liming' }
function changeName(obj) {
obj={sex:'girl'}
console.log(obj);// {sex: "girl"}
}
changeName(person)
console.log(person);
// {name: "liming"}