什么?console.log打印出的数据不对?

news2024/11/15 9:35:53

背景

都怪我年轻不懂事,调试代码只会用console.log。那么,就在今天,出事儿了!

看图说话。上面的111222后面跟的数据竟然不一致?

在我的认知中,JSON里面的parsestringify方法只是类型的转换啊,怎么还把值给我变了!这不是坑人吗!

经过高人指点,我才明白,

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

那么,既然有“可能”性,到底什么时候会出现异常呢?也即我上面的截图结果的出现逻辑是什么呢?

前置知识

1.引用类型的存储需要内存的栈区和堆区(堆区是指内存里的堆内存)共同完成,栈区内存保存变量标识符和指向堆内存中该对象的指针。
2.引用类型可以拥有属性和方法,并且是可以动态改变的。
3.引用类型的比较是引用的比较。

上图异常出现的逻辑解析

1.console.log打印一个对象时,是指向一片内存地址。111后面打印了一个Object对象,所以指向的是内存地址。
2.而222后面的是经过了对象序列化的数组,属于深拷贝,并不会跟着对象的改变而改变。
3.我在使用了console.log之后,使用AJAX更改了this.selectedAttrsnameEn的数据,从“aaa”改为“”
4.此时进入控制台,在点开三角箭头之前,能看到的都是未修改的值。因为console.log日志输出后无法回撤或者更新。
5.但是点击了111后面的三角箭头后,此时才会请求此内存地址下的内容,发现已修改为“”。并且点击已被序列化的222的内容时,看到的是修改前的值。
6.也就是说,222后面跟的才是console.log此时此刻此对象的值,111后面的详细内容是经过后期代码修改了的。

所以啊,在需要用console.log调试时,尽量不要直接输出对象,先将对象序列化JSON.stringify()为字符串再输出。或者使用打断点(debugger)的方式来调试。

总之,可以得出一个结论:chrome调试工具的那个三角形点开的时候才会拿着内存地址去取对象的值。

举一个例子:

//执行以下代码
let obj={age:20} 
console.log(obj)
obj.age=30 

执行结果:

不展开obj对象,看到的是我们预期的20,展开对象,看到的却是30。如果我们输出一个字段很多的对象,那必须展开才能看到属性值,展开后,看到的值是点击“展开”那一刻时对象的值,而非console执行那时候的值。

原因分析:

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

console到底是什么

console 对象提供对浏览器调试控制台的访问。

console 挂载在 window 对象上,ECMAScript 中并没有规定 console 该如何实现,因为它不属于 javascript 的语言标准。每个浏览器都有自己的实现,并不约而同的把它挂载到 window 对象上。所以 console 对象的方法并不是每个浏览器都会实现,行为也可能会有略微差异。

console的常用API

1.console.log //按照参数传入的顺序打印一个或者多个变量。

如果打印的是Object / Array / Function 等非基本类型,在控制台显示的是该变量的引用,也就是说后续对变量的修改也会体现在控制台。console 初始打印的是执行到console.log语句时的变量值,虽然是引用类型,但是控制台并不会实时追踪值的变化,只有用户主动触发 ▶(查看详情)才会展示变量的当前值。后续值的更改不会再反应到控制台,也就是说一旦查看详情,控制台对变量的跟踪就“断开”了。

如果就想打印某个 object 执行到 console 的当前值怎么办?

1)console.log(JSON.parse(JSON.stringify(object)))> 2)深度克隆 object (推荐)

2.console.dir //在控制台打印出 obj 带有三角形的层次结构列表,可查看子对象的内容。

跟 log 方法的区别是不显示简略信息,只显示一个 ▶ 和对象参数的 constructor

3.console.time(label)> console.timeEnd(label) //打印出timetimeEnd 之间JS的执行耗时

4.console.error //打印出错误信息

一般底色为红色,并会展示错误位置的调用栈 浏览器的 JS 报错用的就是 console.error 。

…更多console工具可自行上网冲浪查询。

那问题来了,调试JS代码的时候你只会用console吗?

Chrome DevTools 开发者工具

1. 控制台中直接访问页面元素

