在JavaScript中,函数的参数传递方式实际上是基于变量的类型来决定的。JavaScript中的数据类型大致可以分为两类:原始类型(Primitive Types)和对象类型(Object Types)。
- 原始类型(Primitive Types):这些类型包括
Number
、String
、Boolean
、Null
、Undefined
、Symbol
(ES6新增)和BigInt
(ES10新增)。当你向函数传递一个原始类型的值时,JavaScript会按值传递(Pass by Value)。这意味着函数内部对参数的任何修改都不会影响到函数外部的原始变量。
let x = 10;
function change(num) {
num = 20;
}
change(x);
console.log(x); // 输出 10,不是 20
在这个例子中,x
的值没有被change
函数修改,因为num
是x
的一个副本。
- 对象类型(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.value
被change
函数修改为20,但是当我们尝试更改o
以引用一个新对象时,这种更改没有影响到obj
。
综上所述,JavaScript中的参数传递方式可以视为“按值传递”,但对于对象类型,传递的是引用的值(即内存地址),而不是对象本身。这导致对象在函数内外的行为类似于“按引用传递”,但仅在修改对象属性时如此;如果尝试更改引用本身,则不会影响外部变量。
标签:20,函数,对象,js,传递,引用,change,按值 From: https://www.cnblogs.com/ai888/p/18638435