JavaScript君,請您坦誠相待~~~

Ilion發表於2019-03-02

最近在學習的途中發現了javascript中一些有趣又不理解的特性,於是乎就發出來和大家一起分享分享。這些看似不理解的東西其實和我們的基礎相關,於是就好好的查詢資料,本著加強基礎的想法把這些東西弄得。當然這裡面還有好多一知半解和一些根本不知道的,希望有大佬可以解釋一下

JavaScript君,請您坦誠相待~~~
JavaScript君,請您坦誠相待~~~

看著這些有沒有一種被欺騙的感jio,為什麼輸入9999999999999999得到的是10000000000000000,為什麼0.5+0.1==0.60.1+0.2就不等於0.3了,還有最奇怪的是[] == ![]

JavaScript君,請您坦誠相待~~~

不急~~~,讓我們來冷靜分析。

1、typeof NaN

其實這是一個很簡單的題目,NaN是一種特殊的number。通常都是在計算失敗時,作為 Math 的某個方法的返回值出現(例如:Math.sqrt(-10)),或嘗試將一個字串解析成數字但失敗了的時候(例如:parseInt("aaa"))。並且注意NaN == NaNfalse,但是我們可以用Object.is()方法來判斷兩個值是否相等;

JavaScript君,請您坦誠相待~~~

2、9999999999999999

javascript中只有一種數值型別(number),javascript沒有真正意義上的整數,整數就是不帶沒有小數的十進位制數,產生這種原因是因為javascript在計算的時候會有浮點數誤差。

3、0.1 + 0.2 !== 0.3

javascript中的數字型別是基於IEEE 754標準來實現的,該標準也通常被稱為“浮點數”,由於在二進位制浮點數中0.10.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 [] == ![]

  • [] !== [],因為陣列是引用值,當我們建立了兩個陣列的陣列的時候,它們的指標指向堆中的記憶體空間不相同所以不相等。
  • [] == ![],這看起來似乎有點瘋狂,因為!的優先順序高於==所以先進行![]的轉換,可將變數轉換成布林型別,nullundefinedNaN以及空字串('')取反都為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之前typeof是一個絕對安全的操作,因為不會丟擲錯誤,但是再ES6之後意味著typeof不是絕對安全的操作了:

JavaScript君,請您坦誠相待~~~
可以看到在在在用宣告該變數之前就使用該變數會丟擲一個錯誤,因為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




由於本人才疏學淺,肯定有表述不是很正確的地方,敬請各位斧正。

相關文章