在PHP中,你可以这样做if(isset($array['foo'])){…}。在JavaScript中,你经常使用if(array.foo){…}来做同样的事情,但这不是完全相同的语句。条件也将计算为false if数组。Foo确实存在,但为false或0(也可能为其他值)。
JavaScript中与PHP的isset完美对应的是什么?
从更广泛的意义上说,一个关于JavaScript如何处理不存在的变量、没有值的变量等的通用的、完整的指南会很方便。
更新:11年零11个月前,我发布了这个问题,哇,它仍然有很多活动。现在,我非常确定,当我写这篇文章时,我只是想知道如何检查关联数组(也就是字典)中属性的存在,因此(对我来说)正确的答案涉及hasOwnProperty或in操作符。我对检查局部或全局变量不感兴趣。
但是,虽然我记得很清楚,但在写的问题中,这种意图并不十分清楚,甚至与之直接矛盾!我还没提到关联数组,PHP的isset也有其他功能。让这成为我们所有人的一个教训,让我们知道在一个问题中正确地陈述你的要求是多么重要,以及全局变量、局部变量、对象属性、字典键和其他什么东西是多么重要。
与此同时,很多很多人也提供了这个问题的答案,所以对于那些通过谷歌找到这个问题的人来说,我很高兴我的含糊在某种程度上有所帮助。不管怎样,我只是想澄清一下。
我总是使用这个泛型函数来防止基本变量以及数组和对象上的错误。
isset = function(obj) {
var i, max_i;
if(obj === undefined) return false;
for (i = 1, max_i = arguments.length; i < max_i; i++) {
if (obj[arguments[i]] === undefined) {
return false;
}
obj = obj[arguments[i]];
}
return true;
};
console.log(isset(obj)); // returns false
var obj = 'huhu';
console.log(isset(obj)); // returns true
obj = {hallo:{hoi:'hoi'}};
console.log(isset(obj, 'niet')); // returns false
console.log(isset(obj, 'hallo')); // returns true
console.log(isset(obj, 'hallo', 'hallo')); // returns false
console.log(isset(obj, 'hallo', 'hoi')); // returns true
我通常使用typeof操作符:
if (typeof obj.foo !== 'undefined') {
// your code here
}
如果属性不存在或其值未定义,则返回“undefined”。
(参见:未定义和未定义的区别。)
还有其他方法来确定一个属性是否存在于一个对象上,比如hasOwnProperty方法:
if (obj.hasOwnProperty('foo')) {
// your code here
}
和in操作符:
if ('foo' in obj) {
// your code here
}
最后两个方法的区别在于,hasOwnProperty方法将检查该属性是否在对象上物理存在(该属性没有继承)。
in操作符将检查原型链中所有可达的属性,例如:
var obj = { foo: 'bar'};
obj.hasOwnProperty('foo'); // true
obj.hasOwnProperty('toString'); // false
'toString' in obj; // true
如你所见,在检查toString方法时,hasOwnProperty返回false, in操作符返回true,这个方法是在原型链中定义的,因为obj继承了Object.prototype的形式。