js原始值和引用值的区别

1,473 阅读2分钟

原始值和引用值

  • 原始值就是最简单的数据,引用值就是由多个值构成的对象 在js中无法直接访问内存位置,因此无法直接操作对象所在的内存空间,所以在操作对象的时候其实在操作对象的引用。原始值中不可以添加属性(添加之后不报错,但是访问的时候返回undefined),引用值可以动态的随时添加删除属性。

值复制

  • 除了储存方式不同之外,原始值和引用值在变量复制也不同
  • 原始值
  • 引用值
    var a = 1   //原始值
    var b = a 
    a = 2 
    console.log(b) //1
    var obj = {a: 1}  //引用值
    var obj2 = obj 
    obj2.a = 2
    obj2 = null
    console.log(obj) // {a: 2}
    

传递参数

  • ECAMSript中所有的函数都是按值传递的。这意味着函数外部的值会复制到函数内部的参数中。类似值复制。
  • 在按值传递参数的时候,值会复制到一个局部的变量中。在按引用传递参数的时候。值在内存中的位置会被保存到一个局部变量中,这就意味着在函数内部修改会影响到外部的变量。
function add(item) {
item += 1
}
let a = 2
add(a) 
console.log(a) //2 没有变化

这说明原始值在进行函数传参的时候确实是值传递。

  • 再看引用类型传参
let a = {
name: 'zhangsan'
}
function add(obj) {
obj.name = 'lisi'
}
console.log(a) // {name: 'lisi' } // 改变了

这个例子中发现好似在引用类型传参的时候确实是引用传递。因为他改变了外部的值。但是

let a = {
name: 'zhangsan'
}
function add(obj) {
obj = new Object()
obj.name = 'lisi'
}
console.log(a) // {name: 'zhangsan' } // 没有改变

这个例子中证明了在js中参数传递中确实都是值传递。可以理解为,在进行函数参数传递的时候,形参 = 实参 这个遵循着js中的值复制规则。