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

Súvisiace články