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



























