簡體   English   中英

為什么 (0 < 5 < 3) 返回真?

[英]Why does (0 < 5 < 3) return true?

我在 jsfiddle.net 上玩,我很好奇為什么這會返回 true?

if(0 < 5 < 3) {
    alert("True");
}

這樣做也是如此:

if(0 < 5 < 2) {
    alert("True");
}

但這不是:

if(0 < 5 < 1) {
    alert("True");
}

這個怪癖有用嗎?

操作順序導致(0 < 5 < 3)在 javascript 中被解釋為((0 < 5) < 3)產生(true < 3)並且 true 被計為 1,導致它返回 true。

這也是為什么(0 < 5 < 1)返回 false, (0 < 5)返回 true,這被解釋為1 ,導致(1 < 1)

我的猜測是因為0 < 5為真,而true < 3被轉換為1 < 3 ,這是真的。

可能是因為true被假定為1所以

0 < 5 < 3  -->  true < 3 -->  1 < 3  --> true

因為true < 3 ,因為true == 1

至於你這個怪癖是否有用的問題:我想在某些情況下它可能會有用(如果你所追求的是濃縮代碼),但依賴它(很可能)會嚴重降低你的代碼的可理解性。

這有點像使用 post/pre increment/decrement 作為更大表達式的一部分。 你能一眼就判斷出這段代碼的結果是什么嗎?

int x = 5;
int result = ++x + x++ + --x;

注意:使用此代碼,有時甚至可以根據語言和編譯器獲得不同的結果。

讓自己和下一個將閱讀您的代碼的人的生活變得輕松是個好主意。 清楚地寫出您真正想要發生的事情,而不是依賴於諸如布爾值的隱式轉換之類的副作用。

問題第二部分的答案,“這個怪癖有用嗎?” 也許不是,正如之前的答案所指出的那樣,如果 true 被強制轉換為 1 確實是語言 (Javascript) 的一個怪癖,但程序員通常不會將 1 和 true(以及 0 和 false)視為同樣的事情。

然而,如果你有一個 1 為真而 0 為假的心理模型,那么它會導致各種非常有用、強大和直接的很好的布爾技術。 例如,您可以直接使用 A > 100 的結果遞增計數器,如果 A 大於 100,則計數器遞增。此技術在 Java 中可能被視為怪癖或技巧,但在數組或函數式語言中可能是慣用的。

數組語言 APL 中的一個經典示例是計算數組中(例如)大於 100 的項目數:

+/A>100

如果 A 是 5 項數組 107 22 256 110 3 那么:

A>100

產生 5 項布爾數組:

1 0 1 1 0

並總結這個布爾結果:

+/1 0 1 1 0

得出最終答案:

3

這個問題是這個技術非常有用的一個完美例子,特別是如果問題被概括為確定 m 個布爾值中的 n 個是否為真。

檢查三個布爾值中是否至少有兩個為真

這很容易。

(0 < 5 < 3)

從左到右開始,所以它評估第一個 0 < 5。這是真的嗎? 是的。 由於 TRUE=1,它計算 1 < 3。由於 1 小於 3,所以它是真的。

現在有了這個

 (0 < 5 < 1)

0 小於 5 嗎? 是的。 所以讓它為 TRUE,這也意味着 1。現在考慮到這個事實,它的計算結果為 (1 < 1)。 1 小於 1 嗎? 不,所以它是假的。 它必須是平等的。

除了 python,CoffeeScript 是另一種支持鏈式比較的語言,因此3 < x < 10在 vanilla JS 中將被轉換為(3 < x && x < 10)

是否評估 0<5 當 1<3 為真時返回 1 為真?

C#想讓你這樣做“運算符'<'不能應用於'bool'和'int'類型的操作數”

不久前我在 Obj-C 中遇到了這個問題,並對此感到非常困惑。 我通過做這樣的事情得到了我想要的結果:

if(0 < 5  && 5 < 3) {
alert("True");}

這當然是錯誤的,所以你不會得到那個“真實”的警報。 很高興我讀到了這個,我現在知道為什么了。

0 < 5 < 3 
==> ( ( 0 < 5 ) < 3 )
==> true < 3
==> 1 < 3
==> true

因為 0 小於 5 然后返回 true,默認情況下 true 是任何包括並且可以評估為 1 仍然小於 3 再次返回 true

布爾操作數在對數學運算符進行運算時返回一個數字。 檢查這個我們做

true + 1  which gives you 2.

所以0 < 5 ,返回的 boolean(true) 用數學 operator(<) 操作將返回一個數字。 所以它歸結為 1<3 返回true

嘗試將結果表述為 Number()

if(Number(0) < Number(5) < Number(3)) {
    alert("True");
}

或者試試這個:

if(Number(0) < Number(5) && Number(5) < Number(3)) {
    alert("True");
}

我用elm.getAttribute();搜索這個是因為我得到(3 >= 20) //returning true並且我猜 javascript 試圖檢查3作為一個布爾值,因為我從elm.getAttribute();獲取這個值elm.getAttribute(); 函數 which console.log(); 以字符串形式打印。

暫無
暫無

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

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