以下作品:
let x = 1 && console.log("true"); (-- logs true)
let y = 0 && console.log("true"); (-- logs nothing)
上面显示了&&
运算符之前的语句的行为类似于表达式。
然后我试了这个:
console.log(let m = 5); // Error
这是怎么回事,如果这是一个表达式,那么为什么它在这个例子中不起作用,如果它不是表达式,那么为什么它在前两个例子中起作用?
以下作品:
let x = 1 && console.log("true"); (-- logs true)
let y = 0 && console.log("true"); (-- logs nothing)
上面显示了&&
运算符之前的语句的行为类似于表达式。
然后我试了这个:
console.log(let m = 5); // Error
这是怎么回事,如果这是一个表达式,那么为什么它在这个例子中不起作用,如果它不是表达式,那么为什么它在前两个例子中起作用?
1条答案
按热度按时间vbkedwbf1#
以下工程─
上面显示了&&运算符之前的语句的作用类似于表达式
这就是您的错误之处。
&&
运算符用于连接 * 表达式 *,而不是 * 语句 *(即使它具有控制流效果)。其解析如下:console.log
在这里充当表达式,而不是let ...
。函数调用总是返回一个值(可能是undefined
)。如果记录x
和y
,您会看到x === undefined
(1 && undefined
的结果)和y === 0
(0 && <not evaluated>
的结果)。&&
短路可能会让您感到困惑:在第一个表达式中,&&
的第一个操作数是1
(truthy),所以第二个操作数--调用console.log
的表达式--必须求值;在第二个表达式中,&&
的第一个操作数是错误的0
,因此&&
短路到0
,不求值(不调用)console.log("true")
。let
语句是语句而不是表达式,这就是为什么在第二个示例中会出现语法错误。