阿里的一道笔试题,错误率极高,但了解堆栈机制后,秒变送分题


阿里的一道笔试题,错误率极高,但了解堆栈机制后,秒变送分题



阿里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}}


你做对了吗?阿里的题目还是一如既往的坑 ,但是通过画图并了解堆栈机制之后,还是很容易理清对象的关系。

如果本文对你有用,请加关注!后续会有更多的运维开发知识分享!


分享到:


相關文章: