做爲一名前端,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
環境中會出現上面的狀況麼?
從上面能夠看出,node
環境中是不存在狀況的
方法一
使用 JSON.stringify
,原理是將它轉換成字符串輸出,這樣就不會在引用原有的對象的內存,以下所示
方法二
打斷點,這種方法是最合適的,也是咱們前端最正確的打開方式