javascript - Varför är 1<x<3 alltid sant?


Jag lär mig TypeScript, och på sidan för att komma igång pratar de om hur oväntat JavaScript är.

Källa: https://www.typescriptlang.org/docs/handbook/typescript-from-scratch.html

if ("" == 0) {
// It is! But why??
}
if (1 < x < 3) {
// True for *any* value of x!
}

Men jag förstår fortfarande inte varför 1<x<3 alltid är sant? Till exempel, om jag sätter x=10, kommer det inte att vara sant logiskt, men varför sa de att det alltid är sant?

Svar #1

1 < x < 3 gör faktiskt detta:

(1 < x) < 3

Eller ännu längre form:

const tempVarA = 1 < x
const tempVarB = tempVarA < 3

Så 1 < x är antingen true eller false. Nästa steg är då true < 3 eller false < 3. De är inte särskilt meningsfulla som jämförelser, men låt oss se vad JavaScript gör med det:

console.log(true < 3) // true
console.log(false < 3) // true

Konstigt, men låt oss gräva djupare:

console.log(true >= 0) // true
console.log(true >= 1) // true
console.log(true >= 2) // false

console.log(false >= 0) // true
console.log(false >= 1) // false
console.log(false >= 2) // false

Det verkar som att true behandlas som 1 och false behandlas som 0. För att verifiera det låt oss jämföra med == (istället för ===) så att det tvingar datatypen åt oss.

console.log(true == 1) // true
console.log(true == 0) // false
console.log(false == 1) // false
console.log(false == 0) // true

Så 1 < x < 3 är alltid sant eftersom falskt blir 0 eller sant blir 1, och både 0 och 1 är alltid mindre än 3.


Förklaring :

i JavaScript konverterar jämförelseoperatorerna <, <=, >, >=, == och != sina operander för att göra dem jämförbara när de är av olika typer. Så när man jämför en boolean med ett nummer konverterar den booleanen till ett nummer, 0 eller 1.

Detta är anledningen till att du nästan alltid bör använda === istället för ==, och varför detta är ett typfel i TypeScript:

const a = true < 3
// Operator '<' cannot be applied to types 'boolean' and 'number'.(2365)

Kort version

Javascript och Typescript saknar en kedjbar jämförelseoperator.

Menade du att göra detta?

1 < x && x < 3

Relaterade artiklar