在元素面板Elements选择一个元素,然后在控制台输入$0,就会在控制台中得到刚才选中的元素。如果页面中已经包含了 jQuery,你也可以使用$($0)来进行选择。也可以反过来,在控制台输出的 DOM 元素上右键选择 Reveal in Elements Panel 来直接在 DOM 树中查看。

2. 访问最近的控制台结果

在控制台输入$_可以获控制台最近一次的输出结果。

3. 使用 console.dir

console.dir(object)/dir(object) 命令可以列出参数 object 的所有对象属性。

4. 清空控制台历史记录

可以通过下面的方式清空控制台历史:

  • 在控制台右键,或者按下 Ctrl 并单击鼠标,选择 Clear Console。
  • 在脚本窗口输入 clear()执行。
  • 在 JavaScript 脚本中调用 console.clear()。
  • 使用快捷键 Cmd + K (Mac) Ctrl + L (Windows and Linux)。

5. 切换主题

Chrome 提供了 亮&暗 两种主题,当你视觉疲劳的时候,可以 switch 哦, 快捷键 ctrl+shift+p ,打开 Command Menu,输入 theme ,即可选择切换。

…更多Chrome调试技巧和一些快捷键期待你的一起探索喔~~

最后

整理了75个JS高频面试题,并给出了答案和解析,基本上可以保证你能应付面试官关于JS的提问。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

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

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

相关文章

深浅拷贝小整理(对象赋值请注意)

深浅拷贝小整理1. 一些基础知识 js数据类型分为基本数据类型>Number、String、Boolean、Null、Undefined和引用(对象)数据类型>Object包括有Function、Array、Date;基本数据类型存放在栈中,访问是按值访问;引用类型指的是对象&#xf…

痛定思痛!!!结合fidller抓包,简单介绍http请求报文和http响应报文

简单介绍http请求报文和http响应报文前言1. http请求报文的组成1.1 请求行的内容1.2 请求头的组成1.3 请求体2. HTTP响应报文组成前言 各类书上在介绍http请求报文和http响应报文时花的太过于专业,没有结合实际,当时读的时候可能是我太笨了,…

今天给在家介绍一篇健身俱乐部信息管理系统设计与实现

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…

安装包UI美化之路-nsNiuniuSkin界面在线设计引擎

一年多前,我们自己开发了一个用于编辑、预览、调试nsNiuniuSkin的UI界面工具,越来越觉得好用,忍不住想要分享出来! 今天我把这个工具重新整理了一下,功能又完善了一些;下面就介绍一下这个工具的功能和使用…

深度解析:Web 3.0和元宇宙

导读:元宇宙的终极形态势必是去中心化的,而现在的网络生态并不能完全满足元宇宙去中心化的需求。一些人认为,即将到来的Web 3.0时代和元宇宙需要的网络生态高度重合。Web 3.0或许能够成为人类迈向元宇宙道路上重要的一步。 01 Web的三次技术迭代 Web 3.0通过新技术体现出来,…

蓝桥杯2022年第十三届决赛真题-围栏(求凸多边形的面积)

题目描述 这天,小明在造围栏。 他提前在地上 (二维平面) 打好了 n 个洞,这 n 个洞的位置形成了一个凸多边形。当他准备把固定围栏的木杆插进去的时候,突然发现自己少准备了两根木杆。 如图,他现在只能在这 n 个洞中选出 n − 2 …

【linux】软件管理

