美文网首页
迷之“+”运算

迷之“+”运算

作者: Yuxin_Liu | 来源:发表于2017-02-12 13:47 被阅读0次

一元还是二元?难道是二次元?

一元

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


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

+new Date()可以把当前的GMT时间变成毫秒数,+new Date("----/--/--")可以取参数时间的毫秒数。

二元

作为一个二元运算符的加号,直至最终结果来看的话,只有两种:数值相加、字符串连接。
相加的过程是需要进行一系列判断及操作的,拿A + B举栗:

  1. 左手拿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运算,视为+""的一元运算):
  1. 没有字符串,则按照数字相加的方式去处理

诡异的四种运算(chrome下)

  1. [] + []
    []进行valueOf()之后依然返回[],所以要再进行toString,也就是"",空字符串。两个空字符串加下,依然"";
  2. [] + {}
    既然[]返回的是"",好了那后面那个{}也就按字符串处理了。
  3. {} + []
    {}被视为一段没有任何JS操作的“代码”,像是在宣告“我要开始进行JS运算了”,所以只能从+ []开始进行运算,好哒,变成了一元运算,那就是相当于 + "",也就是0。

JavaScript interprets the first {} as an empty code block and ignores it.

  1. {} + {}
    这个就诡异了,可能不同的浏览器处理方式不同,按照3那种情况来看,明明是等同于+ {},应该返回NaN的。但是Mac下的chrome并没有,而是按照两个字符串加了起来。看来显然是chrome自己“fix”了这个东西而把上面的运算变成了({} + {})

相关文章

网友评论

      本文标题:迷之“+”运算

      本文链接:https://www.haomeiwen.com/subject/pfdaittx.html