从一道面试题说起——js中的函数传参问题。

419 阅读1分钟

先上结论,js函数传参传递的是参数的拷贝,请牢牢记住这句话。接下来我们看具体的例子。

基本数据类型

let a = 123

let foo = (num) => {
    num = 456;
}

foo(a)
console.log(a);

image.png
很好理解,函数传入的是a的拷贝的值,所以a不会变化。

引用数据类型

let a = [1, 2, 3]

let foo = (obj) => {
    obj[1] = 999
}

foo(a)
console.log(a);

image.png a发生了变化,看起来传入的是a的地址指针,究竟是不是这样呢?我们再看一个例子。

let a = [1, 2, 3]

let foo = (obj) => {
    obj[1] = 999
    obj = [1, 1, 1]
    obj[0] = 111
}

foo(a)
console.log(a);

image.png
我们发现,将obj指向一个新对象时,a就不变了。这很好的说明了文章开头的那句话,传参传递的都是拷贝。所以参数是引用数据类型时,传入的是该引用数据类型堆地址指针的拷贝,就是现在有两个指针指向该对象,之后我们将拷贝的指针指向一个新对象后,当然就影响不到原对象了。

记录记录!