先看题后学习之JavaScript的内存空间及数据类型

 

看到这道题时候你会想到什么? 好多赋值啊~~~~ 从哪里入手啊!别怕,开始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}

          个人理解,如有错误,欢迎指出。

转载于:https://www.cnblogs.com/runningQiang/p/10053758.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值