【第28題】console的異步性怎么理解?
面試題目(字節(jié)):
console的異步性怎么理解?
答案解析:
console我一直以為是同步執(zhí)行的,直到在一本書上看到,才了解到console本身有異步的特性。雖然在平常開發(fā)中經(jīng)常使用console,但是真的沒有意識到它的異步性。
下面就看下異步的實例
基礎(chǔ)類型
該類型是我們開發(fā)中經(jīng)常使用的,正是這種打印結(jié)果,讓我們認為console是同步的。其實這種case也是異步的,因為執(zhí)行到console時,拍攝了快照,記錄了當時的變量值,當代碼執(zhí)行完返回到事件隊列時,直接打印了前面記錄的快照造成的。
let foo = 'bar';
console.log(foo);
foo = 'test';

引用類型
引用類型,可以幫我們很好的驗證console的異步性??聪聢D中的打印結(jié)果,如果是同步的話,打印結(jié)果應(yīng)該時{},但是卻是修改后的值{foo: 'bar'}。
主要是因為,obj是引用類型,執(zhí)行到console時,只是存儲了對象的引用,對于對象內(nèi)部的值未做記錄。當代碼執(zhí)行完后,obj內(nèi)部的值已經(jīng)被修改。返回事件隊列后,打印出的結(jié)果實際是修改后的值。
let obj = {};
console.log(obj);
obj.foo = 'bar';

結(jié)論
以上示例,都是在瀏覽器中的表現(xiàn),也就是瀏覽器中console實際是異步快照,node中的console是另一回事,它是嚴格同步的,因此同樣的代碼打印結(jié)果是{}。
瀏覽器之所以這樣,是因為,在許多程序中,I/O被認為是低速的阻塞環(huán)節(jié)。在瀏覽器中,console.log會被異步處理以提高性能。
下面再看兩道題目加深下理解
第一道
a = [1, 2, 3];
console.log(a, a.pop());
[1, 2], 3
第二道這道題目很有特點,打印結(jié)果,展開前后值是不一樣的。
person = {
name: "張三",
age: 18,
};
console.log(person);
person.name = "李四";
console.log(person);


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