它将某些东西解析为对象文字而不是作为一个块有什么区别?

时间:2016-06-05 11:14:29

标签: javascript

对于我对JavaScript基本概念的无知感到抱歉。

归结为:

  

Literal - 直接在脚本中找到的值。例子:

3.14
"This is a string"
[2, 4, 6]
  

表达式 - 一组标记,通常是文字或标识符,组合在一起   使用可以评估特定值的运算符。例子:

2.0
"This is a string"
(x + 2) * 4

与Javascript中的上述两个版本有很明显的区别。

我偶然读到这个article。我熟悉差异b / w function declaration& function expression以及何时使用其他人,反之亦然。

来自同一篇文章:

  

....您可能还记得在使用eval评估JSON时,字符串   通常用括号括起来 - eval('(' + json +')')。这是   当然也是出于同样的原因 - 分组运算符,其中   括号是,强制将JSON括号解析为表达式   而不是作为一个块:

try {
  { "x": 5 }; // "{" and "}" are parsed as a block
} catch(err) {
  // SyntaxError
}

({ "x": 5 }); // grouping operator forces "{" and "}" to be parsed as object literal

那么,除了将object literal解析为block之外,将其解析为grouping character会有什么不同?

parsing的背景下,我应该考虑使用private Message mActiveMessage; private void publish(String message) { Log.i(TAG, "Publishing message: " + message); mActiveMessage = new Message(message.getBytes()); Nearby.Messages.publish(mGoogleApiClient, mActiveMessage); } 的目的是什么?

2 个答案:

答案 0 :(得分:2)

首先,不要eval JSON ,在字符串来源上使用JSON.parse

一个块是一个"表达式组" ,例如,

let x = 0;
if (true) {
    // this is a block
    ++x;
}

然而,同样这也是一个块

let x = 0;
{ // hi there, I'm a block!
    ++x;
}

这意味着当解释器看到块符号时,即使你做了类似这样的事情,它也会假定一个块

{ // this is treated as a block
    foo: ++x
}

在这里,foo充当标签而不是属性名称,如果您尝试使用尝试的对象文字做更复杂的事情,那么您将获得一个语法错误

如果你想像这样模糊地写一个 Object literal ,解决办法是通过提供括号,强制解释器进入"表达模式"

({ // this is definately an Object literal
    foo: ++x
})

答案 1 :(得分:2)

{开头并以}结尾的组被视为对象文字或块视情况而定*。

在表达式上下文中,该组被解释为对象文字。在表达式上下文中编写块将生成语法错误:

// Valid code:
foo = {a:b};
({a:b});

// Syntax errors:
foo = {var a = b};
({var a = b});

在表达式上下文之外,该组被解释为块。根据代码的确切编写方式,在表达式上下文之外编写的对象文字可能是语法错误,也可能被解释为标签。

*注意:在ECMAscript规范中,单词" context"用于表示特定的东西。我在这里使用这个词与计算机科学在解析方面的一般含义有关。