JavaScript

JavaScript 知识量:26 - 101 - 483

3.1 原始值与引用值><

原始值和引用值- 3.1.1 -

JavaScript中的数据可以分为原始值(primitive values)和引用值(reference values)。

原始值是简单的数据,不能被进一步分解。它们包括:

  • Number:例如,123。

  • String:例如,"hello"。

  • Boolean:例如,true。

  • Null:没有值,只有一个null。

  • Undefined:未定义,没有值。

  • Symbol:这是一种全新的数据类型(在ES6中引入),它总是唯一的,并且不能被重新使用。

  • BigInt:这是一种可以存储任意大整数的类型,它在JavaScript中是全新的(在ES2020中引入)。

引用值是复杂的数据类型,它们在内存中占据多个位置,并且可以通过引用来访问。引用值包括对象(Object)和数组(Array)。

在JavaScript中使用等号(=)时,实际上正在将一个原始值赋给另一个变量,或者将一个引用值赋给另一个变量。在第一种情况下,只是简单地复制了原始值;在第二种情况下,复制了引用值。这意味着,如果改变了引用值的一个变量,那么所有引用这个值的变量都会看到这个变化。例如:

let a = 10;  // a 是一个原始值  
let b = a;   // b 现在也包含 10  
a = 20;     // a 现在指向 20,但 b 仍然指向原来的 10  
  
let obj1 = {x: 10};  // obj1 是一个引用值  
let obj2 = obj1;  // obj2 现在也引用了 obj1 指向的对象  
obj1.x = 20;  // obj1 和 obj2 现在都引用了修改后的对象

在上面的例子中,当改变 a 的值时, b 的值没有改变,因为 a 和 b 存储的都是原始值。然而,当改变 obj1 引用的对象的属性时, obj2 引用的对象也发生了改变,因为 obj1 和 obj2 存储的都是对同一个对象的引用。

参数的传递- 3.1.2 -

在JavaScript中,原始值(primitive values)和引用值(reference values)在函数调用中传递参数时的主要区别在于如何处理变量的值。

1. 原始值(Primitive Values):

原始值包括数字(如123)、字符串("hello")、布尔值(true或false)、null、undefined、Symbol和BigInt。当将这些原始值传递给函数时,它们实际上是被复制到函数的作用域中,而不是在函数外部的原始值。这意味着,函数内部对传入参数的任何改变,都不会影响到外部的原始值。例如:

function modifyPrimitive(num) {  
  num = num * 2;  
  console.log(num); // 输出:20  
}  
  
let value = 10;  
modifyPrimitive(value);  
console.log(value); // 输出:10

在上述例子中,modifyPrimitive函数试图将传入的原始值num乘以2,但这个改变并没有影响到函数外部的原始值value。

2. 引用值(Reference Values):

引用值主要是指对象(如数组和函数)和Symbol。当将这些引用值传递给函数时,实际上传递的是对象的引用,而不是对象本身的副本。这意味着,函数内部对传入参数的任何改变,都会影响到在函数外部的原始对象。例如:

function modifyObject(obj) {  
  obj.prop1 = 'newValue';  
}  
  
let obj = { prop1: 'originalValue' };  
modifyObject(obj);  
console.log(obj.prop1); // 输出:'newValue'

在上述例子中,modifyObject函数改变了传入的对象obj的一个属性值。这个改变影响了函数外部的对象。

总的来说,原始值在传递时会被复制到函数作用域,而引用值在传递时则是传递了对象的引用。这就是为什么原始值在函数调用中是按值传递,而引用值在函数调用中是按引用传递的原因。

确定类型- 3.1.3 -

typeof操作符最适合用来判断一个变量是否为原始类型。typeof 操作符是一个基本的操作符,它可以返回一个表示变量类型的字符串。例如,如果变量是字符串类型,typeof会返回"string";如果是数字类型,会返回"number";如果是对象类型,会返回"object";如果是布尔类型,会返回"boolean";如果是null,会返回"object";如果是undefined,会返回"undefined"。如果变量是函数或数组,那么typeof将返回"function"。

var myVar = "hello";  
console.log(typeof myVar);  // 输出 "string"