javascript
html中隐式转换成数字,关于 JS 类型隐式转换的完整总结
作者:原罪
來(lái)源:SegmentFault 思否社區(qū)
不管是在技術(shù)聊天群還是論壇里,總能碰到 x + y 等于多少的問(wèn)題,比如 ,如果你不了解其中的原理,那么就插不上話,只能眼睜睜地等大佬解答了。
Type
說(shuō)到底還是JS類型轉(zhuǎn)換的問(wèn)題,首先我們先溫習(xí)一下JS的7種內(nèi)置類型:
Number
String
Boolean
Null
Undefined
Object
Symbol
是不是感覺(jué)還有Function,畢竟能用typeof獲取到?不,函數(shù)、數(shù)組都是Object的子類型。
類型分為和兩種,除了對(duì)象,其它都是基本類型。
To Primitive
發(fā)音:[ pr m t v]
結(jié)構(gòu):toPrimitive(input, preferedType = number)
在對(duì)象的隱式轉(zhuǎn)換中,對(duì)象需要先轉(zhuǎn)成基本類型,并按照如下順序執(zhí)行。
對(duì)象會(huì)先調(diào)用。
如果沒(méi)有valueOf這個(gè)方法或者valueOf返回的類型不是基本類型,那么對(duì)象會(huì)繼續(xù)調(diào)用方法。
如果沒(méi)有toString這個(gè)方法或者toString返回的類型不是基本類型,那么直接拋出異常。
接著,我們看下各個(gè)對(duì)象的轉(zhuǎn)換實(shí)現(xiàn)
ate的默認(rèn)preferedType=string,即在加法運(yùn)算中先執(zhí)行toString()。在 - | * | / | +x | -x 等運(yùn)算中,先執(zhí)行valueOf()數(shù)組的toString()可以等效為
其中,數(shù)組toString()時(shí),遇到null, undefined都被忽略,遇到symbol直接報(bào)錯(cuò),遇到?jīng)]有toString()的對(duì)象也報(bào)錯(cuò)。
To Number
一些特殊值轉(zhuǎn)為數(shù)字的例子,等下要用到
加減法 +-
加減法運(yùn)算中遵循了一些隱式轉(zhuǎn)換規(guī)則:
遇到對(duì)象先執(zhí)行ToPrimitive轉(zhuǎn)換為基本類型,然后按照基本類型的規(guī)則處理
加法過(guò)程中,遇到字符串,則會(huì)被處理為
上面的對(duì)象最后也都轉(zhuǎn)成了字符串,遵循本條規(guī)則。接著來(lái)幾個(gè)純字符串的例子
減法操作時(shí),一律需要把類型轉(zhuǎn)換為Number,進(jìn)行數(shù)學(xué)運(yùn)算
加法操作時(shí),遇到非字符串的基本類型,都會(huì)轉(zhuǎn)Number
+ x 和 一元運(yùn)算 +x 是等效的(以及- x),都會(huì)強(qiáng)制轉(zhuǎn)換成Number
回到一開始拋出的問(wèn)題,這樣太簡(jiǎn)單了吧?
對(duì)象字面量{}在最前面則不代表對(duì)象
不是對(duì)象是什么?是你的八塊腹肌?別急,看看經(jīng)典的例子
這啥玩意?說(shuō)好的"[object Object]"呢?
好吧,這是其實(shí)代表的是代碼塊,最后就變成了,根據(jù)前面的原則,數(shù)組先被轉(zhuǎn)換成字符串,接著因?yàn)?#43;x的運(yùn)算,字符串被轉(zhuǎn)成數(shù)字。
那 { a: 2 } 總該是對(duì)象了吧?其實(shí)這時(shí)候不是代表對(duì)象屬性,而是被當(dāng)成了標(biāo)簽(label),標(biāo)簽這東西IE6就已經(jīng)有了。所以如果我們寫成 這樣是會(huì)報(bào)錯(cuò)的,逗號(hào)要改成分號(hào)才能通過(guò)編譯。
symbol不能加減
如果在表達(dá)式中有symbol類型,那么就會(huì)直接報(bào)錯(cuò)。比如報(bào)錯(cuò)如下:
寬松相等 ==
相等于全等都需要對(duì)類型進(jìn)行判斷,當(dāng)類型不一致時(shí),寬松相等會(huì)觸發(fā)隱式轉(zhuǎn)換。下面介紹規(guī)則:
對(duì)象與對(duì)象類型一致,不做轉(zhuǎn)換
對(duì)象與基本類型,對(duì)象先執(zhí)行ToPrimitive轉(zhuǎn)換為基本類型
數(shù)字與字符串類型對(duì)比時(shí),字符串總是轉(zhuǎn)換成數(shù)字
布爾值先轉(zhuǎn)換成數(shù)字,再按數(shù)字規(guī)則操作
null、undefined、symbol
null、undefined與任何非自身的值對(duì)比結(jié)果都是false,但是 是一個(gè)特例。
對(duì)比
對(duì)比不像相等,可以嚴(yán)格相等(===)防止類型轉(zhuǎn)換,對(duì)比一定會(huì)存在隱式類型轉(zhuǎn)換。
對(duì)象總是先執(zhí)行ToPrimitive為基本類型
任何一邊出現(xiàn)非字符串的值,則一律轉(zhuǎn)換成數(shù)字做對(duì)比
總結(jié)
以上是生活随笔為你收集整理的html中隐式转换成数字,关于 JS 类型隐式转换的完整总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Canvas X Draw for Ma
- 下一篇: gradle idea java ssm