资讯专栏INFORMATION COLUMN

JavaScript-原始值和引用值

EsgynChina / 830人阅读

摘要:一原始值和引用值的概念在中,变量可以存在两种类型的值,即原始值和引用值。二栈和堆原始值存储在栈中为变量赋值时,的解释程序必须判断该值是原始类型,还是引用类型。

一、原始值和引用值的概念
在 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

4.4 说明

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

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

4.5 扩展

五、比较方式不同 5.1 原始值的比较是 的比较 5.2 引用值的比较是 引用 的比较 5.3 Example

5.4 说明

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

== → 只比较值

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

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

阅读更多

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/93823.html

相关文章

  • JS语言核心——“词法结构及类型、变量”

    摘要:词法结构字符集字符集程序是用字符集编写的注释支持两种格式的注释单行注释另一个注释也是一个注释这是一个多行注释直接量直接量程序中直接使用的数据值标识符和保留字标识符就是一个名字,用来对变量和函数命名,或者用作代码中某些循环语句中的跳转位置的标 1 词法结构 1.1 字符集 字符集:JS程序是用Unicode字符集编写的 1.2 注释 js支持两种格式的注释 // 单行注释 /* 另一...

    Labradors 评论0 收藏0
  • JavaScript的深浅拷贝

    摘要:实际上,是禁止这样做的。传值和传址基本数据类型赋值基本数据类型的赋值是在内存中新开辟一段栈内存,然后再把再将值赋值到新的栈中。结果见输出,可以看出来,无论是修改赋值得到的对象和浅拷贝得到的都会改变原始数据。 存储问题:深拷贝和浅拷贝的主要区别:在内存中的存储类型(堆和栈)不同堆:动态分配的内存,大小不定也不会自动释放栈:自动分配的内存,由系统自动释放数据类型: 基本数据类型: jav...

    zhjx922 评论0 收藏0
  • 基础回顾-javascript数据类型

    摘要:栈区由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。属性返回对创建此对象的构造函数的引用。所有的和都是宿主对象参考高级程序设计堆和栈的概念和区别全面解析中的数据类型与类型转换 数据类型 数据类型划分 javascript中定义了6中基本数据类型(原始值类型),和一种复杂数据类型(引用类型),所谓复杂类型,其本质是由无序的名值对(key:val...

    codergarden 评论0 收藏0
  • 细说 Javascript 对象篇(二) : 原型对象

    摘要:并没有类继承模型,而是使用原型对象进行原型式继承。我们举例说明原型链查找机制当访问一个对象的属性时,会从对象本身开始往上遍历整个原型链,直到找到对应属性为止。原始类型有以下五种型。此外,试图查找一个不存在属性时将会遍历整个原型链。 Javascript 并没有类继承模型,而是使用原型对象 prototype 进行原型式继承。 尽管人们经常将此看做是 Javascript 的一个缺点,然...

    lansheng228 评论0 收藏0
  • 变量和作用域

    摘要:当代码在一个环境中执行时,会创建变量对象的一个作用域链,作用域链的用途,是保证对执行环境有权访问的所有变量和函数的有序访问。作用域链的下一个变量对象则来自下一个包含环境。 前言 JavaScript中变量是松散类型,这样它只在特定的时间内用于保存一个特定的值。由于不存在定义某个变量必须要保存何种数据类型的规则,变量的值和其数据类型可以在脚本的生命周期内改变。 1. 基本类型和引用类型的...

    Codeing_ls 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<