成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript類型:關(guān)于類型,有哪些你不知道的細(xì)節(jié)?

JessYanCoding / 787人閱讀

摘要:通過拆箱轉(zhuǎn)換,把對象編程基本類型,再從從基本類型轉(zhuǎn)換成對應(yīng)的或者。拆箱轉(zhuǎn)換會嘗試調(diào)用和來獲得拆箱后的基本類型。

undefined和null

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

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

Number

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

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

??輸出結(jié)果是false,說明兩邊不等,這是浮點(diǎn)運(yùn)算的特點(diǎn),浮點(diǎn)數(shù)運(yùn)算的精度問題導(dǎo)致等式左右并不是嚴(yán)格相等,而是相差了個微小的值。

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

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

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

類型轉(zhuǎn)換

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

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

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

裝箱轉(zhuǎn)換

??每一種基本類型 Number、String、Boolean、Symbol 在對象中都有對應(yīng)的類,所謂裝箱轉(zhuǎn)換,正是把基本類型轉(zhuǎn)換為對應(yīng)的對象,它是類型轉(zhuǎn)換中一種相當(dāng)重要的種類。全局的 Symbol 函數(shù)無法使用 new 來調(diào)用,但我們?nèi)钥梢岳醚b箱機(jī)制來得到一個 Symbol 對象,我們可以利用一個函數(shù)的 call 方法來強(qiáng)迫產(chǎn)生裝箱。我們定義一個函數(shù),函數(shù)里面只有 return this,然后我們調(diào)用函數(shù)的 call 方法到一個 Symbol 類型的值上,這樣就會產(chǎn)生一個 symbolObject。

??我們可以用 console.log 看一下這個東西的 type of,它的值是 object,我們使用 symbolObject instanceof 可以看到,它是 Symbol 這個類的實(shí)例,我們找它的 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

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

??使用內(nèi)置的Object函數(shù),可以在JS代碼中顯式的調(diào)用裝箱能力。

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獲?。?/p>

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

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

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

拆箱轉(zhuǎn)換

??JS標(biāo)準(zhǔn)中,規(guī)定了ToPrimitive函數(shù),它是對象類型到基本類型的轉(zhuǎn)換。(即拆線轉(zhuǎn)換)

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

??拆箱轉(zhuǎn)換會嘗試調(diào)用valueOf和toString來獲得拆箱后的基本類型。如果valueOf和toString都不存在。或者沒有返回基本類型,則會產(chǎn)生類型錯誤的提示TypeError。

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

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

??到 String 的拆箱轉(zhuǎn)換會優(yōu)先調(diào)用 toString。我們把剛才的運(yùn)算從 o*2 換成 o + “”,那么你會看到調(diào)用順序就變了。

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

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/102397.html

相關(guān)文章

  • 重學(xué)前端學(xué)習(xí)筆記(六)--JavaScript類型哪些你不知道細(xì)節(jié)

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

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

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

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

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

    zlyBear 評論0 收藏0
  • 前端增長-你不知道那些細(xì)節(jié)

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

    asce1885 評論0 收藏0

發(fā)表評論

0條評論

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