📜  JavaScript 中的原始值和引用值(1)

📅  最后修改于: 2023-12-03 14:42:30.335000             🧑  作者: Mango

JavaScript 中的原始值和引用值

在 JavaScript 中,数据类型可以分为原始值和引用值。了解这两种类型的区别对于编写高效和正确的代码非常重要。本文将介绍原始值和引用值的概念,并探讨它们的一些相关特性。

原始值

原始值是 JavaScript 中最基本的数据类型,它们都是不可改变的。以下是 JavaScript 中的原始值类型:

  1. 数字(Number):表示数值。
  2. 字符串(String):表示文本。
  3. 布尔值(Boolean):表示真或假。
  4. null:表示一个空值。
  5. undefined:表示一个未定义的值。
  6. Symbol:表示唯一的标识符(ES6 新增)。

原始值在内存中被直接存储在栈内存中,并且比较两个原始值时,会根据其值来做比较。

例子
let number1 = 42; // 数字
let string1 = "Hello World"; // 字符串
let boolean1 = true; // 布尔值
let nullValue = null; // null
let undefinedValue = undefined; // undefined
let symbol1 = Symbol("foo"); // 唯一的标识符

console.log(typeof number1); // "number"
console.log(typeof string1); // "string"
console.log(typeof boolean1); // "boolean"
console.log(typeof nullValue); // "object" (这是一个历史遗留问题)
console.log(typeof undefinedValue); // "undefined"
console.log(typeof symbol1); // "symbol"
引用值

引用值是指将多个值组合在一起,形成一个对象。JavaScript 中的对象、数组和函数都是引用值。引用值在内存中存储在堆内存中,并且操作引用值时,实际上操作的是引用值在内存中的地址。

例子
let object1 = { name: "Alice", age: 25 }; // 对象
let array1 = [1, 2, 3]; // 数组
let function1 = function() { return "Hello World"; }; // 函数

console.log(typeof object1); // "object"
console.log(typeof array1); // "object"
console.log(typeof function1); // "function"
原始值与引用值的比较

当比较两个原始值时,JavaScript 会比较它们的值。如果值相同,则认为它们相等。

console.log(42 === 42); // true
console.log("hello" === "hello"); // true

而当比较两个引用值时,JavaScript 会比较它们的引用,即它们在内存中的地址。只有当两个引用指向同一个地址时,它们才被认为是相等的。

let object1 = { name: "Alice" };
let object2 = { name: "Alice" };

console.log(object1 === object2); // false,因为它们是两个不同的对象
传递原始值与引用值

当将原始值作为参数传递给函数时,函数内部的改变不会影响到原始值。因为原始值是不可变的,每次传递的是它们的副本。

function changeValue(value) {
  value = 10;
}

let number1 = 20;
changeValue(number1);
console.log(number1); // 20

而当将引用值作为参数传递给函数时,函数内部的改变会影响到原始对象,因为传递的是引用值在内存中的地址。

function changeValue(obj) {
  obj.name = "Bob";
}

let object1 = { name: "Alice" };
changeValue(object1);
console.log(object1.name); // "Bob"
总结

原始值和引用值是 JavaScript 中的两种不同的数据类型。原始值在栈内存中存储,比较时根据其值进行比较;而引用值在堆内存中存储,比较时根据其引用进行比较。在处理函数传递和操作数据时,需要注意原始值和引用值的不同特性,以避免不必要的错误。

参考链接:JavaScript数据类型