阿里19年一道JS填空题
题目是这样的,输出下列结果:
let a = {n:4};
let b=a;
a.x=a={n:2};
console.log(a.x);
console.log(b);
如果你能在30秒之内得出结果,且结果跟文章末尾结果一致,那不用浪费时间了,你基础掌握很好,这种就属于,会的很容易,不会的真难!
JS程序运行机制
1、我们知道浏览器要执行上面js代码,需要提供一个运行环境,当然现在的高级语言,执行时候提供的运行环境也大同小异。无非在内存中开辟堆栈内存,并由一个主线程在内存中按进栈出栈方式顺序执行代码语句。
2、首先看栈内存:它有两个作用,一是执行代码,二就是存储变量和基本类型值,那它就需要空间来存储这2个值,栈内存大概的结构看下图:
3、分析过程
有了上面的图,只要把代码一行一行的代入进去,例如看第一个语句执行:
let a = {n:4};
分三步来理解:定义一个变量a,取值一个对象类型(n:4),然后把a和对象类型做一个关联。对象类型不能在栈内存中存储,只能新增一个堆内存,然后把它的堆内存地址存储在值存储空间中,可通过地址AAAA找到堆内存中的对象。
看第二个语句:
let b=a;
定义一个变量b,使得b与a关联,a的地址是AAAA,那么让b指向AAAA即可
第三个语句:
a.x=a={n:2};
这里要说明一下,连等运算,在高等语言中都是拆开计算,例如 a = b=3,拆成 a = 3;b= 3;
好那上述代码就拆开成为:
a.x={n:2};
a={n:2};
看开头的理解变量定义过程:因为a是已经定义好的,所以无需再定义,但是n:2是新的对象类型值,所以又开辟一个堆内存空间地址假设为BBBB,然后让a.x关联新对象类型n:2。(a .x)可理解是给a增加一个x的属性。
最后把a指向新的对象BBBB(n:2),同时删除原指向AAAA的关联。最后关系如下图:
最终结果
有了上面的最终图,是不是就很容易得出答案了
console.log(a.x);
此时a指向BBBB的对象,此对象并没有x属性
所以它的结果为
undefined。
console.log(b);
此时b指向AAAA的对象,它最后有2个属性,一个是n,一个是x,n的值不变还是4,x的值指向BBBB的对象,值为n:2,所以结果为:
{n:4,x:{n:2}}
你做对了吗?阿里的题目还是一如既往的坑 ,但是通过画图并了解堆栈机制之后,还是很容易理清对象的关系。
如果本文对你有用,请加关注!后续会有更多的运维开发知识分享!
閱讀更多 程序不就是0和1 的文章