一日客语:中文:吃什麽 客语:(ㄘ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大全
结束~
<<: 事件检视器的使用介绍(一)--Windows内建的日志查看程序
>>: 【踩坑】animation 选单按钮动起来(实作篇)
如果上传档案不想使用 preload 档案,也不想用下载的方式,其实可以上传档案至 selenium...
隐私如浮云,多半用户即刻享受当下服务的快感解决需求,至於隐私就都化为浮云飘过视而无见,如同Day 2...
hi~我们今天要讨论有关solidity合约内容,今天的内容会延续昨天的!所以如果还没看昨天的建议...
MyBatis 实际测试 ...
上一篇我们的基因体时代-AI, Data和生物资讯 Day07- 蛋白质结构和机器学习02:Alph...