初学者跪着学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大全

结束~


<<:  事件检视器的使用介绍(一)--Windows内建的日志查看程序

>>:  【踩坑】animation 选单按钮动起来(实作篇)

自动化 End-End 测试 Nightwatch.js 之踩雷笔记:上传档案II

如果上传档案不想使用 preload 档案,也不想用下载的方式,其实可以上传档案至 selenium...

Day 11 已故用户的隐私设计

隐私如浮云,多半用户即刻享受当下服务的快感解决需求,至於隐私就都化为浮云飘过视而无见,如同Day 2...

[Day24]solidity合约内容讲解2

hi~我们今天要讨论有关solidity合约内容,今天的内容会延续昨天的!所以如果还没看昨天的建议...

MyBatis 实际测试

MyBatis 实际测试 ...

我们的基因体时代-AI, Data和生物资讯 Day08-合成生物学与机器学习

上一篇我们的基因体时代-AI, Data和生物资讯 Day07- 蛋白质结构和机器学习02:Alph...