4

我有与这里提出的相同的问题:Checking if a key exists in a JavaScript object? .

但是,我正在寻找一种适用于包括 IE 6+ 在内的所有主要浏览器的方法。我看到的我喜欢的方法是使用in运算符,这是我以前从未见过的。

我在 google chrome 中尝试了一些不同的东西,似乎可以工作,但我想知道为什么不使用它而不是in操作符。

以供参考:

var data = {foo : "bar"};
console.log("foo" in data); // true
console.log("bar" in data); // false

我的建议:

var data = {foo : "bar"};
console.log(!!data.foo); // true
console.log(!!data.bar); // false

我的(第二种)方法有什么缺点吗?

4

3 回答 3

2

您似乎正在寻找替代方案,因为您以前不了解该in运算符,并假设它不受所有主要浏览器的支持。事实上,所有主流浏览器支持它,包括 IE6。来自MSDN

支持以下文档模式:Quirks、Internet Explorer 6 标准、Internet Explorer 7 标准、Internet Explorer 8 标准、Internet Explorer 9 标准、Internet Explorer 10 标准。

我将避免解释您提出的方法的缺点,因为另一个答案和评论已经这样做了。

于 2012-08-05T20:07:53.607 回答
2

我想指出,“in”运算符可能非常可疑。如果左侧是直接成员或右侧,或右侧原型的一部分,它将返回 true。我建议使用:.hasOwnProperty()

var obj = {foo: 0}
console.log(obj.hasOwnProperty('foo')) //true
console.log(obj.hasOwnProperty('bar')) //false
于 2012-08-05T20:08:38.137 回答
1

这样做的缺点是,如果您的属性值评估为虚假,则查找将失败,因为它正在测试值,而不是属性存在。毕竟,!!将一个值强制为其真值/假值。

var obj = {foo: 0};
alert(!!obj.foo); //false

解决方案:

alert(typeof obj.foo != 'undefined')

[编辑 - 回应下面关于 的评论hasOwnProperty(),这很好,但 OP 并没有只询问自己的属性,而且hasOwnProperty(),顾名思义,不会获取继承的属性,因此可能不适合 OP 的要求]

于 2012-08-05T19:41:21.367 回答