<dl id="llxdb"></dl>
<video id="llxdb"><output id="llxdb"></output></video><dl id="llxdb"><output id="llxdb"></output></dl>
<output id="llxdb"></output>
<noframes id="llxdb"><dl id="llxdb"></dl>
<video id="llxdb"></video>
<output id="llxdb"><delect id="llxdb"><font id="llxdb"></font></delect></output>
<video id="llxdb"></video><dl id="llxdb"><output id="llxdb"></output></dl>
<dl id="llxdb"><delect id="llxdb"><font id="llxdb"></font></delect></dl><video id="llxdb"></video><dl id="llxdb"></dl><dl id="llxdb"><output id="llxdb"><font id="llxdb"></font></output></dl>
                          您的位置:首頁 >聚焦 >

                          【第28題】console的異步性怎么理解?

                          2022-10-25 08:56:31    來源:程序員客棧
                          面試題目(字節):

                          console的異步性怎么理解?

                          答案解析:

                          console我一直以為是同步執行的,直到在一本書上看到,才了解到console本身有異步的特性。雖然在平常開發中經常使用console,但是真的沒有意識到它的異步性。

                          下面就看下異步的實例


                          (相關資料圖)

                          基礎類型

                          該類型是我們開發中經常使用的,正是這種打印結果,讓我們認為console是同步的。其實這種case也是異步的,因為執行到console時,拍攝了快照,記錄了當時的變量值,當代碼執行完返回到事件隊列時,直接打印了前面記錄的快照造成的。

                          letfoo="bar";console.log(foo);foo="test";

                          image

                          引用類型

                          引用類型,可以幫我們很好的驗證console的異步性??聪聢D中的打印結果,如果是同步的話,打印結果應該時{},但是卻是修改后的值{foo: "bar"}。

                          主要是因為,obj是引用類型,執行到console時,只是存儲了對象的引用,對于對象內部的值未做記錄。當代碼執行完后,obj內部的值已經被修改。返回事件隊列后,打印出的結果實際是修改后的值。

                          letobj={};console.log(obj);obj.foo="bar";

                          image

                          結論

                          以上示例,都是在瀏覽器中的表現,也就是瀏覽器中console實際是異步快照,node中的console是另一回事,它是嚴格同步的,因此同樣的代碼打印結果是{}。

                          瀏覽器之所以這樣,是因為,在許多程序中,I/O被認為是低速的阻塞環節。在瀏覽器中,console.log會被異步處理以提高性能。

                          下面再看兩道題目加深下理解

                          第一道

                          a=[1,2,3];console.log(a,a.pop());

                          [1, 2], 3

                          第二道這道題目很有特點,打印結果,展開前后值是不一樣的。

                          person={name:"張三",age:18,};console.log(person);person.name="李四";console.log(person);

                          image
                          image

                          當console.log輸出內容為對象,指向的是對象的地址,當點開對象進行查看時,才會去訪問相應地址獲取內容。所以點開對象后,會重新訪問對象地址進行查詢,因此之前的張三,變成了李四

                          關鍵詞: 引用類型 事件隊列 異步處理

                          相關閱讀

                          Av久草
                          <dl id="llxdb"></dl>
                          <video id="llxdb"><output id="llxdb"></output></video><dl id="llxdb"><output id="llxdb"></output></dl>
                          <output id="llxdb"></output>
                          <noframes id="llxdb"><dl id="llxdb"></dl>
                          <video id="llxdb"></video>
                          <output id="llxdb"><delect id="llxdb"><font id="llxdb"></font></delect></output>
                          <video id="llxdb"></video><dl id="llxdb"><output id="llxdb"></output></dl>
                          <dl id="llxdb"><delect id="llxdb"><font id="llxdb"></font></delect></dl><video id="llxdb"></video><dl id="llxdb"></dl><dl id="llxdb"><output id="llxdb"><font id="llxdb"></font></output></dl>