我正在尝试解析javascript(使用javascript),我遇到了对象的问题。 javascript如何确定对象或块之间的区别?
例如
{ x : 1, y : 2}
令牌流:
[{][x][:][1][,][y][:][2][}]
显然是一个对象,但是
{ var x = 1; var y = 2}
令牌流:
[{][var][x][=][1][;][var][y][=][2][}]
是一个完全有效的匿名JavaScript块。我如何有效地将每个令牌流识别为对象或块?
然而,更重要的是,我将如何确定可以是对象的令牌流或块之间的区别如下:
{ a : null }
令牌流:
[{][a][:][null][}]
这可以是参数a等于null的对象,或它可以是块中的第一个语句(null
)具有标签的块({{ 1}})
答案 0 :(得分:3)
你没有。
语法的上下文会影响它的身份。你不能只是将事物脱离背景并确定它们是什么。
在语法中,对象文字是:
'{' (propertyNameAndValueList)? '}'
而块是:
'{' (statementList)? '}'
但只有在允许表达式的情况下才存在文字,而在允许语句的地方存在块。那些不是一回事。
因此,周围的背景区分了两种形式。
答案 1 :(得分:2)
通常,表达式可以是语句,但语法中的表达式有两个例外:
ExpressionStatement :
[lookahead ∉ {{, function}] Expression ;
字体在这里并不完全正确,但它们的含义是,只有当第一个标记既不是' {'也没有'功能'。
ECMAScript 5.1规范第12.4节中的说明中阐明了这一点:
注意ExpressionStatement不能以开括号大括号开头,因为这可能会使其与Block不一致。此外,ExpressionStatement不能以function关键字开头,因为这可能使其与FunctionDeclaration不一致。