使用console.log打印的内容不一定可信

在工作中遇到,使用console.log()输出对象信息时,出现输出的信息跟自己想的不一样的问题,导致调试bug时,思路走偏。
当时参考了别人的issues已经讲的很清楚了。
这里自己再记录一下

问题描述

即使我直接在赋值语句const obj = {age: 20}后面紧跟console.log(obj),
在浏览器的控制台,看到的也不一定的age字段,也不一定是20。

因为,如果在后面的代码中,修改了age字段的值,那控制太看到的就不是20了。

比如执行如下代码:

let obj = {age: 20};
console.log(obj);
obj.age = 30;

得到的输出如下:

可看到,不展开obj对象,看到的是我们预期的20,展开对象,看到的却是30

如果我们输出一个字段很多的对象,那必须展开才能看到属性值,就会被非预期的属性值误导。

原因分析

  • 不展开对象看时,console.log()是按照代码执行顺序,同步地输出了对象当时的快照。所以我们看到的是预期的值。
  • 展开对象时,它其实是重新去内存中读取对象的属性值,所以展开对象后,可能看到的不是预期值了。

浏览器或者开发者工具(F12)为什么出现这种情况?

这个问题,在《你不知道的javascript中卷》第二部分异步和性能1.1节一部控制台部分有提及:

There is no specification or set of requirements around how the console.* methods work -- they are not officially part of JavaScript, but are instead added to JS by the hosting environment (see the Types & Grammar title of this book series).
So, different browsers and JS environments do as they please, which can sometimes lead to confusing behavior.
In particular, there are some browsers and some conditions that console.log(..) does not actually immediately output what it‘s given. The main reason this may happen is because I/O is a very slow and blocking part of many programs (not just JS). So, it may perform better (from the page/UI perspective) for a browser to handle console I/O asynchronously in the background, without you perhaps even knowing that occurred.

翻译:

并没有什么规范或一组需求指定console.* 方法族如何工作——它们并不是JavaScript 正式的一部分,而是由宿主环境(请参考本书的“类型和语法”部分)添加到JavaScript 中的。因此,不同的浏览器和JavaScript 环境可以按照自己的意愿来实现,有时候这会引起混淆。
尤其要提出的是,在某些条件下,某些浏览器的console.log(..) 并不会把传入的内容立即输出。出现这种情况的主要原因是,在许多程序(不只是JavaScript)中,I/O 是非常低速的阻塞部分。所以,(从页面/UI 的角度来说)浏览器在后台异步处理控制台I/O 能够提高性能,这时用户甚至可能根本意识不到其发生。

结论

console.log()打印出来的内容并不是一定百分百可信的内容。一般对于基本类型number、string、boolean、null、undefined的输出是可信的。但对于Object等引用类型来说,则就会出现上述异常打印输出。

建议

  • 尽量不要直接输出对象,先将对象序列化JSON.stringify()为字符串再输出
  • 最好使用打断点(debugger)的方式来调试。

原文地址:https://www.cnblogs.com/wchaos/p/11529880.html

时间: 2024-11-03 18:22:46

使用console.log打印的内容不一定可信的相关文章

关于console.log() 打印得引用类型得数据得相关问题

console.log()打印出来得是这个引用类型最终得结果,而不是在打印得时候当前得值 var json = {a:1,b:2} console.log(json) json.a = 3; 如上  ,打印得将是  {a:3,b:2},而不是  {a:1,b:2} 解决方法,要么打断点,要么将需要输出得内容变成值类型输出

js console.log 打印 对像 数组 详解

console.log是什么东西,其实就是一个打印js数组和对像的函数而已,就像是php的print_r,var_dump.console.log这个函数本身没什么好说的,这篇博客告诉大家怎么去用这个函数.在说这个函数之前,我想大家用的最多查看js输出,是alert吧,但是alert,只能弹string或者是int的 一,测试文件test.html <html xmlns="http://www.w3.org/1999/xhtml"> <head> <me

去除console.log()打印语句

打印语句:console.log() ,一句话描述它! “用的时候感觉贼爽,不用的时候脑袋痛吧?” 以下提供两种解决方案: 一. webpack打包时去除,适合Vue项目 二. vscode正则匹配,手动去除 1. 拖放整个项目文件夹到vscode 2. 选中文件夹,然后编辑->在文件中替换 1. console.log()加了分号 console\.log\(.*?\); 2. console.log()没加分号 console\.log\(.*?\) 准备出一篇简单易懂的正则. 原文地址:h

移动端查看console.log打印的数据

vConsole 是一个由微信公众平台前端团队研发的 Web 前端开发者面板 <script src="https://cdn.bootcss.com/vConsole/3.2.0/vconsole.min.js"></script> <script> // 初始化 var vConsole = new VConsole(); console.log('Hello world'); </script> 最好放在head上初始化 原文地址:

console.log的使用

一.Console API Console.assert() 判断第一个参数是否为真,false的话抛出异常并且在console输出相应信息. Console.count() 以参数为标识记录调用的次数,调用时在console打印标识以及调用次数. Console.debug() console.log方法的别称,使用方法可以参考Console.log() Console.dir() 打印一条以三角形符号开头的语句,可以点击三角展开查看对象的属性. Console.error() 打印一条错误信

抛弃console.log(),拥抱浏览器Debugger

译者按: 切换成本真的不高,建议使用开发者工具来Debug! 原文:How to stop using console.log() and start using your browser's debugger 译者: Fundebug 为了保证可读性,本文采用意译而非直译.另外,本文版权归原作者所有,翻译仅用于学习. 在我成为一名开发者路上也掉进过一些坑,对于新手来说一个最大的挑战就是debug.刚开始,我一度认为在控制台下使用console.log()打印变量是最棒的方法.而实际上,这样做是

console.log() 在浏览器控制台输出特殊字符编码的图案

1.将图案变成字符形式 进入这个网站:http://picascii.com/ 该网站支持将图片生成 字符图案.(当然也可以使用别的工具) 选择一张图片,可以设置大小和是否显示颜色.这个需要大家自己调调,找找合适的照片和大小. 我们将 TEXT 中的内容复制出来. 2.对生成的字符图案进行处理 工具:Notepad++ 先设置一下: 效果:就将换行符显示出来了 将\r\n 都替换成为 \n 需要两步: 打开替换界面(快捷方式:ctrl+H) 由于不能直接替换成\n,我们先替换成a,等会再替换\n

javascript console.log() 带来的疑惑

这两天在写插件的时候无意间就被 console.log() 给坑到了. 看下面这个例子: var obj = {'k1':[1,2,3], 'k2':[2,3,4]} console.log( obj ) // {'k1':[0,2,3], 'k2':[2,3,4]} console.log( obj.k1 ) // [1,2,3] obj['k1'] = [0,2,3] console.log( obj ) // {'k1':[0,2,3], 'k2':[2,3,4]} console.log

console.log() 的一些妙用

以前在浏览网页的时候,打开F12,会在人家的网站看到一些有趣的东西,当时自己不知道什么原因,后来接触到了console.log(),才恍然大悟,先说下百度的效果(打开百度的搜索页面,按下F12,打开console,就可以看到了), 这里可以看到这些东西是百度特意呈现到我们面前的,分析它的源码,可以看到使用了三个console.log(),第一个console.log()的代码内容有些长,中间使用了换行符,达到了文字换行的效果,具体代码如下: 再看第二行,文字标红的那部分,那么它是怎样实现的呢,其