2017-10-31 2 views
0

は、Visual Studioのコードで編集し、Google Chromeの同じ行で完璧に使用されていても、プロパティは未定義とマークされていますか? JavaScriptで

if ((piece == null || piece.color !== us)) 

上で実行されている上記の行は、私はこれに変更したときに、しかし、問題なくプロパティを実行します:

if ((piece == null || piece.color !== us) && piece.color !== UNION) 

またはこれを変更します:

if (piece.color == null || piece.color == swap_color(us)) 

私は次のエラーを取得する:

Uncaught TypeError: Cannot read property 'color' of undefined 

2番目のケースでエラーが発生するのはなぜですか?最初のケースには同じプロパティが含まれていますか?

EDIT

私は短絡にこれらの答えを読んでいるが、それは、誰かが私にはブール式を形成することができ、クリックしないのですか? 基本的には、piece.colorは

私がしたいswap_colorと同じである

  • くれ
  • それらを((私たち)
  • UNION 3例

    • ヌルのいずれかになります実行

      continue; 
      

      (piece.color == null || piece.color == swap_color(us))piece.color !== UNION

      そこで私の誤った最初の試み

  • +0

    一つの方法:あなたが削除または状態から場合に、それが読み: '場合(作品== nullの&& piece.color == UNION!)'。 –

    答えて

    4

    Why do I get the error in the second case, yet the first case included that same property?

    ブール演算子であるshort circuiting。それは

    • a || bするための手段:afalse
    • a && bある場合bにのみ評価されます。aだからtrue

    ある場合bにのみ評価され、piece.color !== uspiece == nullfalseある場合に実行のみですすなわちpiecenullまたはではありません。つまり、piece.colorにアクセスすると、常に「うまくいく」(エラーは発生しません)という意味です。

    piece == nulltrueの場合、piece.color !== UNIONが実行されます。あなたが書いたことは、基本的には「pieceがヌルで、piece.colorUNIONではない場合です(piecenullであることは、piece.colorが存在しないことを意味するため)。

    I want to run continue; in situations when (piece.color == null || piece.color == swap_color(us)) and when piece.color !== UNION

    "と" この文は、ブール値に変換してOR


    。しかし、 piecenullでないことを確認しなければならず、 piece.color !== UNIONpiece.color == swap_color(us)を意味するので、式を簡略化することができます。 piecepiece.color !== usをチェックせずにtrueになり、その後 piece == null || piece.color !== us)) nullの場合

    if (piece == null || piece.color !== UNION) { 
        continue; 
    } 
    
    0

    は、そうpiece.color !== UNIONが評価されますが、pieceがnullであるため、piece.colorは未定義です。

    あなたのロジックにはこのような欠陥があります。実際には私はあなたが何を意味するか分からないという事実に誤りがあります。それはあなたが意味するように思えるでしょう。 pieceがnullの場合はどうしますか?

    0

    これはshort-circuit evaluationと呼ばれるもので起こる:

    はのはpiece == nullを想定してみましょう:最初のケースでは、コンパイラはorの左側を評価する必要があります。 trueを取得すると、式全体がtrueになるため、右側をスキップできます。

    左の式は上記のようにtrueと評価されますが、andは両辺がtrueであることを要求するため、コンパイラは右側を評価しようとします。それが存在しない財産に遭遇する場所です。

    これを試してみてください:それについて考えるために

    if (piece === null || (piece && piece.color && piece.color !== us && piece.color !== UNION) 
    
    関連する問題