返回

ECMAScript 变量的奥秘:揭秘原始值与引用值的博弈

前端

在 JavaScript 中,变量是用来存储数据的容器,它可以存储各种类型的数据,包括数字、字符串、布尔值、对象等。在为变量赋值时,JavaScript 引擎必须确定这个值是原始值还是引用值。

原始值:
原始值包括 undefined、null、布尔值、数字和字符串。这些值直接存储在变量中,因此变量的值就是原始值本身。这意味着对原始值的任何修改都会直接影响变量的值。例如:

let x = 10;
x = x + 1; // x 现在等于 11

引用值:
引用值是指对象和数组。这些值存储在内存中,变量中存储的是指向这些值的引用。这意味着变量的值不是引用值本身,而是指向引用值在内存中的地址。对引用值变量的修改不会影响引用值本身,只会影响变量指向的值。例如:

let x = [1, 2, 3];
x[0] = 4; // x[0] 现在等于 4,但 x 仍然指向同一个数组

传值和传引用:
在函数调用时,JavaScript 会根据变量的类型决定是传值还是传引用。对于原始值,JavaScript 会在函数内部创建该值的副本,因此函数内部对变量值的修改不会影响函数外部的变量值。对于引用值,JavaScript 不会创建副本,而是将变量的引用传递给函数,因此函数内部对变量值的修改会影响函数外部的变量值。

以下代码演示了传值和传引用的区别:

function incrementPrimitive(x) {
  x = x + 1;
}

function incrementReference(x) {
  x[0] = x[0] + 1;
}

let a = 10;
let b = [1, 2, 3];

incrementPrimitive(a);
incrementReference(b);

console.log(a); // 10
console.log(b); // [2, 2, 3]

在第一个函数中,我们把原始值 10 传递给函数,函数内部对变量 x 的修改不会影响函数外部的变量 a。在第二个函数中,我们把引用值 [1, 2, 3] 传递给函数,函数内部对变量 x 的修改会影响函数外部的变量 b。

结论:
原始值和引用值是 ECMAScript 变量的重要概念,理解它们之间的差异对于编写正确和高效的 JavaScript 代码至关重要。原始值直接存储在变量中,而引用值存储在内存中,变量中存储的是指向这些值的引用。对原始值的修改会直接影响变量的值,而对引用值的修改只会影响变量指向的值。在函数调用时,JavaScript 会根据变量的类型决定是传值还是传引用。