Javascript数组的值是未定义的...我该如何测试?

41

我想测试一下JavaScript变量是否未定义。

你会发现,如果我没有先弹出“难以置信”的警报,我不会预期predQuery[preId]的值是'undefined'。但我经常会遇到这种情况,所以我猜测我的语句

 predQuery[preId]=='undefined') 

没有正确地匹配未定义元素。

if((predQuery.length < preId) || (predQuery[preId]=="") || (predQuery[preId]=='undefined')){
   alert("its unbelievable");
   alert(predQuery[preId]);
   queryPreds[variables] = preId;
   queryObjs[variables] = objId;
   predQuery[preId] = variables;
}
else {
    alert(predQuery[preId]);
   var predIndex = predQuery[preId];
   queryPreds[predIndex] = preId;
   queryObjs[predIndex] = objId;
}

如有需要,我可以添加更多的代码。


在我的if语句中,我使用(typeof(predQuery[preId])=='undefined')作为子句。 - Ankur
@deceze...我的意思是,我已经更改了我的代码。然而,我没有编辑问题,因为那不会帮助未来遇到相同问题的人们。 - Ankur
我明白了,对于误解感到抱歉。:o) - deceze
7个回答

76

array[index] == 'undefined' 比较数组索引的值是否等于字符串"undefined"。
你可能想要使用 typeof array[index] == 'undefined' 来比较类型。


4
与其使用可变的 undefined 类型进行比较,建议使用不可变类型来进行比较,例如 +1。 - Sky Sanders
3
仅凭这个信息无法区分[undefined][0][][0]。如果你的数组有可能为空,你很可能会遇到这种情况。 - sighrobot
1
为什么不使用 array[index] === undefined - Rehan Arshad

15

您正在检查数组索引是否包含字符串"undefined",您应该使用typeof运算符:

typeof predQuery[preId] == 'undefined'

或者使用全局变量undefined

predQuery[preId] === undefined

第一种方式更安全,因为undefined全局属性是可写的,并且可以被更改为任何其他值。


9
predQuery[preId]=='undefined'

您正在针对字符串'undefined'进行测试;您将此测试与typeof测试混淆了,后者将返回一个字符串。您可能是想要针对特殊值undefined进行测试:

predQuery[preId]===undefined

请注意使用严格相等运算符以避免通常不需要的匹配 null==undefined
然而,有两种情况下你可以得到一个 undefined 值:要么 preId 不是 predQuery 的成员,要么它是一个成员,但其值设置为特殊的 undefined 值。通常,你只想检查它是否存在;在这种情况下,in 运算符更加适合。
!(preId in predQuery)

4

通往罗马的路有很多种:

//=>considering predQuery[preId] is undefined:
predQuery[preId] === undefined; //=> true
undefined === predQuery[preId] //=> true
predQuery[preId] || 'it\'s unbelievable!' //=> it's unbelievable
var isdef = predQuery[preId] ? predQuery[preId] : null //=> isdef = null

干杯!


2
检查
if (predQuery[preId] === undefined)

使用严格相等运算符。请参见比较运算符

2
几乎 - 但最佳实践是像deceze所说的那样,比较typeof,因为它不能被重新定义,而undefined可以。 - Sky Sanders
1
不是绝对可靠的,因为 undefined 可以被定义。只需使用 window.undefined="lolz"; 即可。 - Warty
5
无法编写可以防止每个内置函数被重新定义的 JavaScript 代码(几乎任何内置函数都可以被重新定义)。我不提倡为了避免重新定义而使代码难以阅读。typeof 还有另一种用途,用于检测跨窗口脚本中的数据类型,但这对 undefined 并不适用。 - bobince
1
ES5 强制将 undefined 设为只读。 - Warty

2

尝试: typeof(predQuery[preId])=='undefined'
或更一般化的形式:typeof(yourArray[yourIndex])=='undefined'
您正在将“undefined”与未定义的变量进行比较,这将返回false =)


1
这段代码运行得非常好。
function isUndefined(array, index) {
    return ((String(array[index]) == "undefined") ? "Yes" : "No");
}

2
为什么你使用 == 而不是 ===? - leofontes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接