Ðногие опеÑаÑоÑÑ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð¸Ð·Ð²ÐµÑÑÐ½Ñ Ð½Ð°Ð¼ из маÑемаÑики.
Ð JavaScript они запиÑÑваÑÑÑÑ Ñак:
- ÐолÑÑе/менÑÑе:
a > b,a < b. - ÐолÑÑе/менÑÑе или Ñавно:
a >= b,a <= b. - Равно:
a == b. ÐбÑаÑиÑе внимание, Ð´Ð»Ñ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð¸ÑполÑзÑеÑÑÑ Ð´Ð²Ð¾Ð¹Ð½Ð¾Ð¹ знак ÑавенÑÑва==. Ðдин знак ÑавенÑÑваa = bознаÑал Ð±Ñ Ð¿ÑиÑваивание. - Ðе Ñавно. РмаÑемаÑике обознаÑаеÑÑÑ Ñимволом
â, но в JavaScript запиÑÑваеÑÑÑ ÐºÐ°Ðºa != b.
Ð ÑÑом Ñазделе Ð¼Ñ Ð±Ð¾Ð»ÑÑе Ñзнаем пÑо Ñо, какие бÑваÑÑ ÑÑавнениÑ, как ÑзÑк Ñ Ð½Ð¸Ð¼Ð¸ ÑабоÑÐ°ÐµÑ Ð¸ к каким неожиданноÑÑÑм Ð¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð³Ð¾ÑовÑ.
РконÑе Ð²Ñ Ð½Ð°Ð¹Ð´ÑÑе Ñ Ð¾ÑоÑий ÑеÑÐµÐ¿Ñ Ñого, как избегаÑÑ Â«Ð¿ÑиÑÑд» ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð² 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). ÐÑ ÐµÑÑ Ð¿Ð¾Ð³Ð¾Ð²Ð¾Ñим о внÑÑÑеннем пÑедÑÑавлении ÑÑÑок и его влиÑнии в главе СÑÑоки.
СÑавнение ÑазнÑÑ Ñипов
ÐÑи ÑÑавнении знаÑений ÑазнÑÑ Ñипов 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.
ÐапÑимеÑ:
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, Ñак как ÑÑавниваÑÑÑÑ ÑазнÑе ÑипÑ
ÐÑÑ ÐµÑÑÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ ÑÑÑогого неÑавенÑÑва !==, аналогиÑнÑй !=.
ÐпеÑаÑÐ¾Ñ ÑÑÑогого ÑавенÑÑва долÑÑе пиÑаÑÑ, но он Ð´ÐµÐ»Ð°ÐµÑ ÐºÐ¾Ð´ более оÑевиднÑм и оÑÑавлÑÐµÑ Ð¼ÐµÐ½ÑÑе меÑÑа Ð´Ð»Ñ Ð¾Ñибок.
СÑавнение Ñ null и undefined
Ðоведение null и undefined пÑи ÑÑавнении Ñ Ð´ÑÑгими знаÑениÑми â оÑобое:
- ÐÑи ÑÑÑогом ÑавенÑÑве
=== -
ÐÑи знаÑÐµÐ½Ð¸Ñ ÑазлиÑнÑ, Ñак как ÑазлиÑÐ½Ñ Ð¸Ñ ÑипÑ.
alert( null === undefined ); // false - ÐÑи неÑÑÑогом ÑавенÑÑве
== -
ÐÑи знаÑÐµÐ½Ð¸Ñ ÑÐ°Ð²Ð½Ñ Ð´ÑÑг дÑÑÐ³Ñ Ð¸ не ÑÐ°Ð²Ð½Ñ Ð½Ð¸ÐºÐ°ÐºÐ¸Ð¼ дÑÑгим знаÑениÑм. ÐÑо ÑпеÑиалÑное пÑавило ÑзÑка.
alert( null == undefined ); // true - ÐÑи иÑполÑзовании маÑемаÑиÑеÑкиÑ
опеÑаÑоÑов и дÑÑгиÑ
опеÑаÑоÑов ÑÑавнениÑ
< > <= >= -
ÐнаÑениÑ
null/undefinedпÑеобÑазÑÑÑÑÑ Ðº ÑиÑлам:nullÑÑановиÑÑÑ0, аundefinedâNaN.
ÐоÑмоÑÑим, какие забавнÑе веÑи ÑлÑÑаÑÑÑÑ, когда Ð¼Ñ Ð¿ÑименÑем ÑÑи пÑавила. Ð, ÑÑо более важно, как избежаÑÑ Ð¾Ñибок пÑи Ð¸Ñ Ð¸ÑполÑзовании.
СÑÑаннÑй ÑезÑлÑÑÐ°Ñ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ null и 0
СÑавним null Ñ Ð½ÑлÑм:
alert( null > 0 ); // (1) false
alert( null == 0 ); // (2) false
alert( null >= 0 ); // (3) true
С ÑоÑки зÑÐµÐ½Ð¸Ñ Ð¼Ð°ÑемаÑики ÑÑо ÑÑÑанно. РезÑлÑÑÐ°Ñ Ð¿Ð¾Ñледнего ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð³Ð¾Ð²Ð¾ÑÐ¸Ñ Ð¾ Ñом, ÑÑо «null болÑÑе или Ñавно нÑлÑ», Ñогда ÑезÑлÑÑÐ°Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ из ÑÑавнений вÑÑе должен бÑÑÑ true, но они оба ложнÑ.
ÐÑиÑина в Ñом, ÑÑо неÑÑÑогое ÑавенÑÑво и ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ > < >= <= ÑабоÑаÑÑ Ð¿Ð¾-ÑазномÑ. СÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð¿ÑеобÑазÑÑÑ null в ÑиÑло, ÑаÑÑмаÑÑÐ¸Ð²Ð°Ñ ÐµÐ³Ð¾ как 0. ÐоÑÑÐ¾Ð¼Ñ Ð²ÑÑажение (3) null >= 0 иÑÑинно, а null > 0 ложно.
С дÑÑгой ÑÑоÑонÑ, Ð´Ð»Ñ Ð½ÐµÑÑÑогого ÑавенÑÑва == знаÑений undefined и null дейÑÑвÑÐµÑ Ð¾Ñобое пÑавило: ÑÑи знаÑÐµÐ½Ð¸Ñ Ð½Ð¸ к ÑÐµÐ¼Ñ Ð½Ðµ пÑиводÑÑÑÑ, они ÑÐ°Ð²Ð½Ñ Ð´ÑÑг дÑÑÐ³Ñ Ð¸ не ÑÐ°Ð²Ð½Ñ Ð½Ð¸ÑÐµÐ¼Ñ Ð´ÑÑгомÑ. ÐоÑÑÐ¾Ð¼Ñ (2) null == 0 ложно.
ÐеÑÑавненное знаÑение undefined
ÐнаÑение undefined неÑÑавнимо Ñ Ð´ÑÑгими знаÑениÑми:
alert( undefined > 0 ); // false (1)
alert( undefined < 0 ); // false (2)
alert( undefined == 0 ); // false (3)
ÐоÑÐµÐ¼Ñ Ð¶Ðµ ÑÑавнение undefined Ñ Ð½ÑлÑм вÑегда ложно?
Ðа ÑÑо еÑÑÑ ÑледÑÑÑие пÑиÑинÑ:
- СÑавнениÑ
(1)и(2)возвÑаÑаÑÑfalse, поÑÐ¾Ð¼Ñ ÑÑоundefinedпÑеобÑазÑеÑÑÑ Ð²NaN, аNaNâ ÑÑо ÑпеÑиалÑное ÑиÑловое знаÑение, коÑоÑое возвÑаÑаеÑfalseпÑи лÑбÑÑ ÑÑавнениÑÑ . - ÐеÑÑÑогое ÑавенÑÑво
(3)возвÑаÑаеÑfalse, поÑÐ¾Ð¼Ñ ÑÑоundefinedÑавно ÑолÑкоnull,undefinedи ниÑÐµÐ¼Ñ Ð±Ð¾Ð»ÑÑе.
Ðак избежаÑÑ Ð¿Ñоблем
ÐаÑем Ð¼Ñ ÑаÑÑмоÑÑели вÑе ÑÑи пÑимеÑÑ? ÐÐ¾Ð»Ð¶Ð½Ñ Ð»Ð¸ Ð¼Ñ Ð¿Ð¾ÑÑоÑнно помниÑÑ Ð¾Ð±Ð¾ вÑÐµÑ ÑÑÐ¸Ñ Ð¾ÑобенноÑÑÑÑ ? ÐеобÑзаÑелÑно. Со вÑеменем вÑе они ÑÑанÑÑ Ð²Ð°Ð¼ знакомÑ, но можно избежаÑÑ Ð¿Ñоблем, еÑли ÑледоваÑÑ Ð½Ð°Ð´ÑжнÑм пÑавилам:
- ÐÑноÑиÑеÑÑ Ð¾ÑÐµÐ½Ñ Ð¾ÑÑоÑожно к лÑÐ±Ð¾Ð¼Ñ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñ
undefined/null, кÑоме ÑлÑÑаев ÑÑÑогого ÑавенÑÑва===. - Ðе иÑполÑзÑйÑе ÑÑавнениÑ
>= > < <=Ñ Ð¿ÐµÑеменнÑми, коÑоÑÑе могÑÑ Ð¿ÑинимаÑÑ Ð·Ð½Ð°ÑениÑnull/undefined, Ñазве ÑÑо Ð²Ñ Ð¿Ð¾Ð»Ð½Ð¾ÑÑÑÑ ÑвеÑÐµÐ½Ñ Ð² Ñом, ÑÑо делаеÑе. ÐÑли пеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑинимаÑÑ ÑÑи знаÑениÑ, Ñо добавÑÑе Ð´Ð»Ñ Ð½Ð¸Ñ Ð¾ÑделÑнÑе пÑовеÑки.
ÐÑого
- ÐпеÑаÑоÑÑ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð»Ð¾Ð³Ð¸ÑеÑкого Ñипа.
- СÑÑоки ÑÑавниваÑÑÑÑ Ð¿Ð¾ÑимволÑно в лекÑикогÑаÑиÑеÑком поÑÑдке.
- ÐнаÑÐµÐ½Ð¸Ñ ÑазнÑÑ Ñипов пÑи ÑÑавнении пÑиводÑÑÑÑ Ðº ÑиÑлÑ. ÐÑклÑÑением ÑвлÑеÑÑÑ ÑÑавнение Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов ÑÑÑогого ÑавенÑÑва/неÑавенÑÑва.
- ÐнаÑениÑ
nullиundefinedÑавнÑ==дÑÑг дÑÑÐ³Ñ Ð¸ не ÑÐ°Ð²Ð½Ñ Ð»ÑÐ±Ð¾Ð¼Ñ Ð´ÑÑÐ³Ð¾Ð¼Ñ Ð·Ð½Ð°ÑениÑ. - ÐÑдÑÑе оÑÑоÑÐ¾Ð¶Ð½Ñ Ð¿Ñи иÑполÑзовании опеÑаÑоÑов ÑÑавнений вÑоде
>и<Ñ Ð¿ÐµÑеменнÑми, коÑоÑÑе могÑÑ Ð¿ÑинимаÑÑ Ð·Ð½Ð°ÑениÑnull/undefined. ХоÑоÑей идеей бÑÐ´ÐµÑ ÑделаÑÑ Ð¾ÑделÑнÑÑ Ð¿ÑовеÑÐºÑ Ð½Ð°null/undefined.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)