一日客語:中文:吃什麼 客語:(ㄘ1聲)罵誒
想不到吧~加法可以寫一篇,不要懷疑就是要拖台錢(喂~)
加法不就做字串串接或數字相加之類的
但心中太好奇,為啥JS的加法會做字串串接或數字相加,字串加數字會字串?到底花生什麼事?
先看看ECMA規範怎麼說
想做個加法就要呼叫這些function,人生真難QQ
估算EvaluateStringOrNumericBinaryExpression
ApplyStringOrNumericBinaryOperator(lval,add,rval)
找左運算元
找右運算元
opText:+
ApplyStringOrNumericBinaryOperator(lval,opText,rval)
演算法:
ToPrimitive 是內部方法用來找原始資料類型值(primitive),以後再來談談
我心中的想法:
Symbol type 使用toString 會報錯!
Day7有介紹Symbol:連結
console.log('123'+'789')
//'123789'
'123' 左邊第一個運算元是是string
所以右邊運算元會ToString('789')
會進行字串串接'123789'
console.log('123'+null)
//'123null'
'123'左邊第一個運算元是是string
所以右邊運算元會ToString('null')
會進行字串串接'123null'並return
const a = Symbol('apple');
let temp = '123' + a;
console.log(temp);
//TypeError: Cannot convert a Symbol value to a string
'123'左邊第一個運算元是是string
所以右邊運算元會ToString(Symbol('apple'))
會直接報錯~
console.log(true+'123')
//true123
true為左邊第一個運算元是非String
右邊第一個運算元是'123'
有String!~來呦通通做ToString()
ToString(true)
ToString('123')
會進行字串串接'true123'並return
使用type:Symbol和String會報錯
console.log(50+50)
50為左邊第一個運算元非String
右邊運算元也是非String
進行數值運算
ToNumber(50)+ToNumber(50)=100
console.log(50+null)
//50
50為左邊第一個運算元非String
右邊運算元null也是非String
進行數值運算
ToNumber(50)+ToNumber(null)=50+0=50
console.log(123 + undefined)
//undefined轉成數字是NaN,NaN+任何數都會NaN
console.log(50 + Symbol('30'));
//TypeError: Cannot convert a Symbol value to a number
console.log(50 + 50n);
//TypeError: Cannot mix BigInt and other types, use explicit conversions
可以更清楚知道加法的機制了
目前理解是到這裡...
以為加法就結束了嗎?還沒有完呢 ZZ
[]+[]、{}+{}、[]+{}、{}+[]
這些相加呢?
[]+[] //""
{}+{} //"[object Object][object Object]"
參考來源:
ECMA
JS大全
結束~