你知道吗,其实console.log是有“BUG”的!

103 阅读1分钟

一、概述

很多前端开发喜欢用console.log来调试代码,经验丰富的前端开发应该碰到过这个问题,console.log打印出来的值并不是实际代码中运行的值,今天我们来详细看看是什么问题。

二、“BUG”重现

首先我们准备这样的一个测试代码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<script>
    let tempArr = [{ n: 1 }, { n: 1 }]
    console.log(tempArr)
    tempArr[0].n++
    console.log(tempArr)
</script>

<body>
</body>

</html>

运行代码后,浏览器调试界面应该输出的是[{ n: 1 }, { n: 1 }] 和 [{ n: 2 }, { n: 1 }], 但是实际运行结果

三、原因

其实这个是浏览器的一个特性,针对复杂的对象,浏览器会将打印输出的结果进行折叠,像这样子

image.png

在我们第一次查看详情时(点击左侧小黑三角形),浏览器会去获取对象当前实时的一个值,所以会显示的是代码 tempArr[0].n++运行之后的对象了, 不单单是这个小三角形,就连对象内部的小三角形也是一样的原理,第一次查询详情时,会实时获取当前的值,可以看看下方的例子。

123.gif

四、结尾

大家知道原理以后就可以知道为什么会出现这个问题,当然最后还是推荐断点调试来的更方便、稳妥。

每天学习一个小知识,敬请关注公众号:小明科技说