JavaScript 有時會有些“出人意料”,即便是看似簡單的問題也可能暗藏玄機。以下是七個涵蓋不同 JavaScript 特性的經典問題。它們看起來很簡單,但往往會讓人意外!如果你能答對這些問題,說明你對 JavaScript 的掌握已經很扎實了。
問題 1:0.1 + 0.2 === 0.3
的結果是什么?
console.log(0.1 + 0.2 === 0.3);
答案: false
解析:
JavaScript 中,浮點數(帶小數點的數字)在計算時并不總是精確的。
例如,0.1 + 0.2
的結果并不是嚴格意義上的 0.3
,而是 0.30000000000000004
。這是由于計算機采用二進制來近似表示十進制浮點數所導致的誤差。所以,0.1 + 0.2 === 0.3
的結果是 false
。
問題 2:"5" + 3
和 "5" - 3
的結果是什么?
console.log("5" + 3);
console.log("5" - 3);
答案:
"5" + 3
的結果是 "53"
"5" - 3
的結果是 2
解析:
- **
"5" + 3
**:當使用 +
操作符時,如果其中一個操作數是字符串,JavaScript 會將另一個操作數也轉換為字符串,并將它們拼接在一起,因此結果是 "53"
。 - **
"5" - 3
**:-
操作符不會作用于字符串。JavaScript 會將 "5"
轉換為數字 5
,然后進行數學運算,結果是 2
。
問題 3:typeof null
的值是什么?
console.log(typeof null);
答案: "object"
解析:
這是 JavaScript 中一個令人困惑的點。按理說,typeof
應該返回值的類型。然而,typeof null
返回 "object"
,這是歷史遺留的一個設計問題。實際上,null
是一個特殊的原始類型值,表示“空”或“無值”。不過,為了兼容舊代碼,這個問題一直沒有修復。
問題 4:閉包是如何工作的?
function outerFunction() {
let count = 0;
return function () {
count++;
console.log(count);
};
}
const closure = outerFunction();
closure(); // ?
closure(); // ?
答案:
輸出為:
1
2
解析:
閉包指的是函數能夠記住它定義時所在的作用域環境,即使這個函數在別的作用域中執行。
在這個例子中,outerFunction
返回了一個內部函數,該函數仍然可以訪問 outerFunction
內部的 count
變量。每次調用 closure
,count
都會遞增,并打印其最新值。
問題 5:true + false
和 [] + {}
的結果是什么?
console.log(true + false);
console.log([] + {});
答案:
true + false
的結果是 1
[] + {}
的結果是 "[object Object]"
解析:
- **
true + false
**:在 JavaScript 中,布爾值會被轉換為數字:true
是 1
,false
是 0
。因此,1 + 0
的結果是 1
。 - **
[] + {}
**:加號用于非數字時,會觸發類型轉換。空數組 []
轉換為空字符串 ""
,空對象 {}
轉換為字符串 "[object Object]"
,所以最終結果是 "[object Object]"
。
問題 6:[] == ![]
的結果是什么?
console.log([] == ![]);
答案: true
解析:
這背后包含了一些隱式類型轉換:
![]
表示“非空數組”。由于空數組是“真值”(truthy),![]
變成了 false
。- 比較時,JavaScript 會將
false
轉換為數字 0
,然后將 []
轉換為空字符串 ""
。
問題 7:以下代碼中 console.log(a)
的輸出是什么?
console.log(a);
var a = 5;
答案: undefined
解析:
這是 JavaScript 中的變量提升(hoisting)機制。
在執行代碼之前,JavaScript 會將變量聲明提升到當前作用域的頂部。所以上述代碼相當于:
var a;
console.log(a);
a = 5;
在 console.log(a)
執行時,a
已經聲明但尚未賦值,因此輸出 undefined
。
總結
這些問題既展現了 JavaScript 一些奇特的行為,也涵蓋了閉包、類型轉換、變量提升等核心概念。理解這些內容不僅能避免常見的坑,還能提升對 JavaScript 的掌控能力。
該文章在 2024/12/9 10:54:29 編輯過