今天在整理Object.assign()时出现一个有意思的现象
let oT = {
a: 1,
arr: [1, 2, 3, 4]
}
let oT1 = Object.assign({}, oT);
console.log(oT); //{a:1,arr:[999,2,3,4];
console.log(oT1);//{a:1,arr:[999,2,3,4];
oT.arr[0] = 999;
console.log(oT1);//{a:1,arr:[999,2,3,4];
当时我看见这个输出就楞了,为什么输出的结果arr第一个元素怎么等于‘999’.我第一个想到是console.log()是不是异步操作。于是我又敲了几行代码
let arr = [1,2,3,4];
console.log(arr);//[1,2,3,4]
arr[0]=999;
console.log(arr);//[999,2,3,4]
这个输出结果就否认了console.log()不是异步输出。 对最前面的代码又进行了进一步的输出
let oT = {
a: 1,
arr: [1, 2, 3, 4]
}
let oT1 = Object.assign({}, oT);
console.log(oT); //{a:1,arr:[999,2,3,4];
// 这样输出结果就是 1
console.log(oT.arr[0]);//1
console.log(oT1);//{a:1,arr:[999,2,3,4];
oT.arr[0] = 999;
console.log(oT1);//{a:1,arr:[999,2,3,4];
这使得我很纳闷,我在node.js的环境下进行输出。结果是
console.log(oT); //{a:1,arr:[1,2,3,4];
于是我感觉是不是浏览器本身的缺陷查了一下资料。
其实在 console.log 执行的时候,chrome 会对 log 的对象求一次值,打印出来是 Object ,可以继续展开的。但当你展开控制台中的 Object 的时候,chrome 又会对它求一次值,这一次是显示它的属性。所以才会有前后打印的东西不一样的情况发生,因为对象引用的实体的值改变了。
最后结论是浏览器自身的原因跟代码和JavaScript没有关系。
参考资料