天天看點

面試題輸出列印結果總結

1.宏任務,微任務

async function async1() {
  console.log(1);
  const result = await async2();
  console.log(3);
}

async function async2() {
  console.log(2);
}

Promise.resolve().then(() => {
  console.log(4);
});

setTimeout(() => {
  console.log(5);
});

async1();
console.log(6);
           

輸出的結果順序為:1,2,6,4,3,5

題解:

  1. 首先js的函數執行是在調用的地方開始函數的執行,是以先跳過前兩個 async 函數。
  2. 然後 promise 函數,因為Promise.then中注冊的回調是異步執行的,是以應該将 4 放在微任務隊列中
  3. 遇到setTimout,異步宏任務,放入宏任務隊列中;
  4. 然後調用了async1(),async1() 中的 console.log(1);是同步執行的,是以首先列印了1 ,await 後面緊跟着async2 函數執行,是以列印了 2 ,async2 函數傳回的 Promise ,是以 console.log(3) 放在微任務隊列中,此時微任務隊列中有【4,3】,接着執行了下一個同步任務 6

    此時同步任務已經執行完畢,我們去到異步的事件隊列中找,先執行微任務,此時微任務中有【4,3】,是以列印接下來列印 4 和 3 ,微任務宏任務的列印順序按照存儲的順序列印,是以 3 在 4 的後面

  5. 最後執行宏任務中的 5

2.對象作為key會轉為[object,object]

let a = {a: 10};
let b = {b: 10};
let obj = {
  a: 10
};
obj[b] = 20;
console.log(obj[a]);
           

這道題的答案是:20

題解:

1.obj [ b ] = 20;

相當于 obj [ {b: 10} ] = 20;對象做為 key 時被強制轉為了 [object,object],是以此時 obj 的值為:

obj = {
     a: 10,
    [object,object]:20
 };
           
  1. 列印 obj [a] 時,由于 a 是一個對象,是以被強制轉換為了 **[object,object],**就相當于列印 obj[’[object,object]’],是以最後輸出的結果為 20 ;

3.關于堆棧記憶體

const a = {},b = 0,c = '0';
a[b] = "xu"
a[c] = 'ke'
console.log(a[b]) //ke
           
這一題答案是輸出的

ke

對象中屬性名不能重複,數字屬性名會轉換為字元串,是以a[c] 會把 a[b]覆寫掉
const a = {},b = symbol('0'),c = symbol(0);
a[b] = "xu"
a[c] = 'ke'
console.log(a[b]) //xu
           

考察的symbol資料類型,是es6中新出的資料類型,

每個Symbol執行個體都是唯一的,是以不會被覆寫

4.讓條件成立

怎樣讓下面的成功的輸出

條件成立

四個字

if(var i ==1 && i==2 &&i==3){console.log("條件成立!")}

方法1:

由于我們不确定i的類型,i可以為對象可以為字元串,當i和數字進行比較的時候首先調用自身的toString方法,再轉換為number,再和數字進行比較,是以我們借助i的toString方法可以實作這個等式成立

var i = {
	j :1,
	toString(){
		return this.j++
	}
}
if(i==1 && i==2 && i==3){
	console.log("條件成立")
}
           

方法2:Object.defineProperty()

當我們通路或設定

對象的屬性的時候

都會觸發相對應的函數

,然後在這個函數裡

傳回

設定屬性的值

既然如此,我們當然可以在觸發函數的時候動一些手腳做點我們自己想做的事情,這也就是

“劫持”

操作。

var j= 1
Object.defineProperty(window,'i',{
	get(){
		return j++
	}
	
})
if(i==1 && i==2 && i==3){
	console.log("條件成立")
}
           

方法3:根據 i 的toString 和數組的shift

const i = [1,2,3]
i.toString  = i.shift //每次i和數字進行比較都會調用自身的toString方法,i.shift删除并傳回的數組的第一個元素,是以讓每次的shift值給toString方法,可使得等式成立
console.log(i)
if(i==1&&i==2&&i==3){
	console.log("條件成立")
}
           

繼續閱讀