之前写个类似的一道阿里一道笔试题目,详细请看下面链接:
这次再来一道类似题目,这次彻底掌握堆栈分析方法,其实答案不重要,重要的是分析方法,因为类似题目的变化很多,只有会分析,才能举一反三。
例题很简单:
<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>
你做对了吗?这些都是大厂高频的基础题 ,但是通过画图并了解堆栈机制之后,还是很容易理清对象的关系。
如果本文对你有用,请加关注!后续会有更多的运维开发知识分享!
閱讀更多 程序不就是0和1 的文章