字节面试题分析

面试题如下:

请分析下边的代码输出什么?

var foo = { bar: 1 };
var arr1 = [ 1,2,foo];
var arr2 = arr1.slice(1);
arr2[0]++;
arr2[1].bar++;
foo.bar++;
arr1[2].bar++;
console.log(arr1[1] === arr2[0]);
console.log(arr1[2] === arr2[1]);
console.log(foo.bar);

针对这种类型的题,我们只需要一步一步来分析每个步骤之后对象的变化,跟踪变化来得到最终的结果:

foo  ——>地址1

arr1 ——>地址2

arr2 ——>地址3

地址1:{bar:1}

地址2:{

  0:1

  1:2

  2:地址1

}

地址3:{

  0:2

  1:地址1

}

先列出每个对象的值或者指向地址,如上。再来进行赋值分析:

arr2[0]++;     所得结果为->地址3:{ 0:3, 1:地址1 }

arr2[1].bar++;  所得结果为->地址1:{bar:2}

foo.bar++;  所得结果为->地址1:{bar:3}

arr1[2].bar++;  所得结果为->地址1:{bar:4}

因此,最终结果为:

arr1 = [1,2,{bar:4}]

arr2 = [3,{bar:4}]

foo = {bar:4}

综上,输出为:false  true 4

 
posted @ 2024-02-26 10:16  icon-icon  阅读(6)  评论(0编辑  收藏  举报