linux软件管理 文章目录linux软件管理桥接模式下配置虚拟机连接互联网nmcli相关命令windows和linux之间的FTPlinux中的软件包类型rpm相关命令搭建本地软件仓库测试本地仓库重新挂载仓库到http服务器上设置仓库镜像开机自动挂载dnf相关命令配置EPEL(Extra Packages f…

学生个人网页设计作品:旅游网页设计与实现——成都旅游网站4个页HTML+CSS web前端网页设计期末课程大作业 学生DW静态网页设计 学生个人网页设计作品

👨‍🎓静态网站的编写主要是用 HTML DⅣV CSSJS等来完成页面的排版设计👩‍🎓,一般的网页作业需要融入以下知识点:div布局、浮动定位、高级css、表格、表单及验证、js轮播图、音频视频Fash的应用、uli、下拉…

【YSYY】DSPE-PEG-Transferrin;DSPE-PEG-TF转铁蛋白的主动靶向介绍;磷脂-聚乙二醇-转铁蛋白

产品简称:DSPE-PEG-Transferrin;DSPE-PEG-TF 中文名称:磷脂-聚乙二醇转铁蛋白 产品全称: 1,2-dipalmitoyl-sn-glycero-3-phosphoethanolamine-N-(polyethylene glycol)-Transferrin 产品外观:白色固体 结 构 式&a…

Kubernetes NUMA 感知

TopologyManager TopologyManager 在1.18版本中处于 Beta 状态,该功能支持 CPU 和外围设备(例如 SR-IOV VF 和 GPU)的 NUMA 对齐,使工作负载能够在针对低延迟优化的环境中运行。 在引入 TopologyManager 之前,CPU 和…

2022-11-17 更高效的Cascades优化器 - Columbia Query Optimizer

在较早的文章中介绍了些Volcano/Cascades优化器框架的设计理念和实现思路,基本是基于论文的解读: https://zhuanlan.zhihu.com/p/364619893 https://zhuanlan.zhihu.com/p/365085770 虽然cascades号称目前最为先进的优化器搜索框架,但不得不说这2篇pa…

ZNS SSD是否真的前途一片光明?

引言 在上次存储随笔更新了一篇ZNS相关的文章“炙手可热的ZNS SSD将会为数据中心带来什么?”以后,在存储圈也一度引发关注。某公司相关同学也在朋友圈疯狂转发,让一些朋友误以为是存储随笔专为某公司写的技术推广软文。 借这个机会在这里再次…

【算法100天 | 20】有环/无环链表的相交问题(Java实现)

若两个链表相交,请返回相交的第一个节点。 给定两个有可能有环也有可能无环的单链表,头节点head1和head2。 实现一个函数,如果两个链表相交,请返回相交的第一个节点(从这个节点开始,后续结构都一样&#…

Leetcode-每日一题792. 匹配子序列的单词数(分桶)

题目链接:https://leetcode.cn/problems/number-of-matching-subsequences/description/ 思路 方法一、分桶 题目意思:给你一个字符串 s 和字符串数组 words, 可以对字符串 s 某些位置上的字符进行删除,并不改变原来的字符顺序…

什么是SIMD?

为了提高 CPU 指令处理数据的能力,半导体厂商在 CPU 中推出了一些可以同时并行处理多个数据的指令 ——SIMD指令。 百度百科定义为: SIMD全称Single Instruction Multiple Data,单指令多数据流,能够复制多个操作数,并…

新库上线 | CnOpenData中国核酸检测机构及采样点数据

中国核酸检测机构及采样点数据 一、数据简介 2020年1月21日,国家卫健委发布1号公告,将新型冠状病毒感染的肺炎纳入《中华人民共和国传染病防治法》规定的乙类传染病,并采取甲类传染病的预防、控制措施。目前,新型冠状病毒肺炎防控…

Ubuntu20.04安装c++版本的OpenCV

文章目录参考资料1. 安装步骤1.1 仅构建核心模块1.2 构建含有opencv_contrib的版本2. 安装过程碰到的问题2.1 编译opencv时,卡在IPPICV参考资料 https://www.jianshu.com/p/3c2fc0da7398https://docs.opencv.org/4.5.3/d7/d9f/tutorial_linux_install.htmlhttps://…

SpringBoot+Vue实现前后端分离的社区疫情防控管理系统

文末获取源码 开发语言:Java 使用框架:spring boot 前端技术:JavaScript、Vue.js 、css3 开发工具:IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库:MySQL 5.7/8.0 数据库管理工具:phpstudy/Navicat JD…

[附源码]java毕业设计昆明市人民医院血库管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

vim的基本操作

文章目录vim是什么vim的模式命令/普通模式(Normal mode)移动光标上下左右其余移动光标文本操作**进入替换模式:shiftrR**插入模式(insert mode)底行模式(last list mode)vim的配置vim一键配置vim是什么 简单理解&…