字节面试题分析
面试题如下:
请分析下边的代码输出什么?
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