Көптөгөн салыштыруу операторлору бизге математикадан белгилүү.
JavaScript'те алар мындай жазылат:
- Чоң/кичине:
a > b
,a < b
. - Чоң/кичине же барабар:
a >= b
,a <= b
. - Барабар:
a == b
. Көңүл буруңуз, кош барабардык белгиси==
салыштыруу үчүн колдонулат, ал эми жалгыз барабардык белгисиa = b
ыйгарууну билдирчү. - Барабар эмес: Математикада
≠
белгиси менен белгиленет, бирок JavaScript'теa != b
деп жазылат.
Бул бөлүмдө биз салыштыруунун ар кандай түрлөрү, JavaScript аларды кантип аткарышы жана маанилүү өзгөчөлүктөрү жөнүндө көбүрөөк үйрөнөбүз.
Аягында, сиз JavaScript'теги салыштыруу "тентектиктеринен" сактануу үчүн жакшы кеңештерди таба аласыз.
Бардык салыштыруу операторлору логикалык түрдөгү маанини кайтарат:
true
-- "ооба", "туура" же "чындыкты" билдирет.false
-- "жок", "туура эмес" же "жалганды" билдирет.
Мисалы:
alert( 2 > 1 ); // true (туура)
alert( 2 == 1 ); // false (туура эмес)
alert( 2 != 1 ); // true (туура)
Салыштыруунун натыйжасы ар кандай маани сыяктуу эле өзгөрмөгө ыйгарылышы мүмкүн:
let result = 5 > 4; // салыштыруунун натыйжасы result өзгөрмөсүнө ыйгарылат
alert( result ); // true
Бир сап экинчисинен чоңураак экенин аныктоо үчүн JavaScript "алиппелик" же "лексикографиялык" деп аталган тартипти колдонот.
Башкача айтканда, саптар белгиден белгиге салыштырылат.
Мисалы:
alert( 'Я' > 'А' ); // туура (true)
alert( 'Кант' > 'Калп' ); // туура (true)
alert( 'Балдар' > 'Бал' ); // туура (true)
Эки сапты салыштыруу алгоритми абдан жөнөкөй:
- Эки саптын биринчи белгилери салыштырылат.
- Эгерде биринчи саптын биринчи белгиси башка саптардан чоң (же кичине) болсо, биринчи сап экинчисинен чоң (же кичине) болот. Салыштыруу аяктады.
- Болбосо, эки саптын тең биринчи белгилери бирдей болсо, экинчи белгилери ошондой жол менен эле салыштырылат.
- Салыштыруу саптардын бири бүтмөйүнчө уланат.
- Эгерде эки сап бирдей узундукта аяктаса, анда алар барабар болот. Болбосо, узун сап чоңураак болуп саналат.
Жогорудагы биринчи мисалда 'Я' > 'А'
салыштыруусу биринчи кадамда аяктайт.
Экинчи 'Кант'
жана 'Калп'
сөздөрүнүн салыштыруусу белгиден белгиге салыштырылат:
К
мененК
барабар.а
менена
барабар.н
л
ден чоңураак. Бул жерде салыштыруу бүтөт. Биринчи сап чоңураак.
Жогоруда келтирилген салыштыруу алгоритми болжол менен сөздүктөрдө же телефон китептеринде колдонулган алгоритмиге барабар, бирок так окшош эмес.
Мисалы, JavaScript'те белги регистри мааниге ээ. Баш `"A"` тамгасы кичине `"a"` тамгасына барабар эмес. Кайсынысы чоңураак? Кичине `"a"` тамгасы. Эмнеге? Анткени кичине тамгалар JavaScript (Unicode) колдонгон ички коддоо жадыбалында чоңураак кодго ээ. Бул коддоонун өзгөчөлүктөрүн жана натыйжаларын <info:string> бөлүмүндө карап чыгабыз.
Ар кандай түрдөгү маанилер салыштырылганда, JavaScript ошол маанилерди сандарга айландырат.
Мисалы:
alert( '2' > 1 ); // true, '2' сабы 2 санына айланат
alert( '01' == 1 ); // true, '01' сабы 1 санына айланат
Логикалык true
мааниси 1
, жана false
мааниси 0
болуп калат.
Мисалы:
alert( true == 1 ); // true
alert( false == 0 ); // true
Төмөнкү кырдаал болушу мүмкүн:
- Эки маани барабар.
- Алардын бири логикалык `true` мааниси, экинчиси - `false`.
Мисалы:
```js run
let a = 0;
alert( Boolean(a) ); // false
let b = "0";
alert( Boolean(b) ); // true
alert(a == b); // true!
```
JavaScript'тин көз карашын боюнча бул кадимки натыйжа. Теңдикти текшерүү маанилерди сандык айландырууну колдонуу менен өзгөртөт (ошондуктан `"0"` - `0` болуп калат), ал эми айкын `Boolean` айландыруусу башка эрежелер топтомун колдонот.
Кадимки салыштыруу ==
операторунун көйгөйү бар. Ал 0
менен false
маанилерин айырмалай албайт:
alert( 0 == false ); // true
Ошол эле көйгөй бош сап менен келип чыгат:
alert( '' == false ); // true
Бул натыйжа ар кандай түрдөгү операнддар ==
теңдик оператору менен салыштырылганда, алар сандарга айландырылгандыктан пайда болот. Бош сап да, false
да нөлгө айланат.
Биз 0
менен false
ажыратууну кааласак, анда эмне кылыш керек?
Так теңдик оператору ===
маанилердин теңдигин түрдү айландыруусуз текшерет.
Башкача айтканда, эгерде a
жана b
түрлөрү ар кандай болсо, анда a === b
аларды айландырууга аракет кылбастан дароо false
кайтарат.
Сынап көрөлү:
alert( 0 === false ); // false, анткени түрлөрү ар кандай
Ошондой эле !=
операторуна окшош "так теңсиздик" !==
оператору бар.
The strict equality operator is a bit longer to write, but makes it obvious what's going on and leaves less room for errors.
null
же undefined
башка маанилер менен салыштырылганда күтүлбөгөн кылык-жоруктары бар.
For a strict equality check ===
: These values are different, because each of them is a different type.
```js run
alert( null === undefined ); // false
```
For a non-strict check ==
: There's a special rule. These two are a "sweet couple": they equal each other (in the sense of ==
), but not any other value.
```js run
alert( null == undefined ); // true
```
For maths and other comparisons < > <= >=
: null/undefined
are converted to numbers: null
becomes 0
, while undefined
becomes NaN
.
Now let's see some funny things that happen when we apply these rules. And, what's more important, how to not fall into a trap with them.
Let's compare null
with a zero:
alert( null > 0 ); // (1) false
alert( null == 0 ); // (2) false
alert( null >= 0 ); // (3) *!*true*/!*
Mathematically, that's strange. The last result states that "null
is greater than or equal to zero", so in one of the comparisons above it must be true
, but they are both false.
The reason is that an equality check ==
and comparisons > < >= <=
work differently. Comparisons convert null
to a number, treating it as 0
. That's why (3) null >= 0
is true and (1) null > 0
is false.
On the other hand, the equality check ==
for undefined
and null
is defined such that, without any conversions, they equal each other and don't equal anything else. That's why (2) null == 0
is false.
The value undefined
shouldn't be compared to other values:
alert( undefined > 0 ); // false (1)
alert( undefined < 0 ); // false (2)
alert( undefined == 0 ); // false (3)
Why does it dislike zero so much? Always false!
We get these results because:
- Comparisons
(1)
and(2)
returnfalse
becauseundefined
gets converted toNaN
andNaN
is a special numeric value which returnsfalse
for all comparisons. - The equality check
(3)
returnsfalse
becauseundefined
only equalsnull
,undefined
, and no other value.
Why did we go over these examples? Should we remember these peculiarities all the time? Well, not really. Actually, these tricky things will gradually become familiar over time, but there's a solid way to avoid problems with them:
- Treat any comparison with
undefined/null
except the strict equality===
with exceptional care. - Don't use comparisons
>= > < <=
with a variable which may benull/undefined
, unless you're really sure of what you're doing. If a variable can have these values, check for them separately.
- Салыштыруу операторлору логикалык маанини кайтарат.
- Strings are compared letter-by-letter in the "dictionary" order.
- When values of different types are compared, they get converted to numbers (with the exclusion of a strict equality check).
- The values
null
andundefined
equal==
each other and do not equal any other value. - Be careful when using comparisons like
>
or<
with variables that can occasionally benull/undefined
. Checking fornull/undefined
separately is a good idea.