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