函数的参数都是按值传递(浅拷贝)
变量有按值
访问和按引用
访问,传参只有按值
传递
函数外的值会被复制到函数内部的参数中,同一个变量复制到另一个变量中
如果是原始值,那么跟原始值变量复制一样(即另一个值)
如果是引用值,那么跟引用值变量复制一样(即另一个引用,这个引用可以修改外部对象的属性,但重写这个引用时并不会修改外部的值)
按值传递参数
值会被复制到一个局部变量(即命名参数)
function addTen(num) {
num += 10
return num
}
let count = 20
let result = addTen(count)
console.log(count) // 20
console.log(result) // 30
count
原始值直接复制一份到 num
中
function setName(obj) {
obj.name = "Nicholas"
}
let person = new Object()
setName(person)
console.log(person.name) // "Nicholas"
这里即使对象是按值传进函数,obj 也会通过引用访问对象
当函数内部给 obj 设置了 name 属性时,函数外部对象也会反映这个变化,因为 obj 指向的对象保存在全局作用域的堆内存上
function setName(obj) {
obj.name = "Nicholas"
obj = new Object()
obj.name = "Greg"
}
let person = new Object()
setName(person)
console.log(person.name) // "Nicholas"
如果 person 是按引用访问,则 person 会指向 name 为 Greg 的新对象。但这里并没有,因为函数参数的值改变之后,原始的引用仍然没变,当 obj 在函数内部重写时,会变成一个指向本地对象的指针。