这是一个修改array与console.log的问题
为什么console.log会输出在他后面才改变的数据结果?
let arr = [{id: 1}, {id: 2}];
console.log(arr); //输出: [{id: 666}, {id: 2}]
arr[0].id = 666;
代码执行顺序不是从上至下的吗?
为什么输出的会是修改后的值?
然后我再试了修改数组中的基本数据类型却不会这样.
let arr = [1, 2];
console.log(arr); //输出: [1, 2]
arr[0] = 666;
console.log(arr); //输出: [666, 2]
然后我又试了Object
let obj = {id: 1};
console.log(obj); //输出: {obj: 1}
obj.id = 666;
console.log(obj); //输出: {obj: 666}
数组中的对象就这么特殊吗? 比在前面的代码执行还快? 其中的原理究竟是什么?
其实这个问题找了很多地方都没找到,主要是问题也不太会表达. 类似的也搜不到, 答案一般都是教你怎么更改数组中元素这些操作.
但是这种关于输出修改顺序的问题却没有找到.
不过在Stack Overflow中我看到一个回答
说是数组中对象树的修改比console.log执行的快,因为是英文的, 翻译可能有点出入.
恳请各位大佬解答一下.
没有那么复杂,我估计是
console.log()
遇到对象时会默认展开并显示第一层,也就是你的第二段代码,如下:而对有两层属性的对象(或者说对象里又有一个子对象),
console.log()
并不会继续展开,你的第一段代码如下:你只能手动展开,手动展开的速度比代码修改内部属性的速度快是不可能的,所以等你手动展开时看到的是后来代码修改后的内容,如下:
但是如果
console.log()
非对象时,就不会出现这些问题了,如下:总结:chrome devtools 的 console 中
console.log
js 对象时会展开一层,如果这一层中还有对象则不会展开,只会展示类似{...}
或Array(2)
等样子,但会保存该子对象的引用,用于支持手动展开,手动展开的子对象的内容可能不是console.log()
父对象时的内容,而是展示时当时的内容。纯属个人多次尝试后的猜测,未经查阅相关资料,不保证专业性