JavaScript 语法疯狂 - 任何人都知道为什么会发生这种情况的背景

标签 javascript syntax

我有点迷惑为什么下面的代码会按照它的方式做事。

对于以下表达式,我希望结果为 1,因为在文字的右侧我们实际上有一个 obj。

表达:

> { a : 1 }.a 

Chrome 结果:

Syntax error: Unexpect token .

结果 NodeJS

1

(另一个问题:为什么 nodejs 和 chrome 在此(以及以下)上有所不同)

虽然表达式本身存在语法错误,但将其分配给变量仍然有效。

> var x = { a : 1 }.a; x;

结果:

1

现在在表达式周围使用 eval 在 Chrome 和 NodeJS 中确实有效

> eval({ a : 1 }.a)

结果 Chrome 和 Node

1

现在使用 eval 和基于字符串的表达式两个平台都不起作用

eval("{ a : 1 }.a")

Chrome 结果:

SyntaxError: Unexpected token >

结果 NodeJS:

... //REPL waits more code

最后括号解决了所有问题,但为什么呢?

> eval("({ a : 1 }.a)")

结果:

Works everywhere

最佳答案

eval 接受一个字符串,所以调用 eval({ a : 1 }.a)eval("1").

在语句上下文中,{} 分隔 block ,而不是对象文字。您可以使用 () 作为分组运算符进入表达式上下文。

所以:

{ a : 1 }.a

实际上是 block 、标签、数字文字和点访问什么都没有:

{
   a:  1
}

.a

Node REPL 实际上一开始就在表达式上下文中运行,但这并不常见。他们像 eval("("+ replInput + ")")

一样运行你的代码

关于JavaScript 语法疯狂 - 任何人都知道为什么会发生这种情况的背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15809711/

相关文章:

syntax - SASS中有多行吗?

c - "static"在C中是什么意思?

javascript - 我不知道如何修复此代码

javascript - 如何使用 Jison 词法分析器返回多个标记

c++ - C++结构语法 “a : b”是什么意思

MYSQL 从最接近当前日期的可用日期范围中选择日期

mysql - '+' 附近的 SQL 语法不正确

javascript - 如何根据使用选择框选择的值从数据库中检索特定记录?

javascript - 如何将任何数组传递到使用 window.open() 打开的窗口

javascript - 返回方括号和斜线之间的字符串