參考: winter 的重學(xué)前端
字符串到數(shù)字
使用 Number() 轉(zhuǎn)換
Number() 支持十進(jìn)制彻况、二進(jìn)制裆泳、八進(jìn)制和十六進(jìn)制敞掘,和科學(xué)計(jì)數(shù)法
Number('123') // 123 十進(jìn)制
Number('0b111') // 7 二進(jìn)制
Number('0o13') // 11 八進(jìn)制
Number('0xc') // 12 十六進(jìn)制
Number('2e3') // 2000 科學(xué)計(jì)數(shù)法
Number('123ab') // NaN 出現(xiàn)非數(shù)字字符
parseInt() 和 Number() 的區(qū)別
parseInt
和 parseFloat
并不使用上述轉(zhuǎn)換規(guī)則刊侯,所以支持的語(yǔ)法跟這里不盡相同宾娜。在不傳入第二個(gè)參數(shù)的情況下,parseInt
只支持16進(jìn)制前綴“0x”吩谦,而且會(huì)忽略非數(shù)字字符鸳谜,也不支持科學(xué)計(jì)數(shù)法。多數(shù)情況下 Number 是比 parseInt
和 parseFloat
更好的選擇式廷。
數(shù)字到字符串
- 在較小的范圍內(nèi)咐扭,數(shù)字到字符串的轉(zhuǎn)換是完全符合你直覺(jué)的十進(jìn)制表示。
- Number絕對(duì)值較大或者較小時(shí)滑废,字符串表示則是使用科學(xué)計(jì)數(shù)法表示蝗肪。(可能是避免產(chǎn)生的字符串太長(zhǎng))
基本類(lèi)型裝箱轉(zhuǎn)換為對(duì)象
每一種基本類(lèi)型Number、String蠕趁、Boolean薛闪、Symbol在對(duì)象中都有對(duì)應(yīng)的類(lèi)。所謂裝箱轉(zhuǎn)換俺陋,正是把基本類(lèi)型轉(zhuǎn)換為對(duì)應(yīng)的對(duì)象豁延。
怎么顯式轉(zhuǎn)換呢昙篙?
直接使用 new
對(duì)應(yīng)的類(lèi)。之后就能使用對(duì)應(yīng) 的方法了诱咏。
new Number(123) // Number {123}
new String("abc") // String {"abc"}
new Boolean(true) // Boolean {true}
使用 .
運(yùn)算符產(chǎn)生臨時(shí)對(duì)象
// . 運(yùn)算符 產(chǎn)生一個(gè)臨時(shí)對(duì)象苔可,使得 "123" 能夠使用對(duì)象的方法
"123".length // 3
上面的示例中,.
運(yùn)算符的作用大致相當(dāng)于 new String()
var strObj = new String("123")
strObj.length // 3
特殊的 Symbol
Symbol 對(duì)象不能直接 new 出來(lái)胰苏。但可以使用內(nèi)置的 Object 函數(shù)硕蛹,我們可以在JavaScript代碼中顯式調(diào)用裝箱能力。
var symbolObject = Object(Symbol("a"))
typeof symbolObject // "object"
判別裝箱轉(zhuǎn)換后的對(duì)象對(duì)應(yīng)的基本類(lèi)型
每一類(lèi)裝箱對(duì)象皆有私有的 Class 屬性硕并,這些屬性可以用 Object.prototype.toString
獲取
var strObj = new String('abc') // strObj 是一個(gè)對(duì)象
var symObj = Object(Symbol('sym')) // symObj 是一個(gè)對(duì)象
Object.prototype.toString.call(strObj) // "[object String]"
Object.prototype.toString.call(symObj) // "[object Symbol]"
在 JavaScript 中法焰,沒(méi)有任何方法可以更改私有的 Class 屬性,因此Object.prototype.toString
是可以準(zhǔn)確識(shí)別對(duì)象對(duì)應(yīng)的基本類(lèi)型的方法倔毙,它比 instanceof
更加準(zhǔn)確埃仪。
對(duì)象拆箱轉(zhuǎn)換為基本類(lèi)型
在JavaScript標(biāo)準(zhǔn)中,規(guī)定了 ToPrimitive 函數(shù)陕赃,它是對(duì)象類(lèi)型到基本類(lèi)型的轉(zhuǎn)換(即卵蛉,拆箱轉(zhuǎn)換)。
對(duì)象到 String 和 Number 的轉(zhuǎn)換都遵循“先拆箱再轉(zhuǎn)換”的規(guī)則么库。通過(guò)拆箱轉(zhuǎn)換傻丝,把對(duì)象變成基本類(lèi)型,再?gòu)幕绢?lèi)型轉(zhuǎn)換為對(duì)應(yīng)的 String 或者 Number诉儒。
拆箱轉(zhuǎn)換過(guò)程
拆箱轉(zhuǎn)換會(huì)嘗試調(diào)用 valueOf 和 toString 來(lái)獲得拆箱后的基本類(lèi)型葡缰。如果 valueOf 和 toString 都不存在,或者沒(méi)有返回基本類(lèi)型忱反,則會(huì)產(chǎn)生類(lèi)型錯(cuò)誤 TypeError泛释。默認(rèn)先調(diào)用 valueOf
,如果valueOf
返回的值不對(duì)再調(diào)用toString
温算,依然不對(duì)就會(huì)報(bào)錯(cuò)怜校。
var o = {
valueOf : () => {console.log("valueOf"); return {} },
toString : () => {console.log("toString"); return {} },
}
o * 2 // valueOf // toString // TypeError
覆蓋拆箱轉(zhuǎn)換默認(rèn)行為
通過(guò)顯式指定對(duì)象的 toPrimitive Symbol
來(lái)覆蓋原有的行為。
o[Symbol.toPrimitive] = () => {
console.log("toPrimitive")
return "hello"
}
o + '' // 'hello'
typeof 結(jié)果與運(yùn)行時(shí)類(lèi)型對(duì)比
永遠(yuǎn)不用隱式轉(zhuǎn)換
規(guī)則復(fù)雜注竿,不要浪費(fèi)寶貴的精力去記憶這種東西茄茁。需要轉(zhuǎn)換的時(shí)候,應(yīng)該用顯式轉(zhuǎn)換巩割,不要省這點(diǎn)功夫胰丁。
真要用,用的時(shí)候再上網(wǎng)查