iT邦幫忙

2021 iThome 鐵人賽

DAY 12
0
Modern Web

初學者跪著學JavaScript系列 第 12

初學者跪著學JavaScript Day12 : 麻煩的JS加法

一日客語:中文:吃什麼 客語:(ㄘ1聲)罵誒
想不到吧~加法可以寫一篇,不要懷疑就是要拖台錢(喂~)
加法不就做字串串接或數字相加之類的
但心中太好奇,為啥JS的加法會做字串串接或數字相加,字串加數字會字串?到底花生什麼事?

先看看ECMA規範怎麼說

The Addition Operator(+)

想做個加法就要呼叫這些function,人生真難QQ

  • EvaluateStringOrNumericBinaryExpression(AdditiveExpression,+,Multiplication Expression)
  • ApplyStringOrNumericBinaryOperator(lval,opText,rval)

估算EvaluateStringOrNumericBinaryExpression


ApplyStringOrNumericBinaryOperator(lval,add,rval)

找左運算元
找右運算元
opText:+


ApplyStringOrNumericBinaryOperator(lval,opText,rval)

演算法:

ToPrimitive 是內部方法用來找原始資料類型值(primitive),以後再來談談

我心中的想法:

ToString:

Symbol type 使用toString 會報錯!

Day7有介紹Symbol:連結

相加

字串1+字串2

console.log('123'+'789')
//'123789'

'123' 左邊第一個運算元是是string

所以右邊運算元會ToString('789')

會進行字串串接'123789'

字串+非字串

console.log('123'+null)
//'123null'

'123'左邊第一個運算元是是string

所以右邊運算元會ToString('null')

會進行字串串接'123null'並return

字串+Symbol() 會報錯!

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


ToNumber

使用type:Symbol和String會報錯


數字+數字

console.log(50+50)

50為左邊第一個運算元非String
右邊運算元也是非String
進行數值運算

ToNumber(50)+ToNumber(50)=100


數字+null

console.log(50+null)
//50

50為左邊第一個運算元非String
右邊運算元null也是非String
進行數值運算

ToNumber(50)+ToNumber(null)=50+0=50


數字+Undefined

console.log(123 + undefined)
//undefined轉成數字是NaN,NaN+任何數都會NaN 

數字+Symbol 會報錯!

console.log(50 + Symbol('30'));
//TypeError: Cannot convert a Symbol value to a number

數字+BigInt 會報錯!

console.log(50 + 50n);
//TypeError: Cannot mix BigInt and other types, use explicit conversions

可以更清楚知道加法的機制了

目前理解是到這裡...

以為加法就結束了嗎?還沒有完呢 ZZ

[]+[]、{}+{}、[]+{}、{}+[]

這些相加呢?

[]+[] //""
{}+{} //"[object Object][object Object]"


參考來源:
ECMA
JS大全

結束~


上一篇
初學者跪著學JavaScript Day11 : 運算子的優先順序
下一篇
初學者跪著學JavaScript Day13 : 物件加字串?物件加物件?
系列文
初學者跪著學JavaScript30

1 則留言

0
南國ㄟ安迪
iT邦新手 5 級 ‧ 2021-09-27 12:27:10

今天很溫蒂,可以

我要留言

立即登入留言