测试JavaScript中未定义的

测试JavaScript中未定义的,javascript,dom-events,Javascript,Dom Events,仅当参数[0].recordCount大于零或未定义时,我才希望运行代码。但是,当参数[0].recordCound警报显示未定义时,将运行代码 if(arguments[0].recordCount > 0 && arguments[0].recordCount !== 'undefined') { //if more than 0 records show in bar document.getE

仅当
参数[0].recordCount
大于零或未定义时,我才希望运行代码。但是,当
参数[0].recordCound
警报显示未定义时,将运行代码

if(arguments[0].recordCount > 0 && 
   arguments[0].recordCount !== 'undefined')
{ //if more than 0 records show in bar
                            
    document.getElementById('totalRecords').innerHTML = 
       arguments[0].recordCount + " Records";
}

如何在此处测试未定义?

未定义
是一个关键字具有常量值的全局变量,请在不带引号的情况下使用它:

if(arguments[0].recordCount > 0 && arguments[0].recordCount !== undefined)
但实际上,只测试第一个条件就足够了:

if(arguments[0].recordCount > 0)
因为如果
recordCount
大于零,则仍会定义它


更常见的是切换条件并首先测试是否定义了条件,以避免在以下测试中出现可能的错误(不确定此处是否有必要):


使用
undefined
作为字符串时,需要使用
typeof
运算符

此外,在对属性进行任何其他检查之前,您应该先检查它是否已定义

if ( 'undefined' != typeof arguments[0].recordCount && arguments[0].recordCount > 0 )

要检查变量是否不为null和未定义

如果(thatVariable)
就足够了,但隐式转换可能会在该变量为空字符串、布尔值或数字0的某些情况下导致问题。如果我们的变量不是隐式转换,则可以执行以下操作:

if(arguments[0].recordCount && arguments[0].recordCount > 0)
但以下几点是有问题的

if(arguments[0].recordCount !== undefined && arguments[0].recordCount > 0)
考虑一下

var undefined = 'surprise' //possible since undefined is not a keyword
if(arguments[0].recordCount !== undefined && arguments[0].recordCount > 0)
现在,即使recordCount未定义,此“if”也将中断

if(arguments[0].recordCount > 0 && 
   arguments[0].recordCount !== 'undefined')
{ //if more than 0 records show in bar
                            
    document.getElementById('totalRecords').innerHTML = 
       arguments[0].recordCount + " Records";
}

还有一件事:
如果(a!=null)
还将检查由于隐式转换而导致的未定义。因此
如果(a!=null&&a!=undefined)
是多余的

对,如果您坚持将其作为
“字符串”
进行比较,请使用
=而不是
==。前者只测试值,而后者测试类型和值。
undefined
在JavaScript中不是关键字。但是,如果
x
未定义,
typeof(x)
将返回字符串
“未定义”
。@stakx:感谢您的澄清。
未定义的
可以更改。你不应该拿它作比较。如果在进行比较时,
recordCount
不能保证有一些值,那么它将爆炸。+1。可能是
==运算符而不是
=
?stakx:no.
typeof
保证返回一个字符串,并且您正在将其返回值与另一个字符串进行比较,因此无论您可能已经学会了什么Crockfordian习惯,它都会一直很好:)@stakx-无关
typeof
返回一个字符串。@蒂姆:你说得对。每当我看到
==
时,这已经成为一个相当持久的习惯=
我认为应该是严格的运算符。var的
类型与
===未定义的
可能相关的性能比较(后者比前者快)