在JavaScript中,函数的参数传递主要有两种方式:按值传递(pass by value)和按引用传递(pass by reference)。然而,需要注意的是,JavaScript中的对象(包括数组和函数)实际上是按引用传递的,但是这里的“引用”并非传统意义上的直接内存地址引用,而是传递了对象的引用副本。对于基本数据类型(如Number, String, Boolean, Null, Undefined, Symbol),JavaScript是按值传递的。
下面是一些代码示例,展示了如何在JavaScript中传递参数:
按值传递(基本数据类型)
javascriptfunction changeValue(x) {
x = x + 10;
console.log(x); // 输出:20
}
let num = 10;
changeValue(num);
console.log(num); // 输出:10
在上面的例子中,尽管我们在changeValue
函数内部改变了x
的值,但是原始的num
值并没有改变。这是因为基本数据类型是按值传递的,函数接收的是值的副本,而不是原始值的引用。
按引用传递(对象类型)
javascriptfunction changeObject(obj) {
obj.prop = 'new value';
console.log(obj.prop); // 输出:'new value'
}
let myObj = { prop: 'old value' };
changeObject(myObj);
console.log(myObj.prop); // 输出:'new value'
在这个例子中,我们修改了传递给changeObject
函数的对象的属性。由于对象是按引用传递的,所以原始对象myObj
的属性也被改变了。
然而,需要注意的是,尽管我们称这为“按引用传递”,但实际上JavaScript并没有直接传递对象的内存地址。相反,它传递的是对象在内存中的位置的引用副本。这意味着,如果你在函数内部改变了引用本身(例如,让它指向一个新的对象),那么原始的引用并不会受到影响。
javascriptfunction changeReference(obj) {
obj = { prop: 'another object' };
console.log(obj.prop); // 输出:'another object'
}
let myObj = { prop: 'old object' };
changeReference(myObj);
console.log(myObj.prop); // 输出:'old object'
在这个例子中,我们试图在changeReference
函数内部改变obj
的引用,使其指向一个新的对象。然而,这并没有影响到原始的myObj
对象,因为函数接收的只是对象引用的副本。