console.log是异步还是同步?为什么console.log有时候不准

news2024/9/23 7:27:12

console.log是异步还是同步

    在前端开发中,控制台console.log通常是同步的。这意味着,当代码执行到console.log语句时,它会立即写入到控制台中,并且JavaScript代码执行会在console.log完成后继续进行。

    但是,在某些情况下,console.log也可以是异步的。例如,当使用Node.js中的console对象时,console.log实际上是一个异步方法,因为它使用了底层的文件系统API将日志信息写入I/O磁盘。在这种情况下,console.log将不会立即写入控制台,而是会被添加到一个输出缓冲区中,然后在Node.js事件循环的下一个迭代中异步写入I/O磁盘

    总的来说,大多数情况下,在前端代码或者浏览器在控制台输出console.log是同步的,但要根据具体情况确定它是同步还是异步。

        你可能有疑问为什么控制台输出有时候不准,慢慢来,看完就懂了

为什么console.log有时候不准

    在前端开发中,console.log有时候可能会出现不准确的情况,这通常是由于以下原因之一:

  1. 对象引用:如果console.log输出一个对象或数组,那么它实际上输出的是该对象数组引用引用地址)。所以就会存在当打印对象的时候,当引用到对象中的值的时候,对象中的值已经发生变化了的情况,会导致打印结果与预期不一致。
            举个例子
//控制台输出例子:引用地址控制台输出1
let d = {
    u:{
        p:1,
        h:2
    }
}
console.log("第一次",d);   //1期望值 d.u.p =1 ; d.u.h =2 ;

d.u.p = 10;
d.u.h = 20;

console.log("第二次",d);   //2期望值 d.u.p =10 ; d.u.h =20 ;

        输出结果如下图(“引用地址控制台输出第一张”):

引用地址控制台输出第一张
        可以看出控制台输出的引用地址对象信息在第一次,第二次的结果一样,和我们想要的期望值不一致

//控制台输出例子:引用地址控制台输出2
let d = {
    u:{
        p:1,
        h:2
    }
}
console.log("第一次",JSON.stringify(d));   //1期望值 d.u.p =1 ; d.u.h =2 ;

d.u.p = 10;
d.u.h = 20;

console.log("第二次",JSON.stringify(d));   //2期望值 d.u.p =10 ; d.u.h =20 ;

        输出结果如下图(“引用地址控制台输出第二张”):

引用地址控制台输出第二张
        可以看出控制台输出使用JSON.stringify在第一次,第二次的结果输出和我们想要的期望值一致

        为什么使用JSON.stringify就一致了,因为例子1在控制台显示的还是引用地址,例子2在控制台显示的是string字符串

        console.log没有立即拍摄对象快照,只存储了一个指向对象的引用(引用地址),如下(MDN对console.log的描述)

MDN对console.log的描述
        总结:
        当引用中的值改变了,在控制台也会随即改变,console.log显示就会有出入,解决方法是确保始终记录对象的序列化快照 字符串显示(JSON.stringify),例如使用console.log(JSON.stringify(obj))来解决输出不准问题。
        最佳解决方案是用浏览器断点调试或者开发代码debugger打断点调试,执行完全停止,可以检查每个点的当前值。发现数据错误bug也是最快的方法。

  1. 异步代码:如果console.log语句位于异步代码中,例如回调函数定时器中,那么它可能不会按照预期的顺序执行。这可能导致console.log输出的顺序与代码实际执行的顺序不同,从而导致输出不准确的情况。

  2. 异常:如果代码中存在异常,并且该异常在console.log语句之前或之后抛出,那么console.log可能不会输出预期的结果,因为它可能不会执行到该语句。

  3. 浏览器控制台:有时浏览器控制台本身可能存在问题,例如缓存或其他错误,这可能会导致console.log输出不准确的情况。此外,浏览器在处理的时候对于读取 i/o 的操作一般会放到比较靠后的位置去处理。 所以有些时候打印出来的值不符合预期。在这些情况下,可以尝试使用不同的浏览器或更新浏览器版本来解决问题。

    最后再次总结,为了避免console.log输出不准确的情况,可以采取以下措施:

  1. 在输出对象数组时,可以使用JSON.stringify方法将其转换为字符串,以避免输出引用。(已在例子中讲解)

  2. 最好用浏览器断点调试或者开发代码debugger打断点调试,执行完全停止,可以检查每个点的当前值。发现数据错误bug也是最快的方法。(已在上述提示)

  3. 尽可能避免在异步代码中使用console.log,或者确保在异步代码中正确处理console.log的执行顺序。

  4. 确保代码不会抛出异常,并在必要时使用try-catch语句处理异常。

  5. 确保浏览器控制台没有任何问题,并尝试使用其他浏览器或更新浏览器版本来解决问题。

