【第28題】console的異步性怎么理解?
答案解析:console的異步性怎么理解?
console我一直以為是同步執行的,直到在一本書上看到,才了解到console本身有異步的特性。雖然在平常開發中經常使用console,但是真的沒有意識到它的異步性。
下面就看下異步的實例
(相關資料圖)
基礎類型
該類型是我們開發中經常使用的,正是這種打印結果,讓我們認為console是同步的。其實這種case也是異步的,因為執行到console時,拍攝了快照,記錄了當時的變量值,當代碼執行完返回到事件隊列時,直接打印了前面記錄的快照造成的。
letfoo="bar";console.log(foo);foo="test";
引用類型
引用類型,可以幫我們很好的驗證console的異步性??聪聢D中的打印結果,如果是同步的話,打印結果應該時{},但是卻是修改后的值{foo: "bar"}。
主要是因為,obj是引用類型,執行到console時,只是存儲了對象的引用,對于對象內部的值未做記錄。當代碼執行完后,obj內部的值已經被修改。返回事件隊列后,打印出的結果實際是修改后的值。
letobj={};console.log(obj);obj.foo="bar";
結論
以上示例,都是在瀏覽器中的表現,也就是瀏覽器中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);
當console.log輸出內容為對象,指向的是對象的地址,當點開對象進行查看時,才會去訪問相應地址獲取內容。所以點開對象后,會重新訪問對象地址進行查詢,因此之前的張三,變成了李四
相關閱讀
-
【第28題】console的異步性怎么理解?
面試題目(字節):console的異步性怎么理解?答案解析:console我一... -
當前快播:“趣味運動會項目”教學思路
說在前面浙教版《選擇性必修一數據和數據結構》第一章是全書的導論... -
環球實時:“數據合并”教學思路
說在前面浙教版《選擇性必修一數據和數據結構》第一章是全書的導論... -
環球速訊:因為一篇文章,發生了一大堆...
前段時間寫了一篇文章,給ShardingSphere提了個PR,不知道是不是嫌... -
快報:用 UE 虛幻引擎做個捏臉小功能~~
最近在學習UE相關的使用,正好看到一篇文章講解用ControlRig實現簡... -
世界觀察:寫文案,能細則細!
有2條文案:文案一:我們從鐵觀音故鄉的深山里采摘新鮮茶葉,挑選上...