網站首頁 編程語言 正文
debug時遇到一個問題:
console.log(object); 和 console.log(JSON.stringfy(object));打印出的值不一致,導致debug的時候以為是console.log這個動作之前獲取到的object數據就不對,浪費了些時間在debug獲取數據部分,而實際上問題出在console.log動作之后。因為:
console.log打印對象的執行機制是,當你在瀏覽器控制臺點擊object,展開object時,此時瀏覽器才會去object所在的堆內存中獲取數據,再經過瀏覽器編譯,展示在控制臺。
控制臺object一旦打開后,就不再修改,其值就會存儲在瀏覽器中,即使后面代碼再次更新object,也不會改變了。
做個測試:
//定義object: this.orginData
this.orginData = {
a: '111',
b: '222',
};
console.log("object orginData==", this.orginData);
console.log("object orginData a==", this.orginData.a);
console.log("json orginData==", JSON.stringify(this.orginData));
console.log("json orginData a==", JSON.stringify(this.orginData.a));
//修改object中a的值,設為空
this.orginData.a = "";
console.log("object orginData==", this.orginData);
console.log("object orginData a==", this.orginData.a);
console.log("json orginData==", JSON.stringify(this.orginData));
console.log("json orginData a==", JSON.stringify(this.orginData.a));
編譯后在瀏覽器控制臺打印的信息如下,可以看到,用JSON.stringfy()打印出的數據可以直接顯示出數據,而object則顯示成折疊狀態:
此時,把兩個折疊的object數據打開,如下圖所示,可以看到,不論是修改object值前還是后,打印出來的兩個object的數據是一樣的,a值都為空:
分析如下:
我們認為object修改之前和之后打印的結果應該和用JSON.stringfy()打印結果一樣有所不同,但根據測試結果,前后打印的object結果卻相同。說明在瀏覽器打印對象時,并沒有直接調用對象所對應的堆內存中的值,而是先打印了一個由瀏覽器自己解析的代表這個對象的字符串。當我們在控制臺點擊展開這個對象時,瀏覽器才會去根據這個對象的引用地址去堆內存中獲取對象的具體數據展示出來。所以獲取到的object值已經是頁面跑完后,最后的值。
如果要在瀏覽器控制臺打印代碼執行時堆內存所存儲的該對象的具體數據,可以用JSON.stringfy(object),將object對象轉變成json字符串,也可以用JSON.parse(JSON.stringfy(object))來打印,JSON.parse()可以將數據再轉換為 JavaScript 對象,當object對象的數據量很大的時候,用后者在瀏覽器控制臺的輸出會更加美觀,而不是一堆很長的字符串。
原文鏈接:https://blog.csdn.net/weixin_43894460/article/details/122099275
相關推薦
- 2022-04-25 ASP.NET?Core?MVC中Form?Tag?Helpers用法介紹_實用技巧
- 2022-04-10 pytorch中Parameter函數用法示例_python
- 2022-07-13 Springboot 項目中使用 @RestControllerAdvice 注解不生效
- 2022-10-20 詳解Go?語言如何通過測試保證質量_Golang
- 2022-04-10 用python實現文件備份_python
- 2022-10-14 matlab非線性最小二乘擬合
- 2022-06-04 tomcat的catalina.out日志按自定義時間格式進行分割的操作方法_Tomcat
- 2022-08-29 GPU服務器的多用戶配置方法_服務器其它
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支