如果你觉得学到了,可以关注点赞一起学习!


参考文章:
参考①:https://zhuanlan.zhihu.com/p/359906665
参考②:https://developer.mozilla.org/zh-CN/docs/Web/API/console/log
参考③:https://stackoverflow.com/questions/23392111/console-log-async-or-sync


关键词:
console.log 控制台打印不准确,前端控制台打印不一致,console.log 打印的值不准确,console.log是异步还是同步方法?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/593761.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

# croc用法实践(设备间文件或文件夹传输)

croc用法实践(设备间文件或文件夹传输) 文章目录 croc用法实践(设备间文件或文件夹传输)1 安装2 使用示例2.1 发送文件2.2 发送文件夹2.3 发送文本字符串2.4 发送时指定code,接收时自动【Y】,并保存到指定目…

《MySQL(一):基础篇-MySQL概述》

文章目录 1. MySQL概述1.1 数据库相关概念1.2 MySQL数据库1.2.1 版本1.2.2 下载1.2.3 安装1.2.4 启动停止1.2.5 客户端连接1.2.6 数据模型1. MySQL概述 1.1 数据库相关概念 先来了解三个概念:数据库、数据库管理系统、SQL。 而目前主流的关系型数据库管理系统的市场占有率…

ic验证的主要工作流程和验证工具是什么?

验证其实是一个“证伪”的过程,从流程到工具,验证工程师的终极目的都只有一个: 发现所有BUG,或者证明没有BUG,以保证芯片功能性能的正确性和可靠性。 验证环节对于一颗芯片的重要性也是不言而喻的: 从项…

VMware16安装Linux CentOS7完整教程(附下载地址)

一、准备工作 1.安装VMware Workstation Pro 16 (1)百度网盘下载地址 链接:https://pan.baidu.com/s/1jv0kQ26TLMt9MzofImRzgA?pwds0m1 提取码:s0m1 (2)VMware官网 https://www.vmware.com/cn (2&#x…

广通优云徐育毅:筑基数字化,打造中国IT运维新范式

2023年2月,中共中央、国务院印发《数字中国建设整体布局规划》,数字技术与经济、政治、文化、社会等各领域融合愈发紧密,一册百花齐放、生机勃勃的数字化图卷正徐徐展开。 随着数字中国战略深入推进,IT运维作为核心领域受到关注。…

傻瓜式git管理。全平台,全编译器通用。github desktop+vscode

文章目录 前言Github desktop资源地址推荐理由操作介绍打开界面介绍Github账号登录Github仓库导入 从零开始新建Gitee仓库登录或注册gitee仓库Gitee新建仓库输入仓库名,添加gitignore,Readme什么是.gitignore什么是README 新建仓库效果github desktop使用新建本地仓…

Android播放器拖动进度条的小图预览

Android播放器拖动进度条的小图预览 背景效果图关键代码1. 获取指定位置的视频帧2. 预览图的显示和隐藏 完整代码1. xml布局文件activity_video.xml2. Activity文件VideoActivity.java 背景 我们在使用一些播放器时,拖动进度条会有一个预览框,上一篇博客…

海康、大华、tplink监控摄像头和硬盘录像机接入GB28181平台配置细节

海康、大华、tplink等各种型号监控摄像头或硬盘录像机(NVR/HVR)接入GB28181平台,配置过程都非常简单明了,但有些细节需要注意,避免走弯路踩泥坑。 首先要说明一点的是,只要监控设备和GB28181平台的网络是连通的,都可以…

