MST

星途 面试题库

面试题:JavaScript原始类型与引用类型在函数参数传递中的表现差异

在JavaScript函数调用时,原始类型和引用类型作为参数传递有何不同?请详细分析其原理,并通过代码示例展示如何利用这种特性来实现特定的功能,例如修改传入对象的值。
40.6万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

原始类型和引用类型作为参数传递的不同及原理

  1. 原始类型(Primitive Types)
    • 传递方式:按值传递(pass - by - value)。当原始类型(如numberstringbooleannullundefinedsymbol)作为参数传递给函数时,函数接收的是原始值的一个副本。对这个副本的任何修改,不会影响原始值本身。
    • 原理:原始类型的值存储在栈内存中,函数调用时,会将栈内存中的值复制一份传递给函数参数。
  2. 引用类型(Reference Types)
    • 传递方式:按引用传递(实际上在JavaScript中是按共享传递,pass - by - sharing,但在这种场景下表现类似按引用传递)。当引用类型(如ObjectArrayFunction)作为参数传递给函数时,函数接收的是对象在堆内存中的引用地址的副本。对通过这个引用地址访问到的对象内容进行修改,会影响原始对象。
    • 原理:引用类型的值,对象本身存储在堆内存中,栈内存中存储的是指向堆内存中对象的引用地址。函数调用时,栈内存中的引用地址被复制一份传递给函数参数,这两个引用地址指向同一个堆内存中的对象,所以对对象内容的修改会相互影响。

代码示例

  1. 原始类型参数传递示例
function changeNumber(num) {
    num = num + 1;
    return num;
}
let myNumber = 5;
let result = changeNumber(myNumber);
console.log(myNumber); // 输出 5,原始值未改变
console.log(result); // 输出 6,函数内副本改变
  1. 引用类型参数传递示例
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也会受到影响。