2016-01-05 9 views
5

言及する必要があります:私は少しJavaScriptを知っていますが、それほど深くはありません。この技術が使用された私は、コードを見てきましたプロパティの検出: 'in'を使用してプロパティにアクセスしようとしていますか?

if (window.console) { 
    // doSomething 
} 

昨日:

if ('console' in window) { 
    // doSomething 
} 

は両方とも、必ずこのプロパティはオブジェクトで利用可能であるかどうかを確認するための正しい方法と考え

技術は同等ですか?または彼らは区別するのですか?

+1

'window.console = false;'を実行して、両方の構文を実行してみてください。何が起こるか見る - https://jsfiddle.net/abhitalks/xmohL5wr/ – Abhitalks

答えて

4

いいえ。彼らには違いがあります。

最初にwindow.consoleの値がTruthyであり、consoleプロパティの2番目のチェックがwindowに存在するかどうかがチェックされます。

このような変数を作成したとします。

window.myName = ""; 

さて、if (window.MyName)は空の文字列をJavaScriptでFalsyあるとして、条件を満たすために失敗します。 myNamewindowオブジェクトのプロパティであるとして

console.log(Boolean(window.myName)); // false 

しかしif ("myName" in window)は、条件を満たします。

console.log(Boolean("myName" in window)); // true 


注:テストされているプロパティは、プロトタイプ階層のどこかにある場合でもinオペレータがtrueを返します。オブジェクト{}メソッドtoStringを継承しているため、例えば、

console.log("toString" in {}); // true 

trueを返します。

あなたは、オブジェクト自身にプロパティが存在することを確認するには、あなたは彼らが違いを持っ​​ているこの

console.log({}.hasOwnProperty("toString")); // false 
+1

よろしいですか。最初のケースの場合:コンソールが存在しない場合、未定義==偽の値を返します。したがって、ifブロックには入りません。それから、 "in"の使い方はよりクリーンな方法でしょうか? – bo256

+0

@ bo256プロパティが存在するかどうかを本当に確認したい場合は、 'in'演算子を使うべきです。 – thefourtheye

4

号のように、Object.prototype.hasOwnPropertyを使用する必要があります。

演算子inを使用する場合は、そのプロパティが指定されたオブジェクトで指定されていて、その値ではないかどうかをチェックします。たとえば:

var obj = { foo: undefined } 
obj.foo !== undefined; // false 
'foo' in obj;   // true 

は、それはそれは同等だあなたのケースでは

1

に役立ちます願っています。 演算子で使用すると、object内のそのプロパティexisitsが検索されます。 (window.console)の場合はと表示されます。window.consoleは真理値です。

1

window.consoleと言うとき、それはwindowオブジェクトのconsoleプロパティをチェックします。私は天候を考慮しませんconsoleプロパティは、ウィンドウオブジェクトの独自のプロパティであるか、または親から継承されています。

console in windowには、プロパティがウィンドウオブジェクトの独自のプロパティとして存在し、親から継承されていないことが確認されます。

+0

@thefourtheyeの回答を見る –

関連する問題