使用if(foo)的Javascript来检查是否设置了变量

时间:2016-01-29 18:00:11

标签: javascript angularjs

我意识到这个问题与其他许多问题非常相似,但我必须在检查变量是否设置时遗漏一些细微差别。我在其他开发人员代码中看到了这一点:

if(foo){
  doSomething(foo);
}
else{
  alert('error of whatever');
}

意图是doSomething()仅在foo设置或未定义时执行。然而,当我谷歌这个时,似乎每个人都应该使用“typeof”而不是上面的方法。我特意看到这与角度一起使用,如下所示:

if($scope.property){
  dothis();
}

我错过了什么吗?当我看到上面的代码时,它似乎工作,但我看到的所有答案都没有说这是检查是否设置或存在的正确方法。

6 个答案:

答案 0 :(得分:5)

对于Resources检查,在MOST场景中,您要检查对象上是否存在属性(您的情况),您所描述的内容完全有效,简单方便。它检查属性是否存在,如果存在则返回true。

但是,有很多细微差别的区域,其中类型检查更“正确”,特别是如果您的类型通过if()以任何方式强制执行,或者您想要区分==null

例如,如果undefined是您的属性的有效值,但null不是,则在您的示例中undefined仍会被调用。您可以通过dothis()检查来阻止此操作。

typeof

最后,如果要检查是否存在变量而不是存在属性,如果未检查要检查的变量,则会抛出异常,从而强制您使用typeof检查。

在这些情况下,冗长是你的朋友。

答案 1 :(得分:1)

这与" truthiness"的概念有关。任何值除了 false,0,"",null,undefined和NaN都是" truthy"这意味着if语句的第一个块将运行。例如:

if ("") {
    alert("falsie"); // won't run because the empty string ("") is falsie
} else {
   alert("truthie"); // will run
}

,而

if ("something") {
    alert("truthy"); // will run because "something" is truthy
} else {
    alert("falsie"); // won't run
}

回到你的例子,如果foo是真实的(意味着它具有除false之外的任何值,0,"",null,undefined和NaN)那么它将运行第一个块if语句(其中包含doSomething()函数)。

答案 2 :(得分:0)

您也可以使用短路评估并在一行中执行此操作。

($ scope.property&& doThis())

答案 3 :(得分:0)

如果您需要明确检查值是否为typeof,最好使用undefined。如果你只想检查价值是否真实,那么你就不需要输入。

答案 4 :(得分:0)

首选typeof运算符的原因是因为它与未声明的变量一起使用时不会抛出 ReferenceError 异常。

但是,请务必注意,初始化为null的变量将返回" object",因此为了避免此问题,建议使用以下代码:

if (typeof variable === 'undefined' || variable === null) {
    // variable is undefined or null
}

答案 5 :(得分:-1)

如果foo不是这样的话,你用这种方式检查的是:

false
Undefined
Null
+0, −0, or NaN
Empty String

更多信息:

  

https://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/

这样,只有在function有效时才会执行foo

您可能希望更加具体,并使用type检查某个typeof

var foo = 'foo';
if (typeof foo === 'string') { // true
  doSomething();
}
  

typeof运算符返回一个表示其类型的字符串   未评估的操作数。   https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof