JavaScript-原始值和引用值

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

在 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.cnblogs.com/xzybk/p/12523644.html

时间: 2024-11-08 21:31:16

JavaScript-原始值和引用值的相关文章

js中 原始值和引用值

在 ECMAScript 中,变量可以存在两种类型的值,即原始值和引用值. 原始值-----存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置; 引用值-----存储在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存处. 如果一个值是引用类型的,那么它的存储空间将从堆中分配.由于引用值的大小会改变,所以不能把它放在栈中,否则 会降低变量查寻的速度.相反,放在变量的栈空间中的值是该对象存储在堆中的地址.地址的大小是固定的,

ECMAScript 原始值和引用值

在 ECMAScript 中,变量可以存在两种类型的值,即原始值和引用值. 原始值和引用值 在 ECMAScript 中,变量可以存在两种类型的值,即原始值和引用值. 原始值 存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置. 引用值 存储在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存处. 为变量赋值时,ECMAScript 的解释程序必须判断该值是原始类型,还是引用类型.要实现这一点,解释程序则需尝试判断该值是否

原始值和引用值

在 ECMAScript 中,变量可以存在两种类型的值,即原始值和引用值. 原始值 存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置. 引用值 存储在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存处. 为变量赋值时,ECMAScript 的解释程序必须判断该值是原始类型,还是引用类型.要实现这一点,解释程序则需尝试判断该值是否为 ECMAScript 的原始类型之一,即 Undefined.Null.Boolean.

JS浅谈原始值与引用值操作

值的操作分为三大类:复制,传递,比较 一:复制 原始值 let a = 10; let b = a; 注释:2018-7-30 17:33:49 1 原始类型的值都是存放在栈内存当中,所以他们的赋值操作,其实相当于在栈内存开辟新的空间,然后将值的副本赋给新的内存,所以他们互不干扰 引用值 let obj = { name:'panrui' }; let obj1 = obj; 1 引用类型的值是存放在堆内存当中,栈内存中变量保存的只是一个堆内存的地址,所以赋值操作,也是开辟一个新的栈内存,然后将

javascript原始数据类型compareto引用数据类型--近3天不太会的地方

ECMAScirpt 变量有两种不同的数据类型:基本类型,引用类型.也有其他的叫法,比如原始类型和对象类型,拥有方法的类型和不能拥有方法的类型,还可以分为可变类型和不可变类型,其实这些叫法都是依据这两种的类型特点来命名的,大家爱叫啥就叫啥吧 o(╯□╰)o . 1.基本类型 基本的数据类型有:`undefined,boolean,number,string,null.基本类型的访问是按值访问的,就是说你可以操作保存在变量中的实际的值.基本类型有以下几个特点: 1.基本类型的值是不可变得: 任何方

javaScript的引用值和原始值的存放位置

在js中变量可以存放两种值也就是原始值和引用值 五大原始值:number String null  boolean undefind 引用值:例如 function arry  data  Object RegExp 原始值和引用值他们的存放位置是不一样的,原始值存放在栈内存中,而引用值存放在堆内存中 原始值的实例: 当我们定义了一个变量 例var  a = 123:然后再定义一个b将a赋予b :然后在改变a的值   a = 234 :分别alert弹出a ,b  .a的值是234 :  b的值

JavaScript 函数参数传递到底是值传递还是引用传递

tips:这篇文章是听了四脚猫的js课程后查的,深入的理解可以参看两篇博客: JavaScript数据类型--值类型和引用类型 JavaScript数据操作--原始值和引用值的操作本质 在传统的观念里,都认为JavaScript函数传递的是引用传递(也称之为指针传递),也有人认为是值传递和引用传递都具备.那么JS的参数传递到底是怎么回事呢?事实上以下的演示也完全可以用于Java 首先来一个比较简单的,基本类型的传递: function add(num){ num+=10; return num;

关于undefined,null,NaN,以及引用值的一点小记

在JavaScript中,undefined以及null同样是表示空值(没有实际意义). undefined == null; 事实上,上面这段代码的返回结果也是true,然后他们俩有什么区别吗,首先是语义上面的区别,undefind在JavaScript中表示的是已经声明了,但是没有赋值,相当于是对只是被声明了的状态的表示,是的没错,我更愿意把他理解为一种状态,而null就更像是一个值了,他表示的就是一个空,就是啥都没有,实际上也是一种状态(至少我是这么理解的). NaN也是一个比较有趣的值.

【我的OOP学习笔记】值与引用(2)语义类型

值与引用 值语义的对象是独立的,语义的对象却是允许共享的.由于Java不支持值类型对象,Java程序员才更需要加强这方面的意识.语法和语义并不总是一致的——语法上的值类型可能在语义上是引用类型,语法上的引用类型可能在语义上是值类型.永远不要忘记一个基本原则:语法只是手段,语义才是目的. 为了判断一个类型的语义,那么简明的‘石蕊测试法’便是一个很好的选择.在不影响程序正确性的前提下,一个对象的复件能否代替原件?如果可以则该对象的类型是值语义的,否则是引用语义的.(这种判断方法与语法无关,完全取决于