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