最近在學習的途中發現了javascript
中一些有趣又不理解的特性,於是乎就發出來和大家一起分享分享。這些看似不理解的東西其實和我們的基礎相關,於是就好好的查詢資料,本著加強基礎的想法把這些東西弄得。當然這裡面還有好多一知半解和一些根本不知道的,希望有大佬可以解釋一下。
看著這些有沒有一種被欺騙的感jio,為什麼輸入9999999999999999
得到的是10000000000000000
,為什麼0.5+0.1==0.6
而0.1+0.2
就不等於0.3
了,還有最奇怪的是[] == ![]
。
不急~~~,讓我們來冷靜分析。
1、typeof NaN
其實這是一個很簡單的題目,NaN是一種特殊的number。通常都是在計算失敗時,作為 Math 的某個方法的返回值出現(例如:Math.sqrt(-10)),或嘗試將一個字串解析成數字但失敗了的時候(例如:parseInt("aaa"))。並且注意NaN == NaN
是false
,但是我們可以用Object.is()
方法來判斷兩個值是否相等;
2、9999999999999999
在javascript
中只有一種數值型別(number
),javascript
沒有真正意義上的整數,整數就是不帶沒有小數的十進位制數,產生這種原因是因為javascript
在計算的時候會有浮點數誤差。
3、0.1 + 0.2 !== 0.3
javascript
中的數字型別是基於IEEE 754
標準來實現的,該標準也通常被稱為“浮點數”,由於在二進位制浮點數中0.1
和0.2
並不是十分精確,所以0.1+0.2
不等於0.3
。但是我們可以使用Number.EPSILON()
,來判斷兩個數是否在機器精度的誤差範圍內。
點選這裡瞭解更詳細
4、Math.max()&Math.min()
Math.min()
返回了Infinity
,這個值對應了Number.POSITIVE_INFINITY
常量。Math.max()
返回了-Infinity
,這個值對應了Number.NEGATIVE_INFINITY
常量。
我真的也不知道為什麼(腦殼痛),這兩個方法在我們平常的使用中都會傳入至少兩個引數,但是如果不傳引數就會返回這樣的結果,真讓人摸不著頭腦,就算丟擲個錯誤感覺也比這樣要好一些。
5、[] !== [] but [] == ![]
[] !== []
,因為陣列是引用值,當我們建立了兩個陣列的陣列的時候,它們的指標指向堆中的記憶體空間不相同所以不相等。[] == ![]
,這看起來似乎有點瘋狂,因為!
的優先順序高於==
所以先進行![]
的轉換,!
可將變數轉換成布林型別,null
、undefined
、NaN
以及空字串('')取反都為true
,其餘都為false
,所以[] == ![]
變為[] == false
,所以[] == ![]
。
6、[] + {} = "[object Object]"
這裡的,{}
出現在+
運算子表示式中,{}
被當作一個空物件來處理,{}
會被強制轉換為"[object Object]"
,[]
會被強制轉換為""
,所+
執行字串拼接操作結果為"[object Object]"
7、{} + [] = 0
這裡的{}有些不同,它會被當作一個程式碼塊來處理,所以最後的結果相當於執行+[]
,然後[]
被強制轉換為0
;
最後轉換的程式碼如下:
{
}
+[]
複製程式碼
8、91 - '1' & 9 + '1'
- 91 - '1':這裡
-
先將'1'
強制轉換為1,然後再執行數值的相減操作 - 9 + '1':這裡執行的是字串拼接操作
9、parseInt(1/0, 19)
因為1/0
的結果是Infinity
,所以parseInt(1/0, 19)
相當於parseInt('Infinity', 19)
,因為第一個字元是'I'
,以19
為基數時值為18
。
10、typeof a
雖然這裡的a
還沒有被定義但是typeof a
的返回結果任然是undefined
,著也許是JavaScript
設計的一個缺陷,在ES6
之前typeo
f是一個絕對安全的操作,因為不會丟擲錯誤,但是再ES6
之後意味著typeof
不是絕對安全的操作了:
let
宣告的變數存在一個暫時性死區。
11、NaN !== NaN
這也許是javascript中唯一一個自身不等於自身的值了,但是可以通過Object.is(NaN,NaN),來判斷,最後得到的結果是true。
12、.42 == 0.42
因為JavaScript中規定小數點前面的0可以省略。相信大家在CSS中也用過,transition: width .2s
。
13、[1][0] == 1
這裡相當於把[1]看作一個陣列,然後取它的第0項的值。 相當於:
let arr = [1]
arr[0]
複製程式碼
14、== & ===
==
允許在相等比較中進行強制型別轉換,而===
不允許。所以true == 1
結果為true
true===1
結果為false
由於本人才疏學淺,肯定有表述不是很正確的地方,敬請各位斧正。