js中的值类型和引用类型

一、JavaScript中值的类型分为以下两种

**简单数据类型:**又叫值类型,基本类型。变量中存储的是值本身。其中包含:String(字符串)、Number(数值)、Boolean(布尔值)、Undefined、Null。

这里解释 Undefined和Null的区别:
null 表示“没有对象”,即该处不应该有值。典型用法是:(1)作为函数的参数,表示该函数的参数不是对象。(2)作为对象原型链的重点。
undefined 表示 “缺少值”,就是此处应该有一个值,但是还没有定义。典型用法是:(1)变量被声明了,但没有赋值时,就等于undefined。(2)调用函数时,应该提供的参数没有提供,该参数等于undefined。(3)对象没有赋值的属性,该属性的值为undefined。(4)函数没有返回值时,默认返回undefined。

**复杂数据类型:**又叫引用类型。变量中存储的仅仅是地址(引用)。其中包含:Array(数组)、Object(对象)、Function(函数)。

二、值类型和引用类型的区别

JavaScript中并没有严格意义上区分栈内存与堆内存。执行上下文的执行顺序借用了栈数据结构的存取方式。

在了解两者的区别之前,先看看堆和栈

堆栈空间分配区别:
  1. 栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。栈空间的特点是先进后出,后进先出
  2. 堆(操作系统): 存储复杂类型(对象),一般由程序员分配释放, 若程序员不释放,由垃圾回收机制回收。
两者区别如下:
1. 存储位置不一样

(1) 值类型的变量内部存储的是值本身,存储如下图
值类型的变量存储

(2) 引用类型的变量中存储的是指向对象的一个地址,存储如下图引用类型的变量存储

2. 复制方式不一样

这里不得又要引入深拷贝浅拷贝
浅拷贝:复制对象的属性值时,只复制第一层的属性值。如果遇到对象类的属性值,不会深入复制,即如果是复制类型的数据,只复制了地址。
深拷贝:复制对象的属性值时,如果遇到对象类的属性值,进行深入复制,不仅仅是复制地址。

(1)值类型的变量直接赋值就是深拷贝。如var a = 10; var b = a;   那么a的值就直接复制给b了,两个变量之间没有联系。
(2)引用类型的变量直接赋值实际上是传递引用,只是浅拷贝。如var p = new Person('zs',18,1000); var p1 = p;    赋值过程是将 p 的地址复制给 P1。两个变量的地址相同,指向的是同一个原型,不论通过哪一个变量更改了原型,都会在原型上发生更改,下次访问,都会发生变化。可参考上图引用类型的存储位置

3. 值类型无法添加属性和方法,引用类型可以添加属性和方法
4.两个变量之间的比较 == 和 ===

这里又要提一下 == 和 === 。
== 相等,只判断值大小是否相等,不判断数据类型。
=== 全等,不光判断值相等,还要判断数据类型相等

(1)值类型的比较是值的比较,只有当它们的值相等的时候它们才相等。
(2)引用类型的比较是引用地址的比较。

JavaScript 数据类型之间的转换

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值