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
