javascript
JavaScript君,请您坦诚相待~~~
最近在學習的途中發現了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之前typeof是一個絕對安全的操作,因為不會拋出錯誤,但是再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
由于本人才疏學淺,肯定有表述不是很正確的地方,敬請各位斧正。
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的JavaScript君,请您坦诚相待~~~的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Cloud Alibaba
- 下一篇: Flutter入门篇(一)