大厂一道笔试题,彻底掌握堆栈机制分析方法

之前写个类似的一道阿里一道笔试题目,详细请看下面链接:


这次再来一道类似题目,这次彻底掌握堆栈分析方法,其实答案不重要,重要的是分析方法,因为类似题目的变化很多,只有会分析,才能举一反三。

大厂一道笔试题,彻底掌握堆栈机制分析方法



例题很简单:

<code>let n =[10,20];
let m =n;
let x =m;
m[0] =100;
x=[30,40];
x[0]=200;
m=x;
m[1]=300;
n[2]=400;
console.log(n,m,x);/<code>

分析过程:

1、老规矩,画出万能的堆栈运行图,不清楚的看文章开头的链接


大厂一道笔试题,彻底掌握堆栈机制分析方法

2、有了上面的图,只要把代码一行一行的代入进去,例如看前三个语句执行情况:

<code>let n =[10,20];
let m =n;
let x =m;/<code>


因为数组类型是复杂类型,所以在堆内存中存储,栈内存存储该对象的地址AAAA,前三个为赋值语句,很简单,三个变量同时指向AAAA。数组类型在堆中存储为 2个数值,第一个数为10,下标从0开始,第二个数为20,下标为1。

备注:内存中执行语句总是一条一条执行,执行完成出栈,这里为了直观,所以把语句都保留。

大厂一道笔试题,彻底掌握堆栈机制分析方法

3、执行语句

<code>m[0] =100;/<code>

m指向AAAA地址所在的对象,并且把第一个元素值改为100.

大厂一道笔试题,彻底掌握堆栈机制分析方法

4、继续执行

<code>x=[30,40];
x[0]=200/<code>

重新生成一个复杂数组对象,并让x指向该对象,如下图:


大厂一道笔试题,彻底掌握堆栈机制分析方法

5、执行最后3个语句

<code>m=x;
m[1]=300;
n[2]=400;/<code>

这里注意点:m指向x对应的BBBB对象,所以m[1]由原来的40改为300,n[2]属于AAAA地址对应的对象,原来只有2个值,现在相当于增加一个新值400。

大厂一道笔试题,彻底掌握堆栈机制分析方法

所以最后的值为:

<code>console.log(n,m,x);
n->[100,20,400]
m=x->[200,300]/<code>

你做对了吗?这些都是大厂高频的基础题 ,但是通过画图并了解堆栈机制之后,还是很容易理清对象的关系。

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


分享到:


相關文章: