+
的使用有兩種狀況
當+
鏈接兩個變量或值時即爲二元運算符,好比a + b
,當+
在變量或值前面時,則爲一元運算符,好比+'12.1'
javascript
直接轉換爲Number類型,至關於Number()
經常使用的還有!
運算符,用來轉爲Boolean類型java
加法,能夠認爲只有兩種狀況
一、數字 + 數字
二、字符串 + 字符串
其餘類型的值相加最終都會隱式轉換爲上述兩種類型相加。node
JS中的基本數據類型(primitives)有6種,
String、Number、Boolean、undefined、null、Symbol
引用數據類型則是指除了上述基本數據類型之外的全部值,好比Array、Function
加法的隱式轉換:面試
當須要轉換爲原始值時,JS引擎內部會進行抽象操做ToPrimitive()
。chrome
ToPrimitive(input,PreferredType?) // 若是爲原始值則直接返回 // 若是爲引用數據類型則 // 一、先嚐試調用valueOf()方法,若是返回值爲原始值,則返回該值 // 二、不然,嘗試調用toString()方法,若是返回值爲原始值,則返回該值 // 三、不然,拋出異常 // 注: // 一、若是第二個參數PreferedType爲String,則2和3順序調換,即先調用toString。 // 二、PreferedType默認爲Number,但在遇到Date類型的值時爲String
具體轉換規則能夠參考ECMA規範中9.1的ToPrimitive和[[DefaultValue]]部分spa
規則爲:code
類型 | 結果 |
---|---|
undefined | NaN |
null | 0 |
Boolean | true爲1,false爲0 |
Number | / |
String | 轉數字,"" -> 0 |
Object | 先ToPrimitive轉爲原始值再轉爲數字 |
直接轉換,不作贅述,對象類型時參考數字的處理對象
[] + {} // 結果爲 '[object Object]' [] + [] // 結果爲 '' {} + {} // 結果爲 NaN {} + [] // 結果爲 0,當語句開始爲{時,會被JS解釋器認爲是代碼塊,因此實質上是 +[] {} + {} // 結果爲NaN,緣由同上
注:第五道面試題在node.js環境下的運行結果倒是'[object Object]'
,node和chrome一樣使用了V8引擎,想來是對此作了特殊處理ip