4

私はここで提起されたのと同じ質問をしました:キーがJavaScriptオブジェクトに存在するかどうかをチェックしますか?

ただし、IE6以降を含むすべての主要なブラウザーで機能する方法を探しています。私が気に入った方法は、inこれまで見たことのない演算子の使用です。

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

私の(2番目の)方法に欠点はありますか?

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 に答える