5月第4周榜单丨飞瓜数据B站UP主排行榜单(哔哩哔哩)发布!

飞瓜轻数发布2023年5月22日-5月28日飞瓜数据UP主排行榜(B站平台),通过充电数、涨粉数、成长指数三个维度来体现UP主账号成长的情况,为用户提供B站号综合价值的数据参考,根据UP主成长情况用户能够快速找到运营能力强的B…

chatgpt赋能python:Python中提取纯数字的方法

Python中提取纯数字的方法 在数据清洗和数据分析中,经常需要将文本中的数字提取出来,用于后续的计算或统计分析。Python作为一种流行的数据处理语言,提供了多种方法来完成这个任务。 方法一:使用正则表达式 正则表达式是一种强…

什么是精细化管理?怎样做好精细化管理?

俗话说,细节决定成败,企业管理也一样,精细化管理尤为重要。 01 什么是精细化管理 精细化管理是企业管理的一种理念,可追溯至20世纪50年代泰勒科学管理。也可以说是一种文化,以最大限度地减少管理所占用的资源和降低管…

超详细的 Wireshark 使用教程

一、wireshark是什么? wireshark是非常流行的网络封包分析软件,简称小鲨鱼,功能十分强大。可以截取各种网络封包,显示网络封包的详细信息。 wireshark是开源软件,可以放心使用。可以运行在Windows和Mac OS上。对应的…

(双指针 ) 18. 四数之和 ——【Leetcode每日一题】

❓18. 四数之和 难度:中等 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重…

Linux系统下imx6ull QT编程—— C++重载(六)

Linux QT编程 文章目录 Linux QT编程前言一、函数重载示例 二、运算符重载1.示例 前言 C 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载。重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明&#xf…

如何实现 ESP 设备多证书管理?

设置特定分区存储证书文件多证书文件管理证书格式转换证书下载使用证书文件 1、设置特定分区存储证书文件 在项目工程下分区表文件下定义证书分区表文件,如下: 如上,转换的 certificate.bin 下载地址就为 0x41000证书分区文件的大小可不做设…

Benewake(北醒) 快速实现 TF02-Pro-IIC 与电脑通信操作说明

目录 1. 概述2. 测试准备2.1 工具准备2.2通讯协议转换 3. IIC通讯测试3.1 引脚说明3.2 测试步骤3.2.1 TF02-Pro-IIC 与 PC 建立连接3.2.2 获取测距值3.2.3 更改 slave 地址 1. 概述 通过本文档的概述,能够让初次使用测试者快速了解测试 IIC 通信协议需要的工具以及…

度量学习:使用多类N对损失改进深度度量学习

度量学习系列 Author: 码科智能 使用多类N对损失改进深度度量学习 度量学习是ReID任务中常用的方式之一,今天来看下一篇关于如何改进度量学习的论文。来自2016年NeurIPS上的一篇论文,被引用超过900次。 论文:Improved Deep Metric Learni…

针对蓝桥杯竞赛(Python)的基础知识 No.1

首先我们要知道Python是有着大量的库(模块、类、函数)的,所谓善借其器,善用其利 Q1、日期问题 掌握 datetime库 eg:小蓝每周六、周日都晨跑,每月的 1、11、21、31日也晨跑。其它时间不晨跑。已知 2022年1月1日是周六&…

Allegro输出光绘文件规范

光绘输出操作规范 1.1添加钻孔表 添加钻孔表的具体步骤为: 1.通过屏幕右边的Visibility选项的Views列表,将Drill层打开 2.将Visibility选项中的PIN和Via选项都选中,见下图所示: 1.2添加钻孔文件 参数设好之后关闭NC Drill/Parameters窗口,输出数控机床钻孔文件的命令…

1130 Infix Expression(34行代码+超详细注释)

分数 25 全屏浏览题目 切换布局 作者 CHEN, Yue 单位 浙江大学 Given a syntax tree (binary), you are supposed to output the corresponding infix expression, with parentheses reflecting the precedences of the operators. Input Specification: Each input fil…