最近在重新看js高级程序设计,对之查缺补漏,以后每次碰到值得记录的都会发文。
在了解参数传递的之前,首先要知道js复制引用类型和基本类型的区别。
复制基本类型
let a = '1'
let b = a
上述代码执行过程:
1.创建变量a、b。(变量提升)
2.将 ‘1’ 赋值给a。
3.复制一个 ‘1’ 给b。
4.a和b的值相互独立,互不影响。
复制引用类型
let a = {}
let b = a
a.name = 'dd'
console.log(b.name)
// 'dd'
当复制引用类型时,其实复制的是a指向对象(在堆内存中)指针。
所以a和b指向的是一个对象(在堆内存中)。
传递参数
了解引用类型复制的原理后,在来看js的参数传递。
js的参数传递是按值传递的。看个例子
function test(obj) {
obj.name = '李'
obj = {}
obj.name = '赵'
}
let person = {}
test(person)
console.log(person.name)
// ‘李’
别慌,一步一步分析。
1.前面说到js参数传递是按值传递的,但要注意的是,当参数是引用类型时,这个值其实指的是person指向对象的指针。当执行test函数时,把person指向对象的指针作为参数传入,即obj保存着person指向对象的指针,所以**obj.name = ‘李’**执行完毕后,person指向的对象发生改变。
2.**obj = {}执行完毕时,obj不在保存指向原对象(person指向的对象)的指针,而是保存另一个指向新对象的指针,所以obj.name = ‘赵’**对person没有影响。