一元还是二元?难道是二次元?
一元
一元运算相对简单,总的来说就是把那些努努力能转化为number的类型们,转化为number,而对于努力了也不能转化的类型,只能返回NaN了。
console里操作一下就能看出来:

另外的一个冷门用法是获取时间戳:

+new Date()可以把当前的GMT时间变成毫秒数,+new Date("----/--/--")可以取参数时间的毫秒数。
二元
作为一个二元运算符的加号,直至最终结果来看的话,只有两种:数值相加、字符串连接。
相加的过程是需要进行一系列判断及操作的,拿A + B举栗:
- 左手拿A,右手拿B,对A和B分别进行toPrimitive操作;
toPrimitive(obj接受对象,preferredType希望转化为的类型)怎么操作呢:
如果第二个参数为空并且obj为Date的事例时,此时preferredType会被设置为String,其他情况下preferredType都会被设置为Number
被视为Number的时候
(1)如果就是原始类型(null/undefined/boolean/string/number),则返回本身;
(2)如果是对象,先进行obj.valueOf(),是原始值,则返回;
(3)上一步没返回,再进行obj.toString(),是原始值,则返回;
(4)不得已而报错。
被视为String的时候
就是把上面的(2)、(3)换一下。
2.primitive完事儿之后,看这个时候的A和B,但凡有一个是字符串,就按字符串连接的方式操作

(排除{}+""这种情况,{}宣告为JS运算,视为+""的一元运算):
- 没有字符串,则按照数字相加的方式去处理

诡异的四种运算(chrome下)

- [] + []
[]进行valueOf()之后依然返回[],所以要再进行toString,也就是"",空字符串。两个空字符串加下,依然""; - [] + {}
既然[]返回的是"",好了那后面那个{}也就按字符串处理了。 - {} + []
{}被视为一段没有任何JS操作的“代码”,像是在宣告“我要开始进行JS运算了”,所以只能从+ []开始进行运算,好哒,变成了一元运算,那就是相当于 + "",也就是0。
JavaScript interprets the first {} as an empty code block and ignores it.
- {} + {}
这个就诡异了,可能不同的浏览器处理方式不同,按照3那种情况来看,明明是等同于+ {},应该返回NaN的。但是Mac下的chrome并没有,而是按照两个字符串加了起来。看来显然是chrome自己“fix”了这个东西而把上面的运算变成了({} + {})
网友评论