javascript - Prečo je 1<x<3 vždy pravda?
Učím sa TypeScript a na stránke pre začiatočníkov hovoria o tom, aký nečakaný je JavaScript.
Zdroj: 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!
}
Ale stále nechápem, prečo je 1<x<3 vždy pravda? Napríklad, ak nastavím x=10, podľa logiky to nebude pravda, ale prečo povedali, že je to vždy pravda?
Odpoveď č. 1
1 < x < 3 v skutočnosti robí toto:
(1 < x) < 3
Alebo ešte dlhšia forma:
const tempVarA = 1 < x
const tempVarB = tempVarA < 3
Takže 1 < x je buď true alebo false. Potom nasledujúci krok je true < 3 alebo false < 3. Ako porovnania to nedáva veľký zmysel, ale pozrime sa, čo s tým urobí JavaScript:
console.log(true < 3) // true
console.log(false < 3) // true
Divné, ale poďme sa ponoriť hlbšie:
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
Zdá sa, že true je považované za 1 a false je považované za 0. Aby sme to overili, porovnajme to pomocou == (namiesto ===), aby sa typ údajov za nás automaticky konvertoval.
console.log(true == 1) // true
console.log(true == 0) // false
console.log(false == 1) // false
console.log(false == 0) // true
Takže 1 < x < 3 je vždy pravda, pretože false sa stáva 0 alebo true sa stáva 1, a obe 0 aj 1 sú vždy menšie ako 3.
Vysvetlenie :
V JavaScripte porovnávacie operátory <, <=, >, >=, == a != prevádzajú svoje operandy, aby boli porovnateľné, keď sú rôznych typov. Takže pri porovnávaní booleanu s číslom sa boolean prevedie na číslo, 0 alebo 1.
Toto je dôvod, prečo by ste mali takmer vždy používať === namiesto ==, a prečo je to v typescripte chyba typu:
const a = true < 3
// Operator '<' cannot be applied to types 'boolean' and 'number'.(2365)
Krátka verzia
JavaScript a TypeScript nemajú reťaziteľný porovnávací operátor.
Chcel si to urobiť?
1 < x && x < 3
