簡體   English   中英

屬性被標記為未定義,即使它在同一行上被完美使用?

[英]property marked as undefined even though it is being used on the same line flawlessly?

在javascript中,在Visual Studio Code中進行編輯,並在Google Chrome上運行

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

為什么在第二種情況下卻出現錯誤,而第一種情況卻包含相同的屬性?

編輯

我一直在閱讀有關短路的這些答案,但並不是單擊,有人可以幫助我形成布爾表達式嗎? 基本上,piece.color可能是以下三種情況之一

  • 空值
  • 我們
  • 它們(與swap_color(us)相同
  • 聯盟

我要跑步

continue;

在以下情況下: (piece.color == null || piece.color == swap_color(us))並且piece.color !== UNION

因此,我錯誤的第一次嘗試

為什么在第二種情況下卻出現錯誤,而第一種情況卻包含相同的屬性?

布爾運算符是短路的 這意味着

  • a || b a || b :僅當afalse時才評估b
  • a && b :僅當atrue時才評估b

因此, piece.color !== us piece == nullfalse ,即piece不為nullundefined 這意味着訪問piece.color將始終“起作用”(不會引發錯誤)。

另一方面,如果piece == nulltrue則執行piece.color !== UNION 您寫的基本上是指“如果piece為null,而piece.color不是UNION 。盡管那樣沒有多大意義(因為piecenull意味着piece.color不存在)。


我要繼續跑步continue; 在以下情況下: (piece.color == null || piece.color == swap_color(us))並且piece.color !== UNION

這句話中的“和”轉換為布爾OR。 但是您仍然必須檢查piece不為null並且可以簡化表達式,因為piece.color !== UNION意味着piece.color == swap_color(us)

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

如果piece為null,則piece == null || piece.color !== us)) piece == null || piece.color !== us))將為true而不檢查piece.color !== us ,所以piece.color !== UNION進行評估,但因為piece是空的piece.color未定義。

這樣您的邏輯是錯誤的。 實際上如此錯誤,以至於我不確定您的意思。 看來您的意思是; 如果piece為空,您想怎么辦?

發生這種情況的原因是所謂的短路評估

讓我們假設piece == null :在第一種情況下,編譯器僅需要評估or的左側。 一旦為true ,它就可以跳過右側,因為無論如何整個表達式都是true的。

在第二種情況下,如上所述,left表達式的計算結果為true ,但是編譯器嘗試評估右側,因為an and要求雙方均為true 那就是它遇到不存在的屬性的地方。

嘗試這個:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM