一個蠻有趣的 JS 題目

判斷下面會印出甚麼?

console.log(1 < 2 < 3);
console.log(3 > 2 > 1);

從數學角度來看:

兩個應該都會印出 true,但實際上…

console.log(1 < 2 < 3); // true
console.log(3 > 2 > 1); // false

第一次比較:

由左而右依序比較,1<2 的結果得到 true,而 3>2 的結果也得到 true,所以…

console.log((1 < 2) < 3);
console.log((3 > 2) > 1);

變成

console.log(true < 3);
console.log(true > 1);

第二次比較:

因為是數字才能比大小,所以 true 會自動轉型為數字 1,可以理解如下:

console.log(Number(true) < 3);
console.log(Number(true) > 1);

變成

console.log(1 < 3); // true
console.log(1 > 1); // false

除了 JavaScript,VB.net也會有相同情況

VB.net

Console.WriteLine(1<2<3) 'True
Console.WriteLine(3>2>1) 'False

其他強型別程式語言則會直接報錯

C#

Console.WriteLine(1<2<3);
// error CS0019: Operator `<' cannot be applied to operands of type `bool' and `int'

Ruby

puts 1<2<3;
# undefined method `<' for true:TrueClass (NoMethodError)

Java

System.out.println(1<2<3);
// error: bad operand types for binary operator '<'
//       System.out.println(1<2<3);
//                             ^
// first type:  boolean
// second type: int

Golang

package main

import "fmt"

func main() {
  fmt.Printf(1<2<3)
  fmt.Printf(3>2>1)
}
// ./main.go:6: cannot convert 3 to type bool
// ./main.go:6: invalid operation: 1 < 2 < 3 (mismatched types bool and int)
// ./main.go:7: cannot convert 1 to type bool
// ./main.go:7: invalid operation: 3 > 2 > 1 (mismatched types bool and int)

Python 是例外

Python 相對人性,支援連續比較。

Python

print (1<2<3);
# True
print (3>2>1);
# True

Python 連續比較時等價於使用 and 運算,所以本題在 Python 眼裡其實是這樣的

Python

print (1<2 and 2<3);
# True
print (3>2 and 2>1);
# True