[英]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可能是以下三種情況之一
我要跑步
continue;
在以下情況下: (piece.color == null || piece.color == swap_color(us))
並且piece.color !== UNION
因此,我錯誤的第一次嘗試
為什么在第二種情況下卻出現錯誤,而第一種情況卻包含相同的屬性?
布爾運算符是短路的 。 這意味着
a || b
a || b
:僅當a
為false
時才評估b
a && b
:僅當a
為true
時才評估b
因此, piece.color !== us
僅在piece == null
為false
,即piece
不為null
或undefined
。 這意味着訪問piece.color
將始終“起作用”(不會引發錯誤)。
另一方面,如果piece == null
為true
則執行piece.color !== UNION
。 您寫的基本上是指“如果piece
為null,而piece.color
不是UNION
。盡管那樣沒有多大意義(因為piece
為null
意味着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.