为什么typeof的结果与传入的表达式的评估结果不同?

时间:2014-08-21 00:55:11

标签: javascript object types nan typeof

如果两个对象加在一起等于 NaN (非数字),技术上属于数字,那么为什么要获取该类型将两个对象加在一起会产生“string”

我将通过REPL表达这一点:
> {} + {}
> NaN
好。添加在一起的两个对象创建NaN

> typeof(NaN)
> "number"
好。我们知道NaN的类型是“数字”

> typeof({} + {})
> "string"
等待。这不应该是“数字”吗?

我知道javascript有一个不太需要的类型系统,但我对这里发生的事情感到困惑。由于某种原因,类型是从数字转换为字符串吗?数字甚至是转换类型转换的一部分吗?或者我只是使用typeof错误?

1 个答案:

答案 0 :(得分:3)

{} + {}是一个空{}),后跟从对象到数字(+{})的类型转换。它基本上读为

{} // empty block (a statement)
;  // empty statement (just for clarity)
+{}; // expression statement (unary plus, object literal -> conversion to number)

但是,如果您使用typeof ({} + {}),那么{} + {}将被评估为表达式,在这种情况下,{}只能是对象文字和{{1}是连接运算符。

您也可以使用分组运算符强制将构造计算为表达式:

+

另请参阅Why {} + {} is NaN only on the client side? Why not in Node.js?以及与[javascript] "{} + {}"相关的其他问题。