1. 程式人生 > 實用技巧 >近期面試題目 js 基礎

近期面試題目 js 基礎

var a = 10;
(funtion () {
   console.log(a)
   a = 5
   console.log(window.a)
   var a = 20
   console.log(a)  
})()

解答: 考點變數提升
函式內: 實際執行順序 var a (未賦值) 所以第一個列印 undefined
然後區域性作用域的a被賦值為5,接著列印window物件下的a,即 10
接著a 被重新賦值為 20
最後打印出 20
思考: 如果將 var a = 20 去掉,列印什麼呢?

var a = {n: 11}
var b = a;
a.x = a = {n: 22}

console.log(a)
console.log(b)

解答:考點應用型別值的傳遞本質(以下 => 做指向用,並非箭頭函式)

a => Object
b引用a的內容,專業術語叫做 b指向a的地址
a.x = a = {n: 22} => a.x = {n: 22}; a = {n: 22}

a在最後一步被重寫(重新分配地址) 所以列印的是 {n: 22}
而b還是指向a原來的地址只是多了一個屬性 x 多以列印 {n: 11, x:{n: 22}}

function wait() {
  return  new Promise(resolve => {
     setTimeout(resolve, 10*1000)
  })  
}

async function main(params) {
  const x = wait()
  const y = wait()
  const z = wait()
  await x
  await y
  await z
  
}

main();  // 求這段程式碼執行的時長是多久,為什麼?

  這道題乍一看是很簡單,可是往往就是個坑,至少對於我這種粗心的人是個坑了
解答: 10s
考題型別重點在於Promise本身是同步的立即執行函式, 以及wait的呼叫是按照同步函式呼叫的,這裡的await並沒有起到非同步作用。所以可以看作同時建立了3個巨集任務 setTimeout,都是延遲10s執行。