浏览器控制台输出对象,这里面有多少坑你踩过?

1,027 阅读2分钟

好几天没有素材了,各位有什么奇怪的js现象需要解释清除的,欢迎留言哈。

我们先来看一段代码来介绍今天要将的现象吧

// ...
console.log(obj)

console.log(obj.a)
// ...

浏览器输出引用数据类型时.png

展开 obj 对象查看上面是包含 a 属性的且值为 1 ,为何输出 obj.a 的值却是 undefined 呢?

我们来看看全部的代码吧

let obj = {}

console.log(obj)
console.log(obj.a)

obj.a = 1

相信聪明的你已经知道了问题的原因,没错,这就是浏览器控制台输出引用数据类型的特性

  • 由于浏览器输出一个引用数据类型时,默认会异常掉其属性和方法详情,由此来节省输出的成本。

image.png

  • 当点击展开按钮(就是前面的三角形)时,获取其一级属性和方法的部分详情展示再控制台中

image.png

你没看错,就是在点击展开时才获取。所以打开展开按钮看到是数据不一定与输出时是一致的,而是与点击展开时的数据一致。

通过 console 调试时这很容易导致我们误判

我们来看看都有哪些情况容易出现这些错误吧

  • 在使用 ajax 异步请求时,在赋值请求结果前打印结果。这会让你误认为此时变了已经成功赋值。

  • 在动态渲染完子 DOM 元素之前通过父元素获取子元素数组。

还有很多很多情况,但是都是一个原因,那就是在对象或者数组被修改之前输出其值。

那么对于这些错误该如何避免呢?

其实只要避开引用类型调试就行了,例如数组输出其 length 值确定其是否有值,或者通过 JSON.stringify 将其转化为 JSON 字符串输出,也可以通过打断点的方式调试。