先看题后学习之JavaScript的内存空间及数据类型
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了先看题后学习之JavaScript的内存空间及数据类型,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2883字,纯文字阅读大概需要5分钟。
内容图文
?
看到这道题时候你会想到什么? 好多赋值啊~~~~ 从哪里入手啊!别怕,开始compiling
思考:
当看到这个题的时候,我们需要考虑到这个考察重点是哪方面,如这道题,从这5行中,大致可能想到:JS变量、赋值、数据类型
前两行中进行变量赋值,这就可以联想到js的数据类型和内存空间
数据类型
ECMAScript变量可以包含两种不同数据类型的值,分别是基本类型值和引用类型值
基本类型值:undefined、null、Boolean、Number、String、Symbol(ES6新添加);
引用类型值:Object
内存空间
内存空间可分为栈内存和堆内存,什么是栈内存,什么是堆内存呢
栈内存是存储一些简单,有固定大小的数据类型,读取数据速度快。如基本类型就是存在栈内存中,
堆内存是存储引用类型值,这些值通常偏大,且大小不固定,通常在通过指针指向存储在堆内存中的数据
??
如图中,基本类型的值存储在栈内存中,引用类型值,需要通过存储在栈内存的访问地址,通过这个指针访问堆内存中的数据
那复制变量值呢?
两种类型除了保存方式不一样,还有它们的复制变量值也是不一样的,上代码瞅瞅
1、基本类型值
?
代码中,首先将x赋值20,把x再赋给y,y也为20,。对y进行修改,x不变。下面通过图看看这个过程,画图可以解决很大困惑啊
?
总结下:基本类型的复制变量值操作是完全独立的,复制的是源变量的一个副本,在栈内存中新建一个内存空间存储,新变量和源变量二者是相互独立互不干扰,你走你的阳关道,我走我的独木桥。
接下来看看引用类型复制
2、引用类型
上码?
咦?奇怪了,怎么改变o1变量,o2也会变啊?,画个图解释下吧
??
1、复制引用类型的值时候,同样也会将存储在变量对象的值复制一份放到为新变量分配的空间中,但实际复制的是一个指针,这指针指向存储在堆内存中的一个对象。上左图中,o1赋值给o2,实际是复制了一个指针,o1和o2共同指向堆中的一个对象。
2、共享同一个堆内存中的对象的所有变量,改变其中一个变量,其他对象也会改变,如上右图中,当o1添加name为小明的属性后,o2的值也添加了name属性了
那如果其中一个变量重新赋值为基础类型值后,会有啥情况出现?
上码
?
当共享同一个堆内存中对象的全部变量中,有一个变量重新赋值为一个基本类型的值后,它将断开与堆内存中对象的引用
回到顶部,看看当初那道题
?
建议看看这个大神写的文章《连续赋值与求值顺序》,从中可以了解到,JavaScript的表达式的求值顺序都是从左向右的。赋值运算的结合性虽然是右结合,但同样是从左向右求值的。而且,js的运算符优先级:访问属性、调用方法运算符"."的优先级高于赋值运算符,可以把第3行代码看成 j.y = (j = {x: 30})
第1,2行代码:
?
第3行代码:
由于运算符"."的优先级高于赋值运算符,代码可以看成 j.y = (j = {x: 30}),第一个等号前面的 j 在js解析时,它始终是指向对象A的引用,先计算.的运算符,它的值恰恰是通过第一个等号后面这个运算返回的引用而已
??
最终,先是j 指针新对象B, 而这个操作返回的引用,又指向了原 j 中的y属性,也就是对象A
结果就是 i 为 { x:20, y: {x:30}}; j为{x:30}
个人理解,如有错误,欢迎指出。
内容总结
以上是互联网集市为您收集整理的先看题后学习之JavaScript的内存空间及数据类型全部内容,希望文章能够帮你解决先看题后学习之JavaScript的内存空间及数据类型所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。