2012-07-25 79 views
3

我使用這個代碼來測試對象是否爲空或空:我的'isNullOrEmpty'函數是否很好?

var isNullOrEmpty = function(obj) { 
    // this should handle if someone defines a variable named 'undefined'. 
    if(obj == null || typeof(obj) == 'undefined' || obj == "") { 
     return true; 
    } 

    return false; 
} 

有什麼我失蹤?

謝謝。

+4

對於這樣的嚴格比較,您應該使用[identity operator](http://stackoverflow.com/a/359509/596068),即正確使用'==='與'=='。 – Alex 2012-07-25 13:57:09

+0

是不是'if(obj)'或多或少等於你想要在這裏做什麼? – 2012-07-25 13:57:58

+0

你必須告訴我們變量是「空的」意味着什麼。 – 2012-07-25 14:00:34

回答

1

我會使用這樣的:

var isNullOrEmpty = function(obj) { 
    if((!obj && obj!==false) || !(obj.length>0)) { 
     return true; 
    } 
    return false; 
} 

!obj包括:

  • obj = 0(如果你想返回false,只是添加此條件:&& obj!==0
  • obj = ""
  • obj = undefined
  • obj = null
  • obj = false

obj.length包括:

  • obj = ""
  • obj = []

也可以檢查如果對象是一個普通的對象({})具有這樣的功能:

var isPlainObj = function(obj){ 
    for(var i in obj) 
     if(obj.hasOwnProperty(i)) 
      return false; 
    return true; 
} 
+0

!obj適用於:obj未定義,obj = false,obj = 0,obj ='' – cuzzea 2012-07-25 14:00:26

+0

是的,是不是它想要的? – 2012-07-25 14:02:27

+0

長度未定義,如果它是一個對象 – Christoph 2012-07-25 14:02:36

0

您可能需要處理字符串只包含空格的情況。我不喜歡它

str.replace(/\s/g, "") !== "";

所以像

if (obj === null || 
    obj.length || 
    ("" + obj).replace(/\s/g, "") === "") 
    return true; 
+0

'(obj.length && obj.length === 0)'部分是不是總是假的?如果'.length'實際上是0,那麼'obj.length'將是虛假的...... – nnnnnn 2012-07-25 14:18:19

+0

是的,thanx指出了。 – hvgotcodes 2012-07-25 14:25:18

0
var isNullOrEmpty = function(obj) { 
    return (typeof obj === 'undefined' || obj === null || obj === ''); 
} 

操作的順序發生短路,這意味着如果第一個表達式的計算結果爲真,那麼其餘的被忽略。首先移動typeof,確保在測試obj的值爲null或字符串之前已經定義了obj。還將比較運算符升級爲嚴格。

+0

在測試null之前,您不需要測試它是否已被定義,因此重新排序這些條件確實沒有任何區別。 (如果傳入的參數是一個尚未定義的變量名稱,則在調用該函數時,它將在進入該函數之前與ReferenceError一起崩潰。) – nnnnnn 2012-07-25 14:10:41

相關問題