我意识到这个问题与其他许多问题非常相似,但我必须在检查变量是否设置时遗漏一些细微差别。我在其他开发人员代码中看到了这一点:
if(foo){
doSomething(foo);
}
else{
alert('error of whatever');
}
意图是doSomething()仅在foo设置或未定义时执行。然而,当我谷歌这个时,似乎每个人都应该使用“typeof”而不是上面的方法。我特意看到这与角度一起使用,如下所示:
if($scope.property){
dothis();
}
我错过了什么吗?当我看到上面的代码时,它似乎工作,但我看到的所有答案都没有说这是检查是否设置或存在的正确方法。
答案 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