問題タブ [hasownproperty]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
javascript - JavaScript: Object.hasOwnProperty メソッドがこのように動作するのはなぜですか?
私の理解ではObject.hasOwnProperty
、オブジェクトに独自のプロパティ名があるかどうか、つまり継承されていないプロパティがあるかどうかをメソッドがチェックするということです。つまり、プロパティa. 存在しない、またはb. 継承されている場合。
私が間違っている場合は修正してください。ただし、これが古典的な継承を使用しない限り、以下のコードではbar
継承されませんか? プロパティが継承されたプロパティである場合、メソッドが true を返すのFoo
はなぜですか? ここで何が間違っていたのですか?hasOwnProperty
propname
また、オブジェクトで をどのように使用しhasOwnProperty
ますFoo
か? ここのコードは、オブジェクト false
をチェックするときに戻ります。Foo
javascript - 最初に Object.prototype をチェックするときに hasOwnProperty() をスキップしても問題ありませんか?
hasOwnProperty()
汚染される可能性があるため、オブジェクトのキーを反復処理するときに使用することになっていますObject.prototype
。これは、プロトタイプの継承により、すべてのオブジェクトのキーも汚染します。
したがって、汚染しない場合は、 for-in ループを遅くObject.prototype
するスキップをスキップできるはずです。コードもシンプルになります。hasOwnProperty()
アイデア: 最初Object.prototype
に汚染されていないことを確認してから、使用しないでくださいhasOwnProperty()
。
Object.prototype
汚染されていないことの確認は、次の関数によって行われます。これは、スクリプトの実行中に時折実行されるコード内の戦略的な場所で呼び出します (大量のデータを処理する前など)。この関数は、何か悪いことが行われた場合に私に警告するガードに過ぎませんObject.prototype
:
注:/* jshint -W089 */
jshintが欠落についてhasOwnProperty()
文句を言わないようにコメントを付けました。
質問: これは大丈夫ですか? 他に注意すべきことはありますか?それとも私が改善できることですか?
今いくつかのベンチマーク:
以下は、さまざまな数のプロパティを持つオブジェクトのゲインを示す 3 つの jsPerf ベンチマークです。
- 1 つのプロパティ: 1 つのプロパティを持つプレーン オブジェクトの独自のキーを繰り返します
- 10 個のプロパティ: 10 個のプロパティを持つプレーン オブジェクトの独自のキーを繰り返します
- 100 個のプロパティ: 100 個のプロパティを持つプレーン オブジェクトの独自のキーを繰り返します
注:Object.prototype
オブジェクトのプロパティが反復されるたびに、チェックが実行されます。実際の状況では、テストを実行する必要があるのは 1 回だけです。つまり、ページ全体が読み込まれるときです (その後、スクリプトが誤って変更されていないことを確認するために時々Object.prototype
)。したがって、実際の状況では、「参照」テストのパフォーマンスが得られます。しかし、これは、常にテストを実行している場合でも、高速のままであることを示しています。
興味深い結果:
- どちらも使用しない
hasOwnProperty()
と、ブラウザに応じて同じ速度または高速になります - 1 つのプロパティにのみアクセスする場合でも、各 for-in ループの前にチェック
Object.protoype
する方が、ブラウザーによってはhasOwnProperty()
! (ただし、常にこのようにチェックすることはお勧めしませんObject.prototype
)
関連:Object.keys()
一部のブラウザーでは大きなオブジェクトの使用がさらに高速になることもありますが、小さなオブジェクトの場合は遅くなる可能性もあります。しかし、を使用Object.keys()
すると、ブラウザ >= IE 9 のみをサポートするか、またはIE <= 8Object.prototype
のポリフィルObject.keys()
で拡張する必要があります。したがって、古いブラウザとの互換性を確保するには、 または のいずれかを選択する必要がありますcheckObjectPrototypeNotAugmented()
。
javascript - Javascript hasOwnProperty は Event オブジェクトで常に false ですか?
誰かがイベント オブジェクトに関連する hasOwnProperty() メソッドを明確にするのを手伝ってくれることを望んでいました。
マウス イベントのクローンを作成しようとしています (最終的に、このオブジェクトは iframe に渡されます)。既に「クローン」関数を作成していますが、ウィンドウ イベント (スクロール、クリックなど) のクローンを作成しようとすると、常に「hasOwnProperty」のすべてのインスタンスが作成されます。 ()' は false を返します。たとえば、オブジェクトを反復処理し、hasOwnProperty() を使用してチェックすると、各プロパティが false を返します。これは標準オブジェクトでは機能しますが、イベント オブジェクトでは機能しません。
これは、イベント オブジェクト内のすべてのプロパティが継承されているためですか? それともコードに問題がありますか?
任意の啓発をいただければ幸いです:)
コードスニペット:
javascript - 戦い: hasOwnProperty 対 obj.prop
専用の投稿をいくつか見ましhasOwnProperty
たが、単純なものよりも使用する必要があるかどうか(およびいつ使用する必要があるか)はまだ疑問ですobj.prop
if (obj.hasOwnProperty("prop"))
オブジェクトが継承されていないプロパティを定義しているかどうかを確認するのに役立ちますprop
が、単に行うよりもはるかに優れていif (obj.prop)
ますか?
はしごは、ネストされたオブジェクトがある場合に特に便利です。たとえば、superheros
のプロパティを持ち、dcComics
そのプロパティ内に別のプロパティを持つオブジェクトがある場合batman
を使用してバットマンが設定されているかどうかを確認するhasOwnProperty
には、次のようにする必要があります。
if (superheros.hasOwnProperty("dcComics") && superheros.dcComics.hasOwnProperty("batman") {...}
シンプルな prop チェックを使用する:
if (superheros.dcComics && superheros.dcComics.batman)
ほとんどの場合、独自の js オブジェクトを定義していない場合、単に使用しても問題ありobj.prop
ませんか?
javascript - 変数が開発者によって定義された独自のプロパティを持たないオブジェクトであるかどうかを確認する方法は?
私のコードには、次のいずれかである変数があります。
- 数、
- ブール値、
- 文字列、
- 正規表現、
- デート、
- 0 個以上の「独自の」プロパティを持つオブジェクト。
その変数が「基本オブジェクト」かどうかを確認したい。「基本オブジェクト」を次のいずれかとして定義します。
- 数、
- ブール値、
- 文字列、
- 正規表現、
- デート、
つまり、開発者によって定義された「独自の」プロパティを持たないオブジェクトです。
条件を使用しましたObject.getOwnPropertyNames(obj).length === 0
が、文字列 (上記の定義によれば、「基本オブジェクト」 ) には、各文字と文字列の長さに対して「独自の」プロパティがあります。たとえば、Object.getOwnPropertyNames("test")
Chrome (Ubuntu 15.10 で 46.0.2490.86 (64 ビット)) DevTools コンソールと Ubuntu 15.10 で Firefox 42 の両方で実行すると、( ["0", "1", "2", "3", "length"]
Chrome で) と[ "length", "0", "1", "2", "3" ]
(Firefox で) 印刷されます。
では、上で説明した用語のように、変数が「基本オブジェクト」であるかどうかを確認する最も読みやすい方法は何ですか? パフォーマンスには関心がありませんが、読みやすさとデバッグの容易さに関心があります。
どうもありがとうございました!:-)
アップデート:
この関数を使い始めましたが、変更なしで新しい型と互換性のある解決策を誰かが教えてくれることを願っています。
javascript - 独自のプロパティをテストするあいまいな方法
本 Javascript: the definitive Guide Sixth Edition by David Flanagan の 147 ページで、著者は for..in ループを使用して配列を反復処理するときの注意事項について説明しています。以下は引用です (太字は私のものです)。
...このため、不要なプロパティを除外する追加のテストを含めない限り、配列で for/in ループを使用しないでください。 次のいずれかのテストを使用できます。
これで、最初のコード スニペットが明確になりました。継承されたプロパティはスキップされます。
ただし、2 番目のコード スニペットはまったくわかりません。
私の理解では、2 番目のコード スニペットは配列の数値以外のプロパティをスキップします (それが独自のプロパティであるかどうかにかかわらず (最初のコード スニペットとは異なります))。
しかし、その場合は、次のような単純化されたテストを使用できませんでした:
では、著者はなぜこのような複雑な表現を使用しているのでしょうか。
ここで何か不足していますか?