摘要:通過拆箱轉(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
摘要:的碼點(diǎn)被稱為基本字符區(qū)域。關(guān)于的介紹,我準(zhǔn)備用文檔阮一峰來做一些介紹,具體的可以參考文檔引入的原因的對象屬性名都是字符串,這容易造成屬性名的沖突。其他的一些屬性可以去看文檔阮一峰注意函數(shù)前不能使用命令,否則會報錯。 筆記說明 重學(xué)前端是程劭非(winter)【前手機(jī)淘寶前端負(fù)責(zé)人】在極客時間開的一個專欄,每天10分鐘,重構(gòu)你的前端知識體系,筆者主要整理學(xué)習(xí)過程的一些要點(diǎn)筆記以及感悟,完...
摘要:的碼點(diǎn)被稱為基本字符區(qū)域。關(guān)于的介紹,我準(zhǔn)備用文檔阮一峰來做一些介紹,具體的可以參考文檔引入的原因的對象屬性名都是字符串,這容易造成屬性名的沖突。其他的一些屬性可以去看文檔阮一峰注意函數(shù)前不能使用命令,否則會報錯。 筆記說明 重學(xué)前端是程劭非(winter)【前手機(jī)淘寶前端負(fù)責(zé)人】在極客時間開的一個專欄,每天10分鐘,重構(gòu)你的前端知識體系,筆者主要整理學(xué)習(xí)過程的一些要點(diǎn)筆記以及感悟,完...
摘要:的碼點(diǎn)被稱為基本字符區(qū)域。關(guān)于的介紹,我準(zhǔn)備用文檔阮一峰來做一些介紹,具體的可以參考文檔引入的原因的對象屬性名都是字符串,這容易造成屬性名的沖突。其他的一些屬性可以去看文檔阮一峰注意函數(shù)前不能使用命令,否則會報錯。 筆記說明 重學(xué)前端是程劭非(winter)【前手機(jī)淘寶前端負(fù)責(zé)人】在極客時間開的一個專欄,每天10分鐘,重構(gòu)你的前端知識體系,筆者主要整理學(xué)習(xí)過程的一些要點(diǎn)筆記以及感悟,完...
摘要:前端增長重新定義大前端精心打造全新課程,歡迎吐槽反饋寶貴意見在線課程前端增長你不知道的那些細(xì)節(jié)附贈常見核心前端面試問題與詳細(xì)解答官方博客前端學(xué)堂課件腦圖下載課程介紹前端知識點(diǎn)很多,很細(xì)碎。 showImg(https://segmentfault.com/img/bVbu250?w=500&h=497);前端增長-重新定義大前端 精心打造全新課程,歡迎吐槽!反饋寶貴意見! 在線課程:前...
閱讀 3082·2021-11-24 10:34
閱讀 3339·2021-11-22 13:53
閱讀 2643·2021-11-22 12:03
閱讀 3612·2021-09-26 09:47
閱讀 3020·2021-09-23 11:21
閱讀 4825·2021-09-22 15:08
閱讀 3308·2021-07-23 10:59
閱讀 1271·2019-08-29 18:31