变量
原始值和引用值
原始值
- 最简单的数据,按值访问,存储变量中的实际值
无序列表 2
- 多个值构成的对象,按引用访问,访问的是引用,而非对象本身
引用值是保存在内存中的对象,js不允许直接访问内存位置,不可以直接操作对象所在的内存空间。
复制值
- 原始值复制:两变量完全独立,互不影响
- 引用值复制:复制的只是指针,指向堆中内存的对象
传递参数
ECMAScript中所有函数都是按值传递的,意味着函数外的值被复制到函数内部的参数中,像从一个变量复制到另一个变量一样。
按值传递参数:值会被复制到一个局部变量(即一个命名参数,就是槽位arguments中的一个)
按引用传递参数: 值在内存中的位置会被保存在一个局部变量中(显然这在ES中不存在)
例:
function addTen() {
num += 10
return num
}
let count = 20
let result = addTen(count)
console.log(count) // 20
console.log(result) // 30
function setName() {
obj.name = 'NiNi'
}
let person = new Object()
setName(person)
console.log(person.name) // NiNi
解析: person对象传给setName()方法,被复制到参数obj中,在函数内部,obj与person都指向同一个对象。
上面的例子很容易让人觉得 传参是按照 引用 传递的,下面则可以证明不是按照引用传递的
function setName(obj) {
obj.name = 'Ni'
obj = new Object()
obj.name = 'Gi'
}
let person = new Object()
setName(person)
console.log(person.name) // Ni
表明函数中的参数值改变后,原始的引用不变。当obj被重写,它变成了一个指向本地对象的指针,函数执行完之后就销毁了。对person无影响。所以传参是按值传递的。