请问为什么上面的可以分别打印出不一样的,可以下面的两次结果都一样?下面的第一次不是应该是[{a:0}]


b=[]
for(i=0;i<2;i++){
b.push(i)
console.log(b)
}
//[0] [0,1]
b=[{},{}]
for(i=0;i<2;i++){
b[i].a=i
console.log(b)
}
//[{a:0},{a:1}] [{a:0},{a:1}]
阅读 2k
4 个回答

以下内容完全引自:《你不知道的javascript中卷》第二部分异步和性能 1.1 异步控制台部分

并没有什么规范或一组需求指定console.* 方法族如何工作——它们并不是JavaScript 正式
的一部分,而是由宿主环境(请参考本书的“类型和语法”部分)添加到JavaScript 中的。因此,不同的浏览器和JavaScript 环境可以按照自己的意愿来实现,有时候这会引起混淆。

尤其要提出的是,在某些条件下,某些浏览器的console.log(..) 并不会把传入的内容立即输出。出现这种情况的主要原因是,在许多程序(不只是JavaScript)中,I/O 是非常低速的阻塞部分。所以,(从页面/UI 的角度来说)浏览器在后台异步处理控制台I/O 能够提高性能,这时用户甚至可能根本意识不到其发生。

因为log打印出来的实际上是地址的引用,所以你再控制台展开的时候是会显示赋值之后的结果,因此你这里可以改成

b=[{},{}]
for(i=0;i<2;i++){
b[i].a=i
console.log(JSON.parse(JSON.stringify(b)))
}

1.console异步
2.引用类型

你这是不是看错了,下面那个第一次打印的是[{"a":0},{}] ,第二次打印的是[{"a":0},{"a":1}],没有问题啊!!??

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题