前端學習筆記(1) - JavaScript類型

背景介紹

我從事前端工作只能有短短的一年,工作要求使我接觸到了前端這個領域。起初對於前端的理解就是html、css、js,但是隨着對前端這個領域的不斷了解,我發現前端遠不止這些。雖然目前我已經能夠根據需求寫出不錯的前端代碼,但是我所掌握度前端知識實際上過於零散,基礎知識的欠缺限制了我解決問題的思路。重新系統的學習一遍前端知識對我來說是非常必要的。此文章主要用來記錄學習中的問題,希望能幫助到同我一樣的前端學習者。

undefined

undefined在JavaScript中是一個變量而非一個關鍵字,這其實是JavaScript的設計失誤之一。在某些瀏覽器中允許你重寫undefined,建議使用void 0來獲取undefined值。

0.1+0.2===0.3???

根據雙精度浮點數的定義Number 類型中有效的整數範圍是-0x1fffffffffffff 至 0x1fffffffffffff,也就說JavaScript無法表示此範圍之外的整數。對於64位浮點數(double)來說,大於1的最小浮點數相當於二進制的1.00..001小數點後面有連續51個零。這個值減去1 之後,就等於2的-52 次方。所以非整數的Number類型數字無法使用==或者===進行比較。正確的比較方法爲:
Math.abs(0.1 + 0.2 - 0.3) <= Number.EPSILON

“類”===“類型”???

由於C++、java等語言中每一個類都有一個類型一一對應,所以很多人將JavaScript中的“類”與類型混淆。實際上JavaScript中無法自定義類型。3與new Number(3)是完全不同的值,一個是number類型,一個是對象類型。
Number、Boolean、String跟new配合可以生成對象,直接調用則是強制類型轉換。Symbol函數比較特殊無法使用new。

裝箱操作

那爲什麼number類型數據可以調用Number對象類型中定義的方法?實際上.運算符進行了一個封箱操作,根據基礎數據類型構造一個臨時對象類型,使得我們可以在基礎數據類型之上調用對象方法。頻繁的裝箱操作會產生大量臨時對象,所以在要求高性能的場景應儘量避免使用裝箱操作。

拆箱轉換

JavaScript中規定了ToPrimitive函數它是對象到基本類型的轉換

    var o = {
        valueOf : () => {console.log("valueOf"); return {}},
        toString : () => {console.log("toString"); return {}}
    }

    o * 2
    // valueOf
    // toString
    // TypeError

類型轉換的內部實現是通過ToPrimitive ( input [ , PreferredType ] )方法進行轉換的,這個方法的作用就是將input轉換成一個非對象類型。參數preferredType是可選的,它的作用是,指出了input被期待轉成的類型。如果不傳preferredType進來,默認的是'number'。如果preferredType的值是"string",那就先執行"toString", 後執行"valueOf"。否則,先執行"valueOf", 後執行"toString"。由此可見,"toString", "valueOf"的執行順序,取決於preferred的值。

結語

參考鏈接 https://time.geekbang.org/column/article/78884

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章