2012-07-25 76 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

相关问题