JS的参数传递示例介绍


在JavaScript中,参数传递主要遵循两种基本方式,但实质上它们都是基于值传递的。这里我将通过示例来解释这两种情况:

### 1. 基本数据类型(值传递)

对于基本数据类型(如`Number`、`String`、`Boolean`、`Undefined`、`Null`、`Symbol`以及`BigInt`),JavaScript在函数调用时传递的是这些值的副本。因此,在函数内部对参数的修改不会影响到函数外部的原始值。


function changeValue(x) {
    x = 10; // 修改的是x的副本
    console.log(x); // 输出: 10
}

let num = 5;
changeValue(num);
console.log(num); // 输出: 5,num的值没有改变

### 2. 引用数据类型(通过引用传递,但仍然是值传递)

对于引用数据类型(如`Object`、`Array`、`Function`等),JavaScript传递的是对象在堆内存中的地址的副本。这意味着函数内部和函数外部都指向同一个对象,但传递的是这个地址的副本。因此,如果在函数内部修改对象的属性,那么这些修改会反映到函数外部的对象上。但如果尝试重新给参数赋值(即指向一个新的对象),则这个新的赋值不会影响到函数外部的对象。


function changeObject(obj) {
    obj.prop = 'newValue'; // 修改obj的属性
    console.log(obj.prop); // 输出: newValue
    
    obj = {}; // 尝试重新赋值,但这不会影响到函数外部的obj
    obj.newProp = 'newPropValue';
    console.log(obj.newProp); // 输出: newPropValue
}

let myObj = {prop: 'oldValue'};
changeObject(myObj);
console.log(myObj.prop); // 输出: newValue,myObj的属性被修改了
console.log(myObj.newProp); // 输出: undefined,因为myObj没有被重新赋值

总结:JavaScript中的参数传递,无论是基本数据类型还是引用数据类型,都可以看作是值传递。对于引用数据类型,传递的是对象在内存中的地址的副本,允许函数内部和函数外部共享同一个对象,但重新赋值不会影响到原始对象。