变量初始化语句是JavaScript中的表达式吗?

vh0rcniy  于 2023-02-02  发布在  Java
关注(0)|答案(1)|浏览(99)

以下作品:

let x = 1 && console.log("true");  (-- logs true)
let y = 0 && console.log("true");  (-- logs nothing)

上面显示了&&运算符之前的语句的行为类似于表达式。
然后我试了这个:

console.log(let m = 5);  // Error

这是怎么回事,如果这是一个表达式,那么为什么它在这个例子中不起作用,如果它不是表达式,那么为什么它在前两个例子中起作用?

vbkedwbf

vbkedwbf1#

以下工程─

let x = 1 && console.log("true");  (-- logs true)
let y = 0 && console.log("true");  (-- logs nothing)

上面显示了&&运算符之前的语句的作用类似于表达式
这就是您的错误之处。&&运算符用于连接 * 表达式 *,而不是 * 语句 *(即使它具有控制流效果)。其解析如下:

let x = (1 && console.log("true"));  (-- logs true)
let y = (0 && console.log("true"));  (-- logs nothing)

console.log在这里充当表达式,而不是let ...。函数调用总是返回一个值(可能是undefined)。如果记录xy,您会看到x === undefined1 && undefined的结果)和y === 00 && <not evaluated>的结果)。
&&短路可能会让您感到困惑:在第一个表达式中,&&的第一个操作数是1(truthy),所以第二个操作数--调用console.log的表达式--必须求值;在第二个表达式中,&&的第一个操作数是错误的0,因此&&短路到0不求值(不调用)console.log("true")
let语句是语句而不是表达式,这就是为什么在第二个示例中会出现语法错误。

相关问题