一元正号带你装逼带你飞

发布时间:2019-01-03 来源:网络


前面我们讲到过+new Date()可以拿到当前的时间戳,这里面+扮演了很重要的角色,接下来我们就深究一下它到底有什么用

一元正号运算符位于其操作数前面,计算其操作数的数值,如果操作数不是一个数值,会尝试将其转换成一个数值。是转换其它对象到数值的最快方法,也是最推荐的方法,因为它不会对数值执行任何多与操作。

下面是对常见数据的操作:

+10                // 10
+"10"              // 10
+true              // 1
+false             // 0
+null              // 0
+undefined         // NaN
+function(val){}   //NaN

那么理论上来讲+new Date()也应该返回NaN才是,为什么会得到当前时间戳呢?

如果被转换的是对象,则会遵循对象到原始值的转换规则转换为原始值,一次选择valueOftoString方法进行转换。

接下来我们就来验证一下这个规则

var a = {
    name: 'tom'
}

+a

理所当然,上面的+a会返回NaN,按照我们的推论,该对象上的valueOftoString这俩方法都不会返回有效的数值。

a.valueOf()会返回原对象,a.toString()会返回[object Object],的确都不是数值。

接着,我们做一下修改,给该对象加上自定义的toString方法

var a = {
    name: 'tom',
    toString: function(){
        return 10
    }
};

+a

这时+a的值就是10了,因为a.toString()返回10.

接着验证,再给该对象加上valueOf方法

var a = {
    name: 'tom',
    toString: function(){
        return 10
    }
    valueOf: function(){
        return 20
    }
};

+a

不出所料,+a的值为20,以为a.valueOf()返回20,同时在对象转换为原始值的时候,a.valueOf的优先级比a.toString()要高。

parseInt()方法也具有类似的效果,但是有一个区别就是,parseInt()只使用toString()进行对象到原始值的转换