【问题标题】:JavaScript BlockStatement confusionJavaScript BlockStatement 混淆
【发布时间】:2012-03-21 11:21:03
【问题描述】:
{1 + ''} + 10 // 10
{1 + ''} + '' // 0

为什么会这样? BlockStatements 是否返回 0,为什么?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    BlockStatements 是否返回 0...?

    不,blocks 返回其中最后一个表达式的值。您只需执行以下操作即可看到:

    {1 + 8}
    

    ...在 JavaScript 控制台中,将显示 9

    {1 + ''} + 10 // 10
    {1 + ''} + '' // 0
    为什么会这样?

    因为虽然该块确实返回了一个值,但该值并未被使用。 {1 + ''} + 10 // 10 代码被评估为两个不同的项目:

    {1 + ''} // "1"
    +10      // 10
    

    ...或者用标准缩进和分号写:

    {
        1 + '';
    }
    +10;
    

    ...您会看到第二个的结果,就好像第一个根本不存在一样。 + 没有加法运算符,它是unary +(类似于unary -,但它不会改变其操作数的符号)。 +10 当然是 10;而+''0,因为将运算符应用于字符串会将字符串转换为数字,而Number('')0

    您可以通过尝试以下方法来证明您看到的是一元 + 而不是加法运算符:

    {1 + ''} * 10
    

    ...真是的

    {
        1 + '';
    }
    *10;
    

    由于没有一元 *,因此失败并出现语法错误。

    正如 Felix 在下面的 cmets 中指出的那样,对于您示例中的 + 是加法运算符 (在您的情况下,它最终会连接字符串),它会是between two expressions,块是statement,而不是expression

    【讨论】:

    • 谢谢!最初我很困惑,因为{''}+'a' 返回NaN,但现在我意识到这是因为 +。
    • 这不是 100% 正确的:es5.github.com/#x12.1 “返回 StatementList 的评估结果。”。虽然你的块是一个语句,但它并没有什么区别,因此不能在表达式中使用(至少我是这样理解的)。
    • @FelixKling:谢谢!我删除了不正确的位(“块不返回任何东西”)。现在我必须深入研究语法(我现在没有时间去做)来理解块和它后面的表达式保持不同和分开的根本原因。它们是,我知道它们是,但我不知道语法的哪个精确部分规定...... :-) 正如你所说,这可能与语句与表达式有关。
    • 看,例如,the addition operator,产生式规则是 AdditiveExpression : AdditiveExpression + MultiplicativeExpression 并且块既不是 AdditiveExpression 也不是乘法表达式。我不知道是否有一条规则指出语句不能用作表达式(例如,for statement definition 有一个明确的规则用于 variable statement),但它至少解释了为什么解析器会处理 @987654355 @ 在这种情况下为一元加号。
    • @FelixKling:干杯,为我节省了时间。我将其中的一些信息编辑到了答案中。
    猜你喜欢
    • 1970-01-01
    • 2023-03-13
    • 2014-08-13
    • 2015-12-25
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多