JavaScript 参数对象按值传递问题

45 阅读1分钟

先来一道题:

const obj1 = {
    key: 'value1',
};

const obj2 = {
    key: 'value2',
};

function func1(obj1) {
    obj1.key = 'value11';
    return obj1;
}

function func2(obj2) {
    obj2 = {
        key: 'value22',
    };
    return obj2;
}

func1(obj1); 
func2(obj2);

console.log(obj1, obj2); //{key: 'value11'} {key: 'value2'}
console.log(obj2 === func2(obj2)); //false

为什么 obj1的值被改变了,而 obj2 的值不变呢?

究其原因!是因为 JavaScript 的函数参数的传递方式是按值传递,所以当一个对象被当做参数传递的时候,传给函数的是对象的地址。 此时,会在函数内部创建一个和形参同名的局部变量,比如 obj1,这时在函数外有一个 obj1,在函数内部有一个局部变量 obj1,他们是两个不同的变量,但是此时指向同一个地址,所以操作函数内部的局部变量obj1 的时候,也会修改到外部的obj1的值(刚刚说了,他们此时指向同一个地址!!)。

反观obj2,函数内部的局部变量 obj2 被赋值了一个新的对象,所以,obj2 指向的内部地址就变了!变成了被赋值的新对象的地址(就是这个对象的新地址{ key: 'value22',};),所以func2 只是改变了局部变量 obj2的指向,也就不会对外部obj 造成影响。