国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScript類型:關于類型,有哪些你不知道的細節?

JessYanCoding / 785人閱讀

摘要:通過拆箱轉換,把對象編程基本類型,再從從基本類型轉換成對應的或者。拆箱轉換會嘗試調用和來獲得拆箱后的基本類型。

undefined和null

??Undefined類型表示未定義,它的類型只有一個值為undefined。任何變量在賦值前都是undefined類型,值為undefined。但是JS中undefined是一個變量,并非是一個關鍵字,為了避免無意中的篡改,使用void 0來獲取undefined值。

??undefined和null有一定的表意差別,null表示“定義了但是為空”,它只一個值為null,并且是JS關鍵字,可以放心使用。

Number

??非整數的Number類型無法使用 == 或 === 來比較,有一段著名的代碼

console.log(0.1 + 0.2 == 0.3);

??輸出結果是false,說明兩邊不等,這是浮點運算的特點,浮點數運算的精度問題導致等式左右并不是嚴格相等,而是相差了個微小的值。

??正確的比較方法是使用JS提供的最小精度值:

console.log(Math.abs(0.1 + 0.2 -0.3) <= Number.EPSILON);

??檢查等式左右兩邊差的絕對值是否小于最小精度值,才是正確的比較浮點數的方法。

類型轉換

??因為 JS 是弱類型語言,所以類型轉換發生非常頻繁,大部分我們熟悉的運算都會先進行類型轉換。大部分類型轉換符合人類的直覺,但是如果我們不去理解類型轉換的嚴格定義,很容易造成一些代碼中的判斷失誤。其中最為臭名昭著的是 JS 中的“ == ”運算,因為試圖實現跨類型的比較,它的規則太過復雜。很多實踐中推薦禁止使用“ ==”,而要求程序員進行顯式地類型轉換后,用 === 比較。

??parseInt 和 parseFloat 是很常用的類型轉換的方法。在不傳入第二個參數的情況下,parseInt 只支持 16 進制前綴“0x”,而且會忽略非數字字符,也不支持科學計數法。在一些古老的瀏覽器環境中,parseInt 還支持 0 開頭的數字作為 8 進制前綴,這是很多錯誤的來源。所以在任何環境下,都建議傳入 parseInt 的第二個參數,而 parseFloat 則直接把原字符串作為十進制來解析,它不會引入任何的其他進制。

??多數情況下,Number 是比 parseInt 和 parseFloat 更好的選擇。

裝箱轉換

??每一種基本類型 Number、String、Boolean、Symbol 在對象中都有對應的類,所謂裝箱轉換,正是把基本類型轉換為對應的對象,它是類型轉換中一種相當重要的種類。全局的 Symbol 函數無法使用 new 來調用,但我們仍可以利用裝箱機制來得到一個 Symbol 對象,我們可以利用一個函數的 call 方法來強迫產生裝箱。我們定義一個函數,函數里面只有 return this,然后我們調用函數的 call 方法到一個 Symbol 類型的值上,這樣就會產生一個 symbolObject。

??我們可以用 console.log 看一下這個東西的 type of,它的值是 object,我們使用 symbolObject instanceof 可以看到,它是 Symbol 這個類的實例,我們找它的 constructor 也是等于 Symbol 的,所以我們無論哪個角度看,它都是 Symbol 裝箱過的對象:

    
var symbolObject = (function(){ 
    return this; 
}).call(Symbol("a"));

console.log(typeof symbolObject);         //object
console.log(symbolObject instanceof Symbol);     //true
console.log(symbolObject.constructor == Symbol);    //true

??裝箱機制會頻繁產生臨時對象,在一些對性能要求較高的場景下,我們應該盡量避免對基本類型做裝箱轉換。

??使用內置的Object函數,可以在JS代碼中顯式的調用裝箱能力。

