【问题标题】:Why is typeof's result different than the evaluated result of the expression passed in?为什么 typeof 的结果与传入的表达式的评估结果不同?
【发布时间】:2014-10-14 12:28:25
【问题描述】:

如果两个对象相加等于NaN(不是数字),技术上是数字类型,那么为什么要获取类型两个对象加在一起会产生“字符串”

我将通过 REPL 表达这一点:
> {} + {}
> NaN
好的。两个对象相加会产生 NaN

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

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

我知道 javascript 的类型系统不太理想,但我对这里发生的事情感到困惑。是否出于某种原因将类型从数字转换为字符串?数字甚至是这里进行的类型转换的一部分吗?还是我只是使用 typeof 错误?

【问题讨论】:

标签: javascript object types nan typeof


【解决方案1】:

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

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

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

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

({} + {}) // expression statement (string concatenation with two objects)

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

【讨论】:

    猜你喜欢
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多