JS 基本类型和引用类型区别

基本类型(也称为原始类型)

  • 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 中的基本类型是不可变的,一旦创建就无法改变其值。而引用类型是可变的,可以修改其属性或元素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值