Skip to content

修改“表达式还是语句”的内容 #285

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 27 additions & 13 deletions docs/types/object.md
Original file line number Diff line number Diff line change
Expand Up @@ -171,29 +171,43 @@ y // 1

JavaScript 引擎读到上面这行代码,会发现可能有两种含义。第一种可能是,这是一个表达式,表示一个包含`foo`属性的对象;第二种可能是,这是一个语句,表示一个代码区块,里面有一个标签`foo`,指向表达式`123`。

为了避免这种歧义,JavaScript 引擎的做法是,如果遇到这种情况,无法确定是对象还是代码块,一律解释为代码块
不同平台的 JavaScript 引擎可能会作出不同的反应

```javascript
{ console.log(123) } // 123
```

上面的语句是一个代码块,而且只有解释为代码块,才能执行。
// Node 环境
{ foo: 123 }
// { foo: 123 }
{ foo: 123 };
// 123
({ foo: 123 })
// { foo: 123 }

如果要解释为对象,最好在大括号前加上圆括号。因为圆括号的里面,只能是表达式,所以确保大括号只能解释为对象。
// 浏览器环境
{ foo: 123 }
// { foo: 123 }
{ foo: 123 };
// { foo: 123 }
({ foo: 123 })
// { foo: 123 }

```javascript
({ foo: 123 }) // 正确
({ console.log(123) }) // 报错
// 浏览器环境,严格模式
{ foo: 123 }
// 123
{ foo: 123 };
// 123
({ foo: 123 })
// { foo: 123 }
```

这种差异在`eval`语句(作用是对字符串求值)中反映得最明显。
如果要解释为对象,最好在大括号前加上圆括号。因为圆括号的里面只能是表达式,确保了大括号只能解释为对象。

但如果大括号内的内容无法解析为对象,但作为语句可以运行,则 JavaScript 一定会将其视为代码块。

```javascript
eval('{foo: 123}') // 123
eval('({foo: 123})') // {foo: 123}
{ console.log(123) } // 123
```

上面代码中,如果没有圆括号,`eval`将其理解为一个代码块;加上圆括号以后,就理解成一个对象
因此,尽量不要写出这样单独成行的对象字面量

## 属性的操作

Expand Down