“最简单的” console.log,你真的懂吗?

简介: 在这篇文章中,我想和你简单说说,在浏览器中 console.log 一些看起来不符合预期的表现,了解其背后的原因,以避免开发排错时不必要的困惑。

作者:UC 国际研发 江焘

image.png

前言

提起 console.log 方法,我们再熟悉不过了,许多初学者从第一行 console.log('Hello World') 开始学习 JavaScript(Say Hello to the world),但是有些时候 console.log 又显得有点“陌生”。

在这篇文章中,我想和你简单说说,在浏览器中 console.log 一些看起来不符合预期的表现,了解其背后的原因,以避免开发排错时不必要的困惑。

思考和观察

首先,新建 demo.html 文件,复制下方代码到文件中。

image.png

然后,以 4 种不同的步骤进行测试(所用浏览器为 Google Chrome)。

Case A
1.在 Chrome DevTools 保证关闭的状态下,使用 Chrome 浏览器打开 demo.html 文件。

2.观察控制台打印结果。

Case B

1.在 Chrome DevTools 保证打开的状态下,使用 Chrome 浏览器打开 demo.html 文件。

2.观察控制台打印结果。

Case C

1.打开 DevTools 的控制台。

2.拷贝下方代码到控制台中运行。

image.png

3.观察控制台打印结果。

Case D
1.打开 DevTools 的控制台。

2.拷贝下方代码到控制台中运行。

image.png

3.观察控制台打印结果。

Result

公布结果之前,建议大家可以先行思考一下答案,看看自己的答案和控制台结果是否一致呢?

image.png

尝试分析

不知道上面四种输出结果和你心中预期是否一致哈。

不管如何,看到 ABCD 四种结果,我们先不去看浏览器的 console.log 实现原理,来尝试分析一下:

1.面对情况 A,假设从来没有写过 console.log,猜测它是同步代码或者异步代码中的一种。那根据结果来看,我暂定 console.log 是异步执行的代码。

2.基于情况 A,再思考下情况 B。按照前面的猜测,console.log 应该是异步的,那为什么打印出来的结果看上去是浏览器会同步执行 console.log 方法呢?好吧,情况 A 初始状态是关闭 DevTools 的,而情况 B 初始状态是打开。继续猜测只有打开 DevTools 的情况下,console.log 才是同步执行。

3.根据前面的猜测,看到情况 C 觉得符合预期。

4.再看情况 D,又不符合预期了。打开 DevTools 的情况下,不是应该同步执行 console.log 的吗?再琢磨一下,打印出来是一个可以展开的对象,猜测展开它的时候,chrome 又会对它求一次值,这一次是显示它的属性。

了解原理

根据刚刚的尝试分析,我们发现一个头疼的问题:很难预测 console.log 打印出来的值会不会被 console.log 之后其他代码影响。

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

罗列出这四种情况,不是为了让读者去记忆各种不符合预期的情形。因为,并没有什么规范指定 console.log 方法如何执行(参阅 MDN console.log),它由宿主环境添加到 JavaScript 中。到底什么时候控制台 I/O 会延迟,甚至是否能够被观察到,这都是不确定的。因此非常不建议根据经验去判断浏览器中 console.log 的表现。

同时提一下,node 中 console.log 的表现和浏览器表现不一致,官网文档明确警告:

Warning: The global console object's methods are neither consistently synchronous like the browser APIs they resemble, nor are they consistently asynchronous like all other Node.js streams. See the note on process I/O for more information.

调试排错

开发中遇到 bug,思路清晰地去解决它是成功的第一步。

在浏览器中使用 console.log 遇到问题,了解原因,至少在下一次你想用 console.log 的时候,就可以做到心中有数。

对于经常使用 console.log 来排错的同学,可以考虑在遇到特殊情况的时候,使用更有效更快速的打断点调试方法。具体可以查阅《在 Chrome DevTools 中调试 JavaScript 入门》。

相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
目录
相关文章
|
7月前
|
消息中间件 供应链 前端开发
如何开发WMS系统中的销售管理板块(附架构图+流程图+代码参考)
仓库管理系统(WMS)中的销售管理模块是企业高效处理订单、发货及退货的关键环节。本文详解该模块的功能设计、业务流程、开发技巧与实现效果,并提供代码示例,助力企业打造高效销售管理体系。
|
机器学习/深度学习 人工智能 安全
AI与网络安全:防御黑客的新武器
在数字化时代,网络安全面临巨大挑战。本文探讨了人工智能(AI)在网络安全中的应用,包括威胁识别、自动化防御、漏洞发现和预测分析,展示了AI如何提升防御效率和准确性,成为对抗网络威胁的强大工具。
|
JavaScript 前端开发
我为展开收起功能做了动画,被老板称赞!
【8月更文挑战第23天】我为展开收起功能做了动画,被老板称赞!
593 1
我为展开收起功能做了动画,被老板称赞!
|
机器学习/深度学习 人工智能 算法
转载:【AI系统】AI系统概述与设计目标
本文介绍了AI系统全栈架构,涵盖AI系统的设计目标、组成和生态,强调了系统性能、用户体验、稳定性及开源社区运营的重要性。文章详细解析了AI系统的基本概念、定义及其设计挑战,旨在为读者构建AI系统知识体系,助力AI技术的全面发展。通过对比传统软件和云计算架构,阐述了AI系统在连接硬件与应用间的独特作用,探讨了高效编程语言、开发框架和工具链的设计,以及AI任务的系统级支持,包括计算能力的扩展、自动编译优化、云原生自动分布式化等方面,为应对AI技术的新挑战提供了全面视角。
|
前端开发 Java
Java HotSpot(TM) 64-Bit Server VM warning
Java HotSpot(TM) 64-Bit Server VM warning
5215 1
|
定位技术 API 开发工具
iOS语言本地化/国际化宝典
iOS语言本地化/国际化宝典
989 0
iOS语言本地化/国际化宝典
|
机器学习/深度学习 人工智能 搜索推荐
【颠覆传统】解锁记忆新姿势:多模态AI单词助记神器——让单词学习变得生动有趣,打造个性化学习新体验!
【8月更文挑战第21天】多模态AI单词助记模型融合文本、语音与图像,增强英语单词记忆效果。设计上利用多感官刺激提升信息处理与记忆效率。技术栈包括React.js前端、Node.js后端、PyTorch深度学习框架等。实现过程涵盖数据准备、前端开发、后端服务搭建、深度学习模型构建及用户反馈循环。应用显示该模型显著提高学习兴趣与记忆效率,尤其对视觉和听觉学习者有益,个性化推荐系统进一步优化学习体验。
678 0
|
算法 C语言 C++
万字详解:C语言三子棋进阶 + N子棋递归动态判断输赢(一)
三子棋游戏设计的核心是对二维数组的把握和运用。
335 1
|
前端开发 JavaScript 机器人
详解《基于 javascript 的流程图编辑框架LogicFlow
详解《基于 javascript 的流程图编辑框架LogicFlow
3167 0
|
前端开发 API 开发工具
Python实现post请求小红书笔记详情数据接口
Python实现post请求小红书笔记详情数据接口