为什么这两个表达式的不一致表现?

时间:2014-10-29 13:24:17

标签: javascript coercion

''.valueOf()// an empty string
false.valueOf()// false

但为什么

+'' // 0
+false // 0

我阅读了教程,数字转换的算法是:

如果存在valueOf方法并返回基元,则返回它。

否则,如果存在toString方法并返回原语,则返回它。

否则,抛出异常。

这与真实情况有冲突,如果这是规则,那么我认为''.valueOf()false.valueOf()都应该返回0.有人可以告诉我可能的原因吗?

2 个答案:

答案 0 :(得分:7)

来自Object.prototype.valueOf() MDN page

  

valueOf()方法返回指定对象的原始值。

由于你在原语上调用valueOf(),它只返回那些原语。

(在JavaScript中,有6个primitive data typesStringNumberBooleanNullundefined,{ {1}}(ES6))


现在,来自Unary Plus (+) MDN page

  

一元加号运算符在其操作数之前,并计算其操作数,但是如果它已经没有,则尝试将其转换为数字。

基本上,Symbol相当于调用+value Number(value)Number('')都返回Number(false)

答案 1 :(得分:4)

.valueOf正在返回一个原语 - 空字符串。 false也是原始的。

+运算符是将变量转换为数字的简写。在这种情况下,它将false-y值转换为0 - 完全没有冲突。