2017-05-10 12 views
2

私はこれを変更することが示唆されましたそれは有効です。もう一つの部分は私に不思議に思った。Javascriptをチェックするタイプの適切な方法は、

私はそれが何をしているのか理解していますが、それでも使用する私の頭を包むことはできません。

+0

です2番目の例は、もう1つの検査のレイヤーを示しています。あなたの最初の例は、 'user.account'が存在しない場合、エラーを投げます。 – wostex

+0

他の回答は削除されていてうれしいです。有用であると投票したので、 '(typeof a = undefined)'が 'typeof'の結果が' undefined'であることを明らかにしたいだけです。これは重大な問題です。 'typeof'の正しい比較は'(typeof a == 'undefined') 'です。さて、あなたの質問への答えは以下の通りです。 – gotmikhail

答えて

1

プロパティが存在せず、その型または値を取得しようとすると、undefinedが返されます。あなたは(if/then文は条件として提供された表現で何をするかである)ブールにundefinedを変換する場合、特定の値がtruthyであり、他はfalseyているので、あなたはfalseを取得します。

だから、これはないundefinedのテストの明示的な方法である:

if (typeof user.account.products !== 'undefined') {} 

そして、これは同じことをやっての暗黙的な方法である:

if (user.account.products) 

今すぐあなたのライン:

if (user.account && user.account.hasOwnProperty('products')) 

これらのいずれよりも具体的なのは、user.accountが存在しますが、そのオブジェクトに独自のproductsプロパティがあるかどうかを確認するためのテストも行われます。それがあなたが使用しようとしているそのプロパティであり、user.accountが存在しないか、それがプロパティとしてproductsを持っている可能性がありますが、これがテストする最良の方法です。

しかし、この種のテストを行う方法はまだまだあります。これは:

プロパティが継承されているかどうかに関係なく、それぞれのプロパティがホストオブジェクトに存在するかどうかを確認します。

しかし、それはあなたが気にproductsプロパティであれば、最後に、あなたが本当に必要なのは次のとおりです。

if(products in user.account); 

productsがないか、それuser.accountが有効でない場合、このテストは失敗します。 。

これは、どれだけ細かいテストをしたいかによって異なります。

+0

'hasOwnProperty'を使ってチェックすると' products'がプロトタイプに存在し、オブジェクト自体には存在しないと 'false'を報告しますか? – evolutionxbox

+0

@evolutionxboxはい、そうです。しかし私が答えて言ったように、 "それは、そのオブジェクトが**独自の**製品のプロパティを持っているかどうかを調べるためにテストされます。" * –

+0

確かに。 (ps、私のコメントは質問でした、挑戦ではありません) – evolutionxbox

0

は、使用して、なぜ私が正しく、あなたが求めているあなたの質問を取得する場合:

user.account.hasOwnProperty('products') 

の代わりに:

user.account.products !== undefined 

その場合には、2つのオプションが有効です。このように、新しいオプション(hasOwnProperty)はよりエレガントです。プロパティが存在すると仮定して定義されているかどうかを確認するのではなく、オブジェクトにこのプロパティがあるかどうかを確認します。

2

最初のチェックは、あなたが言及していない第三の選択肢もあり

if (typeof user.account.products !== 'undefined') { 
    // i will execute if products property is defined on user.account 
    // even is null or 0 
} 

第2チェック手段(簡体字)

if (user.account.hasOwnProperty('products')) { 
    // i will execute if user.account has a property of "products" even if products property is undefined/null/0 
    // and also i wont be executed if user.account is inherited from something has its own 
    // "products" property but not defined on user.account's prototype (inherited property). 

} 

意味これは

if ('products' in user.account) { 
    // i will execute if user.account has a property of 
    // "products" even if products property is undefined/null/0 
} 
+0

私は3番目のオプションが好きです –

関連する問題