理解JS中的加號運算符

clipboard.png

基本運算規則

+的使用有兩種狀況
+鏈接兩個變量或值時即爲二元運算符,好比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

參考

深刻理解Javascript中Object類型的轉換字符串

相關文章
相關標籤/搜索