在js函数的参数都是按值传递的吗?

在JavaScript中,函数的参数传递方式实际上是基于变量的类型来决定的。JavaScript中的数据类型大致可以分为两类:原始类型(Primitive Types)和对象类型(Object Types)。

  1. 原始类型(Primitive Types):这些类型包括NumberStringBooleanNullUndefinedSymbol(ES6新增)和BigInt(ES10新增)。当你向函数传递一个原始类型的值时,JavaScript会按值传递(Pass by Value)。这意味着函数内部对参数的任何修改都不会影响到函数外部的原始变量。
let x = 10;

function change(num) {
    num = 20;
}

change(x);
console.log(x); // 输出 10,不是 20

在这个例子中,x的值没有被change函数修改,因为numx的一个副本。

  1. 对象类型(Object Types):这些类型包括所有对象,如数组(Array)、日期(Date)、正则表达式(RegExp)以及自定义对象等。当你向函数传递一个对象时,JavaScript实际上是按引用传递(Pass by Reference)的“引用值”。这意味着函数内部和函数外部都引用了同一个对象,因此函数内部对对象的修改会影响到函数外部的对象。

然而,需要注意的是,尽管对象是按引用传递的,但如果你试图更改引用本身(即让引用指向一个新的对象),这种更改不会影响到函数外部的引用。这是因为引用的值(即内存地址)是按值传递的。

let obj = { value: 10 };

function change(o) {
    o.value = 20; // 修改对象属性,影响外部对象
    o = { value: 30 }; // 尝试更改引用本身,不影响外部对象
}

change(obj);
console.log(obj.value); // 输出 20,不是 30

在这个例子中,obj.valuechange函数修改为20,但是当我们尝试更改o以引用一个新对象时,这种更改没有影响到obj

综上所述,JavaScript中的参数传递方式可以视为“按值传递”,但对于对象类型,传递的是引用的值(即内存地址),而不是对象本身。这导致对象在函数内外的行为类似于“按引用传递”,但仅在修改对象属性时如此;如果尝试更改引用本身,则不会影响外部变量。

posted @   王铁柱6  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示