面试题答案
一键面试原始类型和引用类型作为参数传递的不同及原理
- 原始类型(Primitive Types):
- 传递方式:按值传递(pass - by - value)。当原始类型(如
number
、string
、boolean
、null
、undefined
、symbol
)作为参数传递给函数时,函数接收的是原始值的一个副本。对这个副本的任何修改,不会影响原始值本身。 - 原理:原始类型的值存储在栈内存中,函数调用时,会将栈内存中的值复制一份传递给函数参数。
- 传递方式:按值传递(pass - by - value)。当原始类型(如
- 引用类型(Reference Types):
- 传递方式:按引用传递(实际上在JavaScript中是按共享传递,pass - by - sharing,但在这种场景下表现类似按引用传递)。当引用类型(如
Object
、Array
、Function
)作为参数传递给函数时,函数接收的是对象在堆内存中的引用地址的副本。对通过这个引用地址访问到的对象内容进行修改,会影响原始对象。 - 原理:引用类型的值,对象本身存储在堆内存中,栈内存中存储的是指向堆内存中对象的引用地址。函数调用时,栈内存中的引用地址被复制一份传递给函数参数,这两个引用地址指向同一个堆内存中的对象,所以对对象内容的修改会相互影响。
- 传递方式:按引用传递(实际上在JavaScript中是按共享传递,pass - by - sharing,但在这种场景下表现类似按引用传递)。当引用类型(如
代码示例
- 原始类型参数传递示例:
function changeNumber(num) {
num = num + 1;
return num;
}
let myNumber = 5;
let result = changeNumber(myNumber);
console.log(myNumber); // 输出 5,原始值未改变
console.log(result); // 输出 6,函数内副本改变
- 引用类型参数传递示例:
function changeObject(obj) {
obj.property = 'new value';
return obj;
}
let myObject = { property: 'old value' };
let modifiedObject = changeObject(myObject);
console.log(myObject.property); // 输出 'new value',原始对象被修改
console.log(modifiedObject.property); // 输出 'new value'
在上述引用类型的示例中,函数changeObject
接收myObject
的引用地址副本,通过这个副本修改对象属性,原始对象myObject
也会受到影响。