2017-02-22 5 views
2

で私は、条件文を書きながら使用する方が適切であろうかを知るようになる場合はJavaScriptで場合(偽)対(未定義の)条件文

if(false){} 

あるいはまた

if(undefined){} 

私はfalseに変換されます if(undefined)ではJavaScript

背景

知っています私はこの

var obj ={} 
var someFunc = function(a){ 
    obj = { 
     key1:true, 
     key2:a, // i will like to have it as a?true:false 
     key3: !a 
    } 

のように私はこのsomeFunc()のように呼び出す場合、引数を渡さず、その後、key2は未定義になります。この

someFunc(true); 

のような機能を機能&オブジェクトを呼び出していている

後、私は私がobj.key2が定義されていない場合、それはif(false)よう強要されます知っている述べたように、条件文で

if(obj.key2){ 

} 

を、このキーを使用します。

+2

なし。以来、値が偽であれば、 'if'ブロックは実行されません。 – Tushar

+0

私はブロックが偽であれば実行されるべきではないが、私の質問は偽の状態を確認するのに適していると言う文を内部で知っている – brk

+0

'key2 in obj'はここでより意味をなさないでしょう。 –

答えて

1

特に値のタイプを確認する必要がある場合は、次のように使用する必要があります。

if(value === false){} 
or 
if(value === undefined){} 

その他(if(false)またはif(undefined)がOKの場合)。

1

あなたが尋ねるのは、「オブジェクト検出」です。オブジェクトが存在するかどうかを検出する方法でコードを構築する必要がある場合は、&そのオブジェクトに対して操作します。あなたのコードの防弾/バグがフリー化の好ましい方法は、これを行うことです。

if (obj && obj.key2){ // If object and object property both exist... 
    // Do something here... 
} 

適切に(varキーワードとJavaScriptで未定義の型を使用し、この時に説明予期しない条件付き反転動作を避けるためにするにはSO記事:Behavior of the typeof keyword)の前に "typeof"キーワードを付けることができます。その出力は、トリプル「===」演算子を使って文字列として比較することができます。同様に、

if (typeof value === 'undefined'){ 
    // Do something... 
} 

これらのオプションのかっこを使用する傾向がありますが、必須ではありません。

if (typeof(value) === 'undefined'){ 
    // Do something... 
} 

は、次に、あなたのコードは次のようになります:

あくまで一例ですが、あなたがオブジェクト検出を必要としません
var obj = {}; 
var someFunc = function(a){ 
    obj = { 
     "key1": true, 
     "key2": a, 
     "key3": !a 
    }; 

    // True > False Example: 
    if (obj && obj.key2) { // true 
     // Do something true... 
    } else { // false 
     // Do something else... 
    } 

    // False > True Example, using a "not condition" AKA "!" AKA an exclamation point: 
    if (obj && !obj.key3) { // false 
     // Here you're checking for the object, but the false value for the key3 property. 
    } else if (obj && obj.key3) { // true 
     // Here you'd need the object detection again, as you'd be checking for the key3 property on that object. 
    } 
}; 

、なぜならそれは私が読みたいだけのコーディングスタイル、ですobjをグローバル&として宣言し、関数内の値に割り当てます。理由は分かりますか?

それはそうのように、関数にVARを入れても良いでしょう:&は、機能ブロック自体にそれをスコープグローバルスコープから削除し

var obj = { 
    "key1": true, 
    "key2": a, 
    "key3": !a 
}; 

を。

let」というキーワード&については、「var」をどのように置き換えることもできます。素晴らしい

何かが、次のようになります。「偽」と「未定義」の

let someFunc = function(json) { 
    // Another object detection example: 
    if (json) { 

     // Since key1 is always true, we don't need the if/else for it. 
     // Just add any key1 code here, without the if(...) statement. 

     // Switches are faster than if/else-if/else statements. 
     switch(json.key2) { 
     case true: 
      // Do something true with key2... 
      break; 
     case false: 
      // Do something else with key2... 
      break; 
     } 

     switch(json.key3) { 
     case true: 
      // Do something true with key3... 
      break; 
     case false: 
      // Do something else with key3... 
      break; 
     } 
    } 
}; 

// Usage: 
someFunc({ 
    "key1": true, 
    "key2": a, 
    "key3": !a 
}); 
+0

* "JavaScriptで未定義の型を正しく使用するには、" typeof "キーワード" *を付ける必要があります。 'variable === undefined'は' variable'が宣言されていることを知っていれば問題ありません。 'variable'は' let'で宣言された変数の「時間的不感帯」で 'variable'が使用されている場合にReferenceErrorを返します。または 'const'。 – nnnnnn

+0

はい、「変数が宣言されていることを知っていれば問題ありませんが、変数が宣言されているかどうかを知らずにコードを書くことができます。パラメータを使用せずにメソッドをオーバーロードして引数をチェックすると、変数をバイパスできます。問題は、typeofキーワードhttp:// stackoverflowの動作で説明したとおりです。com/questions/36635341/behavior-of-the-typeof-keyword記事では、ロジックが予期せず動作を切り替えることがあります。 typeofキーワードの出力をチェックして文字列かどうかを確認すると、予期しない動作が発生するのを防ぐことができます。 – Clomp

+0

しかし、あなたが提案した 'typeof'を' let' *で使うことができないという事実にもかかわらず、あなたはあなたの答えを更新しました。コメントにリンクされている質問は、定義されていない変数とは関係がないため、関連しません。定義されていないオブジェクトプロパティに関するものです。 * "typeofキーワードの出力をチェックして文字列かどうかを調べる" * - typeof'演算子* always *は、(参照エラーが発生しない限り)文字列を返します。 – nnnnnn

1

定義:

あなたが虚偽の比較if文を与えると、それが特異的ですブール値を探しています。しかし、変数が未定義の場合は、自動的にfalseになります。

ifステートメントは、定義されていないか、値として未定義に割り当てられた変数を特に探しています。 if文if (!variable)は、variableの値としてfalseまたはundefinedの両方を受け入れます。

だから最終結果は何ですか?

それは場合はfalseまたは未定義の違いはありませんし、if文は次のようになります場合にのみ:

if (variable) { 
// variable can be undefined or false 
} 

しかし、それは以下であるように文が見える場合、それは2つだけの1を受け入れます、それに一致したものに応じて:

if (variable == false) { 
// Now it strictly must be "false". Undefined is not accepted 
} 
+1

'変数'が '0'や' '0 ''や '' ''の場合 'if(variable == false)'も一致します。 – nnnnnn

+0

@Kaiido - '' 0 "'は真実ですが、 '=='演算子は型強制を行うため '' 0 '== false''が ''と評価されます。 (同様に、 '' 0 "!= false'は' false'と評価されます。) '=='の代わりに '==='を使うと、この問題は回避されます。 – nnnnnn

関連する問題