jsFiddle 逻辑运算符中的圆括号

Round bracket in logical operator in jsFiddle

不确定这个问题是因为jsFiddle中的错误还是我对javascript的圆括号的误解。我有这个代码:

let x = 5
(x > 0) && console.log('hello')

这行不通。但是,以下不带括号的内容有效。

x > 0 && console.log('hello')

我的印象是我可以在条件中使用圆括号将事物组合在一起。我不知道为什么我的第一行代码不起作用。是我对圆括号的误解吗?

我实际上是想教别人这个 jsFiddle 代码中更高级的示例。 https://jsfiddle.net/x616atk0/

它不起作用,因为你在 let x = 5

之后少了一个分号

代码应该是:

let x = 5;
(x > 0) && console.log('hello');

否则,您的代码可以翻译成这样:

let x = 5(x > 0) && console.log('hello');

当然 5 不是函数,并且 x(您在表达式中使用它,计算值将作为参数传递)尚未定义。

该错误具有误导性,因为您使用的变量与定义为参数的变量相同。如果你有

let x = 5
(5 > 0) && console.log('hello');

你会得到:TypeError: 5 is not a function 这正是问题所在。


这就是为什么分号很重要!

Do you recommend using semicolons after every statement in JavaScript?

是的,我绝对会

您忘记在行尾添加分号,这导致了错误。当您这样做时:

let x = 5
let y = 4
x > 0 && console.log('code 4')
(x > 0) && (y > 0) && console.log('code 5');

因为第三行以 ) 结尾,解释器认为您使用 (x > 0) 参数调用 console.log 的结果:

let x = 5
let y = 4
x > 0 && console.log('code 4')(x > 0) && (y > 0) && console.log('code 5');

但是console.log returns undefined: 它return不是一个函数,所以你当然不能把它当作一个函数来调用。

如果您还在学习这门语言,请始终使用分号,否则您很容易被绊倒。

此外,您的做法不是一个好的做事方式;虽然这是一个有趣的语言怪癖,但最好使用 if 或三元运算符显式测试条件,而不是为此使用 &&