对于我对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);
}
的目的是什么?
答案 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"用于表示特定的东西。我在这里使用这个词与计算机科学在解析方面的一般含义有关。