不靠譜的 console

前言

做爲一名前端,console 估計會時時刻刻陪伴咱們,其實各個端都會有輸出變量的值的方法,以便調試,這裏我指的 console 單純指的是前端中的 console。不得不說,它是一個調試的好方法,但它也是不可信的。javascript

一個例子

先上代碼:前端

var obj = {
	name: {
		age: '1'
	}
}
console.log(obj);
obj.name.age = 2;
console.log(obj);
複製代碼

你們猜想下結果,咱們預期的確定是不同的,畢竟中間有修改java

可是事實上倒是出乎咱們意料的node

是的,兩個都是同樣的,console 真的是一個吃裏扒外的東西,那究竟是爲何呢?瀏覽器

緣由

實際上咱們輸出非對象類型的值的時候,是徹底沒問題的,好比bash

因此,咱們能夠知道,在使用 console 打印一個 JavaScript 對象的時候,因爲對象是引用類型,那麼它會一直引用內存中的值,當你輸出的時候,對象中的值已經發生了改變,因此纔會出現這種打印結果不正確的狀況異步

另外,從上面能夠看出,在瀏覽器環境中,console.log() 實際上也是一種異步的方法性能

對此,《你不知道的javascript中卷》第二部分異步和性能1.1節異步控制檯部分有說起:spa

並無什麼規範或一組需求指定 console.* 方法族如何工做——它們並非 JavaScript 正式的一部分,而是由宿主環境(請參考本書的「類型和語法」部分)添加到 JavaScript 中的。所以,不一樣的瀏覽器和 JavaScript 環境能夠按照本身的意願來實現,有時候這會引發混淆。 尤爲要提出的是,在某些條件下,某些瀏覽器的 console.log(..) 並不會把傳入的內容當即輸出。出現這種狀況的主要緣由是,在許多程序(不僅是JavaScript )中,I/O 是很是低速的阻塞部分。因此,(從頁面/UI 的角度來講)瀏覽器在後臺異步處理控制檯 I/O 可以提升性能,這時用戶甚至可能根本意識不到其發生。.net

node 環境中的 console

上面咱們分析是在瀏覽器環境中,那麼在 node 環境中會出現上面的狀況麼?

從上面能夠看出,node 環境中是不存在狀況的

解決方法

方法一

使用 JSON.stringify,原理是將它轉換成字符串輸出,這樣就不會在引用原有的對象的內存,以下所示

方法二

打斷點,這種方法是最合適的,也是咱們前端最正確的打開方式

參考

blog.csdn.net/extendworld…

cnodejs.org/topic/59142…

以爲本文不錯的話,分享一下給小夥伴吧~
相關文章
相關標籤/搜索