变量: 原始值与引用值

106 阅读2分钟

变量

原始值和引用值

  • 原始值

    • 最简单的数据,按值访问,存储变量中的实际值
  • 无序列表 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无影响。所以传参是按值传递的。