var symbolObject = Object((Symbol("a"));

console.log(typeof symbolObject);         //object
console.log(symbolObject instanceof Symbol);     //true
console.log(symbolObject.constructor == Symbol);     //true

??每一類裝箱對象皆有私有的Class屬性,這些屬性可以用Object.protoype.toString獲取:

var symbolObject = Object((Symbol("a"));
console.log(Object.prototype.toString.call(symbolObject)); //[object Symbol]

??JS中,沒有方法可以更改私有的Class屬性,因此Object.prototype.toString是可以準確識別對象對應的基本類型的方法,它比instanceof更加準確。

??但需要注意的是,call 本身會產生裝箱操作,所以需要配合typeof來區分基本類型還是對象類型。

拆箱轉換

??JS標準中,規定了ToPrimitive函數,它是對象類型到基本類型的轉換。(即拆線轉換)

??對象到String和Number的轉換都遵循“先拆箱再轉換”的規則。通過拆箱轉換,把對象編程基本類型,再從從基本類型轉換成對應的String或者Number。

??拆箱轉換會嘗試調用valueOf和toString來獲得拆箱后的基本類型。如果valueOf和toString都不存在?;蛘邲]有返回基本類型,則會產生類型錯誤的提示TypeError。

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

??我們定義了一個對象 o,o 有 valueOf 和 toString 兩個方法,這兩個方法都返回一個對象,然后我們進行 o * 2 這個運算的時候,你會看見先執行了 valueOf,接下來是 toString,最后拋出了一個 TypeError,這就說明了這個拆箱轉換失敗了。

??到 String 的拆箱轉換會優先調用 toString。我們把剛才的運算從 o*2 換成 o + “”,那么你會看到調用順序就變了。

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/102397.html

相關文章

  • 重學前端學習筆記(六)--JavaScript類型哪些你不知道細節?

    摘要:的碼點被稱為基本字符區域。關于的介紹,我準備用文檔阮一峰來做一些介紹,具體的可以參考文檔引入的原因的對象屬性名都是字符串,這容易造成屬性名的沖突。其他的一些屬性可以去看文檔阮一峰注意函數前不能使用命令,否則會報錯。 筆記說明 重學前端是程劭非(winter)【前手機淘寶前端負責人】在極客時間開的一個專欄,每天10分鐘,重構你的前端知識體系,筆者主要整理學習過程的一些要點筆記以及感悟,完...

    Lsnsh 評論0 收藏0
  • 重學前端學習筆記(六)--JavaScript類型哪些你不知道細節?

    摘要:的碼點被稱為基本字符區域。關于的介紹,我準備用文檔阮一峰來做一些介紹,具體的可以參考文檔引入的原因的對象屬性名都是字符串,這容易造成屬性名的沖突。其他的一些屬性可以去看文檔阮一峰注意函數前不能使用命令,否則會報錯。 筆記說明 重學前端是程劭非(winter)【前手機淘寶前端負責人】在極客時間開的一個專欄,每天10分鐘,重構你的前端知識體系,筆者主要整理學習過程的一些要點筆記以及感悟,完...

    joyvw 評論0 收藏0
  • 重學前端學習筆記(六)--JavaScript類型哪些你不知道細節

    摘要:的碼點被稱為基本字符區域。關于的介紹,我準備用文檔阮一峰來做一些介紹,具體的可以參考文檔引入的原因的對象屬性名都是字符串,這容易造成屬性名的沖突。其他的一些屬性可以去看文檔阮一峰注意函數前不能使用命令,否則會報錯。 筆記說明 重學前端是程劭非(winter)【前手機淘寶前端負責人】在極客時間開的一個專欄,每天10分鐘,重構你的前端知識體系,筆者主要整理學習過程的一些要點筆記以及感悟,完...

    zlyBear 評論0 收藏0
  • 前端增長-你不知道那些細節

    摘要:前端增長重新定義大前端精心打造全新課程,歡迎吐槽反饋寶貴意見在線課程前端增長你不知道的那些細節附贈常見核心前端面試問題與詳細解答官方博客前端學堂課件腦圖下載課程介紹前端知識點很多,很細碎。 showImg(https://segmentfault.com/img/bVbu250?w=500&h=497);前端增長-重新定義大前端 精心打造全新課程,歡迎吐槽!反饋寶貴意見! 在線課程:前...

    asce1885 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<