你是否曾在JavaScript面試中栽倒在看似簡單的代碼題上?是否疑惑為什麼兩個看似相同的對象比較會返回false?本文將通過分析README.md和zh-CN/README-zh_CN.md中的經典面試題,揭示JavaScript中那些看似違背直覺卻至關重要的概念,幫你建立前端"量子思維"。

變量提升與作用域:薛定諤的變量狀態

JavaScript中的變量聲明提升(hoisting)就像量子疊加態,變量在聲明前處於"已存在但未初始化"的模糊狀態。

function sayHi() {
  console.log(name);  // undefined
  console.log(age);   // ReferenceError
  var name = 'Lydia';
  let age = 21;
}

使用var聲明的變量會被提升到函數頂部並初始化為undefined,而let/const聲明的變量雖然也會提升,但處於"暫時性死區"(Temporal Dead Zone),訪問時會拋出ReferenceError。這一特性在zh-CN/README-zh_CN.md的第1題中有詳細解析。

事件循環:JavaScript的平行宇宙

JavaScript的單線程模型中,事件循環(Event Loop)機制讓異步操作成為可能,就像粒子同時存在於多個狀態。

const foo = () => console.log('First');
const bar = () => setTimeout(() => console.log('Second'), 0);
const baz = () => console.log('Third');

bar();
foo();
baz();  // 輸出: First Third Second

調用setTimeout時,回調函數被送入WebAPI,而非立即執行。當調用棧為空時,事件循環才會將回調函數從任務隊列推入棧中執行。這一過程在README.md的第30題中有生動圖解。

this綁定:函數的觀察者效應

this關鍵字的指向如同量子觀測,取決於函數被調用的方式,而非定義位置。

const shape = {
  radius: 10,
  diameter() {
    return this.radius * 2;  // this指向shape對象
  },
  perimeter: () => 2 * Math.PI * this.radius  // this指向全局對象
};

console.log(shape.diameter());  // 20
console.log(shape.perimeter()); // NaN

普通函數的this指向調用者,而箭頭函數的this繼承自外層作用域。這一關鍵區別在zh-CN/README-zh_CN.md的第3題中有詳細解釋。

對象比較:身份的哲學難題

在JavaScript中,對象比較比較的是引用而非值,就像兩個完全相同的粒子也具有不同的量子態。

function checkAge(data) {
  if (data === { age: 18 }) {  // 永遠為false
    console.log('You are an adult!');
  } else if (data == { age: 18 }) {  // 永遠為false
    console.log('You are still an adult.');
  } else {
    console.log(`Hmm.. You don't have an age I guess`);
  }
}

checkAge({ age: 18 });  // 輸出: Hmm.. You don't have an age I guess

每個對象字面量創建的都是新的引用,即使內容完全相同。這一特性在zh-CN/README-zh_CN.md的第18題中得到充分體現。

閉包:函數的記憶效應

閉包允許函數訪問並操作其詞法作用域之外的變量,即使外部函數已執行完畢,就像量子糾纏保持着遠距離的影響。

function createCounter() {
  let count = 0;
  return function() {
    return ++count;
  };
}

const counter = createCounter();
console.log(counter());  // 1
console.log(counter());  // 2

這一特性使得JavaScript能夠實現私有變量和模塊化,在README.md的多個題目中都有應用。

掌握JavaScript的量子思維

JavaScript充滿了看似矛盾卻自有邏輯的特性,理解這些"反直覺"的概念是成為高級前端工程師的關鍵。通過README.md中100+道面試題的系統訓練,你將建立起對JavaScript的深刻理解,從容應對各類技術挑戰。