遇到的兩道筆試題:
(function(){
var a = b = 3;
}());
console.log(b); // 3
console.log(a); // a is not defined
/*
首先分析 var a = b = 3 可以拆分為
b = 3 b是全局變量,在立即執(zhí)行函數(shù)里賦值為3
var a = b a是立即執(zhí)行函數(shù)里聲明的變量伞梯,函數(shù)執(zhí)行完a就被釋放,
并沒(méi)有生成全局變量a罢缸,所以在全局輸出a會(huì)報(bào)錯(cuò):a is not defined
*/
console.log(0.1+0.2 == 0.3); // false
console.log(0.1+0.2); // 0.30000000000000004
/* 分析來(lái)源: https://blog.csdn.net/axiba01/article/details/80964606
JavaScript 中的 number 類型就是浮點(diǎn)型闭树,JavaScript 中的浮點(diǎn)數(shù)采用IEEE-754 格式的規(guī)定精堕,這是一種二進(jìn)制表示法绰更,可以精確地表示分?jǐn)?shù)基跑,比如 1/2婚温,1/8,1/1024媳否,每個(gè)浮點(diǎn)數(shù)占 64 位栅螟。但是,二進(jìn)制浮點(diǎn)數(shù)表示法并不能精確的表示類似 0.1 這樣 的簡(jiǎn)單的數(shù)字篱竭,會(huì)有舍入誤差力图。
由于采用二進(jìn)制,JavaScript 也不能有限表示 1/10掺逼、1/2 等這樣的分?jǐn)?shù)吃媒。在二進(jìn)制中,1/10(0.1)被表示為 0.00110011001100110011…… 注意 0011 是無(wú)限重復(fù)的坪圾,這是舍入誤差造成的晓折,所以對(duì)于 0.1 + 0.2 這樣的運(yùn)算惑朦,操作數(shù)會(huì)先被轉(zhuǎn)成二進(jìn)制兽泄,然后再計(jì)算:
0.1 => 0.0001 1001 1001 1001…(無(wú)限循環(huán))
0.2 => 0.0011 0011 0011 0011…(無(wú)限循環(huán))
雙精度浮點(diǎn)數(shù)的小數(shù)部分最多支持 52 位,所以兩者相加之后得到這么一串 0.0100110011001100110011001100110011001100... 因浮點(diǎn)數(shù)小數(shù)位的限制而截?cái)嗟亩M(jìn)制數(shù)字漾月,這時(shí)候病梢,再把它轉(zhuǎn)換為十進(jìn)制,就成了 0.30000000000000004
*/