3

javascriptで利用可能なプロパティまたはメソッドをチェックするさまざまな方法を見てきました。

if(typeof window.somePropOrMethod​ !== "undefined"){ }

if(window.hasOwnProperty("somePropOrMethod")){ }

if("somePropOrMethod" in window){ }

if(!!window.somePropOrMethod) { }

どちらを使用する必要がありますか、またその理由は何ですか?それはすべて個人的な好みによるものですか、それともそれらの間に微妙な違いがありますか?

4

3 に答える 3

2

それは状況とあなたがあなたのテストをどれだけ厳しくしたいかに依存します。

  1. somePropOrMethod属性が特定のオブジェクトで定義されていることを確認しません。継承チェーンにあることだけをチェックします。通常、これは問題ではありません。特にチェックするときwindow.はそうですが、特に「somePropOrMethod」属性がチェックされていないことを確認してください undefined

    function Foo() {
    
    }
    Foo.prototype.bar = 4;
    Foo.prototype.baz = undefined;
    
    var x = new Foo();
    
    typeof x.bar​ !== "undefined"; // true, but "x" doesn't actually have a bar attribute; it's in the inheritance chain
    typeof x.baz​ !== "undefined"; // false
    
  2. 特定のオブジェクトが属性を保持しているかどうかをチェックし、その検索から継承チェーンを除外します。somePropOrMethodただし、が未定義ではないかどうかはチェックされません。

    window.foo = undefined;
    window.hasOwnProperty("foo"); // true; but it's undefined
    
    // any properties on window.__proto__ will return false
    
  3. undefined;に対してチェックしないことを除いて、最初のものと同じです。オブジェクトにメンバー(未定義の可能性があります)があることを確認するだけです。

  4. これはオブジェクトとその継承チェーン(つまり、#1と#3のテリトリー)をチェックしますが、の値をチェックするだけです。

    window.foo = false;
    window.bar = 0;
    window.baz = null;
    
    !!window.foo; // false
    !!window.bar; // false
    !!window.baz; // false
    

もちろん、メソッドが必要な場合は、それが関数であることを確認する必要があります

if(typeof window.someMethod​ !== "function"){ } // specifically check for a function

他の属性についても同じことを行う必要があります(などstringnumberまたはinstanceofキーワードを使用することもできます)。

于 2012-09-04T11:03:04.380 に答える
1

1つ目は、プロパティが定義されているかどうかを示します。定義されていなくても存在できます。

2つ目は、オブジェクトがプロパティを直接持っているかどうかを示します(ただし、プロトタイプを介してプロパティを継承している場合はわかりません)。

3つ目は、オブジェクトにプロパティがあるかどうかを示します。

4つ目は、が真の値を持っているかどうかを示します(そうで{ number_of_children: 0 }はありません)。

于 2012-09-04T11:00:46.887 に答える
1
  • if(typeof window.somePropOrMethod​ !== "undefined"){ }

somePropOrMethodがのプロパティでwindowあり、その値が。以外のものであるかどうかを確認しますundefined
[オブジェクトとそのプロトタイプチェーンを直接チェックする]

  • if(window.hasOwnProperty("somePropOrMethod")){ }

値に関係なく、オブジェクト自体に明示的somePropOrMethodに存在するかどうかをチェックします(#1とは異なります) [オブジェクトを直接チェックするだけです]window

  • if("somePropOrMethod" in window){ }

値に関係なく、オブジェクト自体またはそのプロトタイプチェーンでsomePropOrMethod検出できるかどうかをチェックします(#1とは異なります) [オブジェクトとそのプロトタイプチェーンを直接チェックします]

  • if(!!window.somePropOrMethod) { }

ここで行われるのは、の値を取得somePropOrMethodしてブール値に変換することです。somePropOrMethodisundefinedまたはその他の偽の値の場合、結果は常にになりますfalse。それ以外の場合は、true
[オブジェクトとそのプロトタイプチェーンを直接チェックします]

于 2012-09-04T11:08:32.227 に答える