当前位置: 首页 > news >正文

简单类型和对象的区别

简单类型:number、string、boolean、undefined、null、symbol

复杂类型(引用类型):object

要了解两者的区别,首先要知道内存。当打开浏览器的时候,浏览器会占用一些内存,浏览器会把这些内存分布给网页,网页再将内存分配给页面渲染器、网络模块、浏览器外壳和 JS 引擎(V8引擎)等。学习JS主要是研究JS引擎部分。JS引擎将得到的内存分成代码区和数据区。要了解简单类型和对象的区别,就研究数据区。在数据区分为栈内存(Stack)和堆内存(Heap)。简单类型的数据直接存在 Stack 里。复杂类型的数据是把 Heap 地址存在 Stack 里。

我们通过一些例子来了解一下:

var a = 1
var b = a
b = 2
复制代码

问a的值。

当执行到var b=a时,内存中可以表示为:

此时执行 b=2直接将 2 的值放在 b 的stack中,如:

b的改变并没有影响到a,a的结果还是1。

var a = {name: 'a'}
var b = a
b = {name: 'b'}
复制代码

问a.name的值。

从上图可知对于复杂类型,在栈(Stack)上存储的是一个地址,在堆(Heap)上存储的是数据。地址有指向关系。运行到 var b = a时,是将a中的addr1地址复制放到b的stack中。当运 行b = {name: 'b'}时是在heap中重新开出一块放置 {name: 'b'}且地址为2,并且b的地址更改为addr2。这个时候b指向addr1的作废,重新指向2。所以这个时候a还是原来的。即a.name的结果是"a"。

var a = {name: 'a'}
var b = a
b.name = 'b'
复制代码

问a.name的值。

当运行至var b = a时a和b的指向相同,此时运行b.name = 'b',更改了heap中地址1中的信息,如图所示。所以这个时候a.name的结果是"b"。

var a = {name: 'a'}
var b = a
b = null
复制代码

问a的值。

当运行至 var b = a时a和b的指向相同,这个时候运行 b = null(这是一个普通类型,直接将null的值在stack中给向b),所以导致b在heap中的指向消失并没有改变heap内存中数据。所以a的结果还是本身,即 {name: 'a'}

关于深拷贝和浅拷贝

var a = 1
var b = a
b = 2 //这个时候改变 b
a 完全不受 b 的影响
那么我们就说这是一个深复制
复制代码

对于简单类型的数据来说,赋值就是深拷贝。 对于复杂类型的数据(对象)来说,才要区分浅拷贝和深拷贝。

这是一个浅拷贝的例子,因为我们对 b 操作后,a 也变了。

var a = {name: 'frank'}
var b = a
b.name = 'b'
a.name === 'b' // true
复制代码

转载于:https://juejin.im/post/5c0be00f6fb9a049ea38c56c

相关文章:

  • Java基础之关键字
  • 作用域和名称空间
  • 云主机文件系统readonly处理案例
  • STM8S003F3通过PWM波实现三基色呼吸灯(转)
  • 前端技术周刊 2018-12-10:前端自动化测试
  • puppet连载22:define用法
  • Django2.0——请求与响应(下)
  • 华为敏捷DevOps实践:如何从Excel管理软件的方式中走出来
  • CentOS7配置Kubernetes(K8S)集群
  • Docker在Linux/Windows上运行NetCore文章系列
  • 使用Python将MongoDB数据导到MySQL
  • Rem之自适应js
  • ubuntu16.04下安装postgresql 10.3
  • Groovy与Java集成常见的坑
  • SQLserver视图修改sql
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • CSS相对定位
  • C学习-枚举(九)
  • HTTP那些事
  • JS学习笔记——闭包
  • mongodb--安装和初步使用教程
  • mysql innodb 索引使用指南
  • Phpstorm怎样批量删除空行?
  • python 学习笔记 - Queue Pipes,进程间通讯
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • Service Worker
  • vue-router的history模式发布配置
  • Vue组件定义
  • 产品三维模型在线预览
  • 高程读书笔记 第六章 面向对象程序设计
  • 关于Java中分层中遇到的一些问题
  • 基于组件的设计工作流与界面抽象
  • 目录与文件属性:编写ls
  • 如何在 Tornado 中实现 Middleware
  • 我建了一个叫Hello World的项目
  • 小程序开发之路(一)
  • 一份游戏开发学习路线
  • 优秀架构师必须掌握的架构思维
  • #mysql 8.0 踩坑日记
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (2)(2.10) LTM telemetry
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (二)构建dubbo分布式平台-平台功能导图
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?
  • @Autowired注解的实现原理
  • @property @synthesize @dynamic 及相关属性作用探究
  • [ 常用工具篇 ] AntSword 蚁剑安装及使用详解
  • [20150321]索引空块的问题.txt
  • [20180312]进程管理其中的SQL Server进程占用内存远远大于SQL server内部统计出来的内存...