簡體   English   中英

使用if(foo)的Javascript來檢查是否設置了變量

[英]Javascript using if(foo) exists to check if variable is set

我意識到這個問題與其他許多問題非常相似,但我必須在檢查變量是否設置時遺漏一些細微差別。 我在其他開發人員代碼中看到了這一點:

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

意圖是doSomething()只有在foo設置或未定義時才會執行。 然而,當我谷歌這個時,似乎每個人都應該使用“typeof”而不是上面的方法。 我特意看到這與角度一起使用,如下所示:

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

我錯過了什么嗎? 當我看到上面的代碼時,它似乎工作,但我看到的所有答案都沒有說這是檢查是否設置或存在的正確方法。

對於if()檢查,在MOST場景中,您要檢查對象上是否存在屬性(您的情況),您所描述的內容完全有效,簡單方便。 它檢查屬性是否存在,如果存在則返回true。

但是,有很多細微差別的區域,其中類型檢查“更”正確,特別是如果您的類型以任何方式通過==強制或者您想要區分nullundefined

例如,如果null是您的屬性的有效值但undefined ,則在您的示例中仍然會調用dothis() 你可以通過typeof檢查來防止這種情況。

if (typeof $scope.property === 'undefined') {
    dothis();
}

最后,如果要檢查是否存在變量而不是存在屬性,則如果未檢查要檢查的變量,則會拋出異常,從而強制使用typeof檢查。

在這些情況下,冗長是你的朋友。

這與“ 真實性 ”的概念有關。 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) ()函數)。

您也可以使用短路評估並在一行中執行此操作。

($ scope.property && doThis())

如果需要顯式檢查值是否undefined最好使用typeof 如果您只想檢查值是否真實,那么您不需要typeof。

首選typeof運算符的原因是因為它與未聲明的變量一起使用時不會拋出ReferenceError異常。

但是,請務必注意,初始化為null的變量將返回“object”,因此為避免此問題,建議使用以下代碼:

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

你用這種方式檢查的是foo不是:

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

更多信息:

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

這樣,只有在foo有效時才會執行您的function

您可能希望更具體,並使用typeof檢查某種type

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

typeof運算符返回一個字符串,指示未評估的操作數的類型。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM