基本类型(也称为原始类型)
- number
- string
- boolean
- null
- undefined
- Symbol (唯一且不变的值,ES6引入)
引用类型(也称为对象类型)
- 对象(Object)
- 数组(Array)
- 函数(Function)
- 时间对象(Date)
- 正则表达式(RegExp)等。
基本类型的特点是它们是不可变的,即一旦创建就无法改变其值。每当对基本类型的变量进行赋值时,实际上是创建了一个新的值,并将其分配给该变量。这意味着基本类型的变量在赋值操作后会指向一个全新的值,原始值并没有被修改。
引用类型的特点是它们是可变的,可以修改其属性或元素。引用类型的变量存储的是对象或数组的引用,而不是实际的对象或数组本身。通过这个引用,我们可以访问和修改对象或数组的内容。当对引用类型的变量进行赋值时,实际上是将引用复制给了新的变量,这两个变量都指向同一个对象或数组。
两者区别:
- 存储方式
- 对于基本类型的变量,它的值是存储在栈内存中的。
- 对于引用类型来说,栈中存储的是指向该对象的内存地址(或者说对该对象的引用),而该对象的值是存储在堆内存中的。
- 赋值行为(或复制)
- 基本类型的赋值是复制值,其值会创建一个全新的独立的副本,修改时互不影响。
- 引用类型的赋值是复制引用,它实际上只是复制了一个指向堆内存中同一对象的引用,修改其中一个变量的属性会影响到另一个变量。
- 比较行为
- 基本类型是按值比较,只要值相等,就被认为是相等的。
- 引用类型按引用比较,只有当两个变量引用同一个对象时才被认为相等。(补充有详解)
- 可变性 (补充有详解)
- 基本类型不可变,一旦创建,值就不能被改变。
- 引用类型是可变的,可以修改对象的属性和方法。
- 传递方式
- 基本类型作为函数参数时,传递的是值的副本;
- 引用类型作为函数参数时,传递的是引用的副本。
补充
1. 解释:引用类型按引用比较,只有当两个变量引用同一个对象时才被认为相等。
在 JavaScript 中,引用类型的比较是按照引用进行的。这意味着当你比较两个引用类型的变量时,只有当它们引用同一个对象时才会被认为相等。
例如,考虑以下代码:
let obj1 = { name: "John" };
let obj2 = { name: "John" };
console.log(obj1 === obj2); // false
在这个例子中,我们创建了两个对象 obj1 和 obj2,它们具有相同的属性和值。然而,尽管它们的属性相同,但它们是两个不同的对象,因此它们的引用不同。所以,当我们使用 === 运算符比较它们时,结果为 false。
另一方面,如果两个引用类型的变量引用同一个对象,那么它们被认为是相等的。例如:
let obj3 = { name: "John" };
let obj4 = obj3;
console.log(obj3 === obj4); // true
在这个例子中,我们将 obj3 的引用赋值给了 obj4。由于它们引用同一个对象,所以它们被认为是相等的。因此,当我们使用 === 运算符比较它们时,结果为 true。
需要注意的是,对于基本类型(如字符串、数字和布尔值),它们的比较是按值进行的,而不是按引用。这意味着当两个基本类型的变量具有相同的值时,它们被认为是相等的。
总结起来,引用类型的比较是按照引用进行的,只有当两个变量引用同一个对象时才会被认为相等。而基本类型的比较是按值进行的。
2. 解释:可变性
在 JavaScript 中,基本类型(也称为原始类型)包括字符串、数字、布尔值、null 和 undefined。这些基本类型是不可变的,意味着一旦它们被创建,就无法改变其值。
当你对一个基本类型的变量进行赋值时,实际上是创建了一个新的值,并将其分配给该变量。例如:
let x = 5;
x = 10; // 创建一个新的值 10,并将其分配给变量 x
在这个例子中,变量 x 最初被赋值为 5,然后通过赋值操作创建了一个新的值 10,并将其分配给 x。原始值 5 并没有改变,而是被丢弃了。
相比之下,引用类型(如对象和数组)是可变的。当你创建一个引用类型的变量时,实际上是创建了一个指向存储在内存中的对象的引用。这意味着你可以修改对象的属性或数组的元素。
let obj = { name: "John" };
obj.name = "Jane"; // 修改对象的属性
let arr = [1, 2, 3];
arr[0] = 4; // 修改数组的元素
在这个例子中,我们可以看到对象 obj 的属性 name 被修改为 “Jane”,数组 arr 的第一个元素被修改为 4。这是因为引用类型的变量存储的是对象的引用,而不是对象本身。通过这个引用,我们可以访问和修改对象或数组的内容。
总结起来,JavaScript 中的基本类型是不可变的,一旦创建就无法改变其值。而引用类型是可变的,可以修改其属性或元素。