JavaScript - 为什么包含括号会导致三元表达式出错?

Mic*_*thy 4 javascript conditional-operator operator-precedence

我有以下代码:

const showMessage = msg => console.log(msg);

let person = {
  firstName: `Mick`,
  lastName: `McCarthy`,
  firstTimeUser: true
}

(person.firstTimeUser === true) ? showMessage(`Welcome, ${person.firstName}!`): showMessage(`Glad you're back, ${person.firstName}!`)
Run Code Online (Sandbox Code Playgroud)

这导致错误:

home.js:7 Uncaught ReferenceError: Cannot access 'person' before initialization
    at home.js:7
Run Code Online (Sandbox Code Playgroud)

但是,在以下情况下(三元表达式中的括号已被删除):

home.js:7 Uncaught ReferenceError: Cannot access 'person' before initialization
    at home.js:7
Run Code Online (Sandbox Code Playgroud)

没有错误,欢迎信息显示正确。

为什么会这样?我的印象是括号在三元表达式中是可选的。我想,这是什么做的计算顺序,但由于三元表达式是在不同的线路let person = {...,我不清楚为什么发生这种情况。

事实上,在我正在学习的 JavaScript 课程展示的示例中,讲师展示了以下示例,无论是否带括号都可以完美运行:

let price = 20

(price < 10) ? showMessage('yes') : showMessage('no')
Run Code Online (Sandbox Code Playgroud)

但是,当我在自己的机器上尝试时,出现了同样的问题。他们是否可以使用行为不同的旧版 JavaScript?如果有,发生了什么变化?

非常感谢!

Ant*_*eon 5

JavaScript 的分号插入

以下是 JavaScript 引擎如何查看您的代码

let person = {...}(person.firstTime === true ? )
Run Code Online (Sandbox Code Playgroud)

以下情况也会出现同样的问题

console.log('Error')

[1, 2, 3].forEach(console.log)
Run Code Online (Sandbox Code Playgroud)

但是如果在console.log('Error')的末尾有一个分号,那么下面的代码就可以正常工作了

必不可少,不要依赖 JavaScript 分号插入,否则你会得到奇怪的错误。