16

为了保护我的代码不访问我使用的未声明的变量

if (typeof myVar != 'undefined')

这很好用,但我想在其中添加另一个 if 语句。像这样转换的东西:

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

对此:

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

考虑myVar可能未定义,这最后的代码在每种使用情况和每种浏览器中是否安全?

是否有可能if ()不按编写顺序评估 a 中的各种语句?

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

4

6 回答 6

12

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

是的。您正在测试的表达式是逻辑 AND 表达式,并且指定了两个操作数的求值顺序:

产生式 LogicalANDExpression : LogicalANDExpression && BitwiseORExpression的评估如下(添加了重点):

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

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

于 2013-08-29T10:02:57.600 回答
6

是的,没关系。

在javascript中,优先级如下:

typeof> !=/==>&&

For a && b,b永远不会在a为 false 时执行。

于 2013-08-29T10:03:20.993 回答
5

是的,如果您使用&&运算符,那么如果第一个条件为,那么第二个将永远不会测试。

于 2013-08-29T10:02:50.567 回答
2
if (typeof myVar != 'undefined' && myVar == "test")

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

于 2013-08-29T10:02:55.200 回答
1

每当您使用 && 运算符时,您传入的条件将按照传入的顺序进行评估。

在你的情况下:

if (typef myVar != 'undefined' && myVar == 'test')

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

如果第一个条件

typeof myVar != 'undefined'

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

于 2013-08-29T10:07:09.247 回答
-1

很重要!利用

if (myVar !== undefined)

这意味着如果 myVar 之前有任何分配,它就不会通过。

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

祝你好运!

于 2013-08-29T10:06:56.367 回答