JavaScript中if语句的求值顺序

19

为了防止我的代码访问未声明的变量,我使用

if (typeof myVar != 'undefined')

这个工作正常,但我想再加入一个if语句。类似于将此代码转换为:

if (typeof myVar != 'undefined'){
    if (myVar == "test"){}
}

到这个:

if (typeof myVar != 'undefined' && myVar == "test")

考虑到myVar可能未定义,在每种使用情况和所有浏览器中,上述代码是否安全?

if()语句内的各种语句是否按照书写顺序依次执行?

如果myVar未定义,我能否假定myVar == "test" 永远不会被执行?


2
可以的。在这里使用if (myVar && myVar == "test")会是更好的方法。 - user1983983
是的,&& 运算符是短路运算符,因此如果第一个条件为假,则不会检查其他条件。 - Voonic
是的,但是当您尝试访问未定义的变量时,代码会崩溃。 - Saturnix
完全复制 Javascript 条件顺序评估 - Bergi
@Saturnix:只有在尝试访问未声明的变量时,代码才会崩溃,这确实是不应该发生的。 - Bergi
显示剩余2条评论
6个回答

13

如果myVar未定义,我是否可以假定myVar == "test"永远不会被执行?

是的。您正在测试的表达式是逻辑与表达式,两个操作数的计算顺序已指定:

产生式LogicalANDExpression: LogicalANDExpression&&BitwiseORExpression的计算如下(加重部分):

  • lref为评估LogicalANDExpression的结果。
  • lval为GetValue(lref)。
  • 如果ToBoolean(lval)为false,则返回lval
  • rref为评估BitwiseORExpression的结果。
  • 返回GetValue(rref)。

基本上就是说评估第一个操作数,如果该评估结果为false,则整个表达式都为false,并且不会评估第二个操作数。


6

没问题。

Javascript中,操作符优先级如下:

typeof > !=/== > &&

对于 a && b ,当 a 为 false 时,b 永远不会被执行。


5
如果你使用&&运算符,那么如果第一个条件是false,那么第二个条件将永远不会被测试。

3
if (typeof myVar != 'undefined' && myVar == "test")

表达式从左到右进行评估,因此如果myVarundefined(不会将myVar与“test”进行比较),则将进行短路处理

2
每当你使用 && 运算符时,您传递的条件将按照它们传递的顺序进行评估。
在您的情况下:
if (typef myVar != 'undefined' && myVar == 'test')

当程序进入此if语句时,首先检查变量类型是否未定义。如果返回true,则继续到第二个参数,并检查myVar的值是否为“test”。即使myVar == 'test',if语句也将评估false && true的值,该值返回true。只有当两个条件都返回true时,代码块才会被执行,因为表达式将被评估为true(true && true)。
如果第一个条件
typeof myVar != 'undefined'

如果返回false,则第二个条件将永远不会被评估。


-1
非常重要!请使用


if (myVar !== undefined)

这意味着如果myVar在之前有任何赋值,它将无法通过。

不要使用'undefined',这只是一个简单的字符串!

祝你好运!


“var myVar = undefined” 不是一个赋值语句? - Bergi
4
typeof 运算符返回一个简单字符串! - Bergi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接