前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JavaScript-原始值和引用值

JavaScript-原始值和引用值

作者头像
WEBING
发布2019-02-26 10:37:50
9420
发布2019-02-26 10:37:50
举报
文章被收录于专栏:前端の进行时前端の进行时

一、原始值和引用值的概念

在 ECMAScript 中,变量可以存在两种类型的值,即原始值引用值

1.1 原始值

(1)原始值指的是 原始类型 的值,也叫 基本类型,例如 Number、Stirng、Boolean、Null、Underfined 。

(2)存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置

(3)注意

在许多语言中,字符串都被看作引用类型,而非原始类型,因为字符串的长度是可变的。ECMAScript 打破了这一传统。

1.2 引用值

(1)引用值指的是 引用类型 的值,例如 Object、Function、Array、Date、RegExp 。

(2)存储在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存处

二、栈和堆

2.1 原始值存储在栈中

为变量赋值时,ECMAScript 的解释程序必须判断该值是原始类型,还是引用类型。要实现这一点,解释程序则需尝试判断该值是否为 ECMAScript 的原始类型之一,即 Undefined、Null、Boolean、Number 和 String 型。由于这些原始类型占据的空间是固定的,所以可将他们存储在较小的内存区域 - 栈中。这样存储便于迅速查寻变量的值。

2.2 引用值存储在堆中

如果一个值是引用类型的,那么它的存储空间将从堆中分配。由于引用值的大小会改变,所以不能把它放在栈中,否则会降低变量查寻的速度。相反,放在变量的栈空间中的值是该对象存储在堆中的地址。地址的大小是固定的,所以把它存储在栈中对变量性能无任何负面影响。

2.3 图示

栈中的原始值与堆中的引用值
栈中的原始值与堆中的引用值

三、原始值和引用值的不同

3.1 赋值方式

3.2 值是否可变

3.3 比较方式不同

四、赋值方式和值是否可变

4.1 原始值是以值的拷贝方式赋值,值是不可变的

4.2 引用值是以引用的拷贝方式赋值,值是可变的

4.3 Example

Example
Example

4.4 说明

(1)原始值赋值 → 其实是将值拷贝一份并赋值给新的变量,这个值就是副本,他和原始值是互相独立的,改变其中一个值不会影响到其他的值。

(2)引用值赋值 → 当一个引用类型,例如一个对象,使用 = 将其赋值给另一个变量,实际上是其对象的地址引用赋值给新的变量,这两个变量都指向同一个地址引用,他们有相同的地址。所以若改变其中一个变量(的地址引用指向的对象),另一个变量(的地址引用指向的同一个对象)也将改变。

图示
图示

4.5 扩展

Example
Example

五、比较方式不同

5.1 原始值的比较是 的比较

5.2 引用值的比较是 引用 的比较

5.3 Example

Example
Example

5.4 说明

(1)原始值 a 和 b 的数据类型不同,但也可以进行值的比较。(在值比较之前,自动进行了数据类型的 隐式转换

  • == → 只比较值
  • === → 不仅比较值,还比较数据类型

(2)引用值 obj1 和 obj2 分别引用的是存放在堆内存中的两个不同的对象,所以 obj1 和 obj2 的值(地址引用)不一样。

阅读更多

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、原始值和引用值的概念
    • 1.1 原始值
      • 1.2 引用值
      • 二、栈和堆
        • 2.1 原始值存储在栈中
          • 2.2 引用值存储在堆中
            • 2.3 图示
            • 三、原始值和引用值的不同
              • 3.1 赋值方式
                • 3.2 值是否可变
                  • 3.3 比较方式不同
                  • 四、赋值方式和值是否可变
                    • 4.1 原始值是以值的拷贝方式赋值,值是不可变的。
                      • 4.2 引用值是以引用的拷贝方式赋值,值是可变的。
                        • 4.3 Example
                          • 4.4 说明
                            • 4.5 扩展
                            • 五、比较方式不同
                              • 5.1 原始值的比较是 值 的比较
                                • 5.2 引用值的比较是 引用 的比较
                                  • 5.3 Example
                                    • 5.4 说明
                                    相关产品与服务
                                    对象存储
                                    对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
                                    领券
                                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档