СиÑÑема пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñипов в JavaScript оÑÐµÐ½Ñ Ð¿ÑоÑÑа, но оÑлиÑаеÑÑÑ Ð¾Ñ Ð´ÑÑÐ³Ð¸Ñ ÑзÑков. ÐоÑÑÐ¾Ð¼Ñ Ð¾Ð½Ð° ÑаÑÑо ÑлÑÐ¶Ð¸Ñ Â«ÐºÐ°Ð¼Ð½ÐµÐ¼ пÑеÑкновениÑ» Ð´Ð»Ñ Ð¿ÑÐ¸Ñ Ð¾Ð´ÑÑÐ¸Ñ Ð¸Ð· дÑÑÐ³Ð¸Ñ ÑзÑков пÑогÑаммиÑÑов.
ÐÑего еÑÑÑ ÑÑи пÑеобÑазованиÑ:
- СÑÑоковое пÑеобÑазование.
- ЧиÑленное пÑеобÑазование.
- ÐÑеобÑазование к логиÑеÑÐºÐ¾Ð¼Ñ Ð·Ð½Ð°ÑениÑ.
ÐÑа глава опиÑÑÐ²Ð°ÐµÑ Ð¿ÑеобÑазование ÑолÑко пÑимиÑивнÑÑ Ð·Ð½Ð°Ñений, обÑекÑÑ ÑазбиÑаÑÑÑÑ Ð´Ð°Ð»ÐµÐµ.
СÑÑоковое пÑеобÑазование
СÑÑоковое пÑеобÑазование пÑоиÑÑ
одиÑ, когда ÑÑебÑеÑÑÑ Ð¿ÑедÑÑавление Ñего-либо в виде ÑÑÑоки. ÐапÑимеÑ, его пÑÐ¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ ÑÑнкÑÐ¸Ñ alert.
var a = true;
alert( a ); // "true"
Ðожно Ñакже оÑÑÑеÑÑвиÑÑ Ð¿ÑеобÑазование ÑвнÑм вÑзовом String(val):
alert( String(null) === "null" ); // true
Ðак видно из пÑимеÑов вÑÑе, пÑеобÑазование пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð½Ð°Ð¸Ð±Ð¾Ð»ÐµÐµ оÑевиднÑм ÑпоÑобом, «как еÑÑÑ»: false ÑÑановиÑÑÑ "false", null â "null", undefined â "undefined" и Ñ.п.
Также Ð´Ð»Ñ Ñвного пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿ÑименÑеÑÑÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ "+", Ñ ÐºÐ¾ÑоÑого один из аÑгÑменÑов ÑÑÑока. Ð ÑÑом ÑлÑÑае он пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº ÑÑÑоке и дÑÑгой аÑгÑменÑ, напÑимеÑ:
alert( true + "test" ); // "truetest"
alert( "123" + undefined ); // "123undefined"
ЧиÑленное пÑеобÑазование
ЧиÑленное пÑеобÑазование пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð² маÑемаÑиÑеÑкиÑ
ÑÑнкÑиÑÑ
и вÑÑажениÑÑ
, а Ñакже пÑи ÑÑавнении даннÑÑ
ÑазлиÑнÑÑ
Ñипов (кÑоме ÑÑавнений ===, !==).
ÐÐ»Ñ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ðº ÑиÑÐ»Ñ Ð² Ñвном виде можно вÑзваÑÑ Number(val), либо, ÑÑо коÑоÑе, поÑÑавиÑÑ Ð¿ÐµÑед вÑÑажением ÑнаÑнÑй плÑÑ "+":
var a = +"123"; // 123
var a = Number("123"); // 123, ÑÐ¾Ñ Ð¶Ðµ ÑÑÑекÑ
ÐапÑимеÑ:
// поÑле обÑÐµÐ·Ð°Ð½Ð¸Ñ Ð¿ÑобелÑнÑÑ
Ñимволов оÑÑанеÑÑÑ "123"
alert( +" \n 123 \n \n" ); // 123
ÐÑÑ Ð¿ÑимеÑÑ:
-
ÐогиÑеÑкие знаÑениÑ:
alert( +true ); // 1 alert( +false ); // 0 -
СÑавнение ÑазнÑÑ Ñипов â знаÑÐ¸Ñ ÑиÑленное пÑеобÑазование:
alert( "\n0 " == 0 ); // trueÐÑи ÑÑом ÑÑÑока
"\n0"пÑеобÑазÑеÑÑÑ Ðº ÑиÑлÑ, как Ñказано вÑÑе: наÑалÑнÑе и конеÑнÑе пÑÐ¾Ð±ÐµÐ»Ñ Ð¾Ð±ÑезаÑÑÑÑ, полÑÑаеÑÑÑ ÑÑÑока"0", коÑоÑÐ°Ñ Ñавна0. -
С логиÑеÑкими знаÑениÑми:
alert( "\n" == false ); alert( "1" == true );ÐдеÑÑ ÑÑавнение
"=="Ñнова пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ð¾Ð±Ðµ ÑаÑÑи к ÑиÑлÑ. РпеÑвой ÑÑÑоке Ñлева и ÑпÑава полÑÑаеÑÑÑ0, во вÑоÑой1.
СпеÑиалÑнÑе знаÑениÑ
ÐоÑмоÑÑим на поведение ÑпеÑиалÑнÑÑ Ð·Ð½Ð°Ñений более внимаÑелÑно.
ÐнÑÑиÑивно, знаÑÐµÐ½Ð¸Ñ null/undefined аÑÑоÑииÑÑÑÑÑÑ Ñ Ð½ÑлÑм, но пÑи пÑеобÑазованиÑÑ
ведÑÑ ÑÐµÐ±Ñ Ð¸Ð½Ð°Ñе.
СпеÑиалÑнÑе знаÑÐµÐ½Ð¸Ñ Ð¿ÑеобÑазÑÑÑÑÑ Ðº ÑиÑÐ»Ñ Ñак:
| ÐнаÑение | ÐÑеобÑазÑеÑÑÑ Ð²... |
|---|---|
undefined | NaN |
null | 0 |
ÐÑо пÑеобÑазование оÑÑÑеÑÑвлÑеÑÑÑ Ð¿Ñи аÑиÑмеÑиÑеÑкиÑ
опеÑаÑиÑÑ
и ÑÑавнениÑÑ
> >= < <=, но не пÑи пÑовеÑке ÑавенÑÑва ==. ÐлгоÑиÑм пÑовеÑки ÑавенÑÑва Ð´Ð»Ñ ÑÑиÑ
знаÑений в ÑпеÑиÑикаÑии пÑопиÑан оÑделÑно (пÑÐ½ÐºÑ 11.9.3). РнÑм ÑÑиÑаеÑÑÑ, ÑÑо null и undefined ÑÐ°Ð²Ð½Ñ "==" Ð¼ÐµÐ¶Ð´Ñ Ñобой, но ÑÑи знаÑÐµÐ½Ð¸Ñ Ð½Ðµ ÑÐ°Ð²Ð½Ñ Ð½Ð¸ÐºÐ°ÐºÐ¾Ð¼Ñ Ð´ÑÑÐ³Ð¾Ð¼Ñ Ð·Ð½Ð°ÑениÑ.
ÐÑо ведÑÑ Ðº забавнÑм поÑледÑÑвиÑм.
ÐапÑимеÑ, null не подÑинÑеÑÑÑ Ð·Ð°ÐºÐ¾Ð½Ð°Ð¼ маÑемаÑики â он «болÑÑе либо Ñавен нÑлÑ»: null>=0, но не болÑÑе и не Ñавен:
alert( null >= 0 ); // true, Ñ.к. null пÑеобÑазÑеÑÑÑ Ðº 0
alert( null > 0 ); // false (не болÑÑе), Ñ.к. null пÑеобÑазÑеÑÑÑ Ðº 0
alert( null == 0 ); // false (и не Ñавен!), Ñ.к. == ÑаÑÑмаÑÑÐ¸Ð²Ð°ÐµÑ null оÑобо.
ÐнаÑение undefined вообÑе «неÑÑавнимо»:
alert( undefined > 0 ); // false, Ñ.к. undefined -> NaN
alert( undefined == 0 ); // false, Ñ.к. ÑÑо undefined (без пÑеобÑазованиÑ)
alert( undefined < 0 ); // false, Ñ.к. undefined -> NaN
ÐÐ»Ñ Ð±Ð¾Ð»ÐµÐµ оÑевидной ÑабоÑÑ ÐºÐ¾Ð´Ð° и во избежание оÑибок лÑÑÑе не даваÑÑ ÑпеÑиалÑнÑм знаÑениÑм ÑÑаÑÑвоваÑÑ Ð² ÑÑавнениÑÑ
> >= < <=.
ÐÑполÑзÑйÑе в ÑÐ°ÐºÐ¸Ñ ÑлÑÑаÑÑ Ð¿ÐµÑеменнÑе-ÑиÑла или пÑиводиÑе к ÑиÑÐ»Ñ Ñвно.
ÐогиÑеÑкое пÑеобÑазование
ÐÑеобÑазование к true/false пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð² логиÑеÑком конÑекÑÑе, Ñаком как if(value), и пÑи пÑименении логиÑеÑкиÑ
опеÑаÑоÑов.
ÐÑе знаÑениÑ, коÑоÑÑе инÑÑиÑивно «пÑÑÑÑ», ÑÑановÑÑÑÑ false. ÐÑ
неÑколÑко: 0, пÑÑÑÐ°Ñ ÑÑÑока, null, undefined и NaN.
ÐÑÑалÑное, в Ñом ÑиÑле и лÑбÑе обÑекÑÑ â true.
ÐÐ¾Ð»Ð½Ð°Ñ ÑаблиÑа пÑеобÑазований:
ÐÐ»Ñ Ñвного пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ÑполÑзÑеÑÑÑ Ð´Ð²Ð¾Ð¹Ð½Ð¾Ðµ логиÑеÑкое оÑÑиÑание !!value или вÑзов Boolean(value).
"0" ÑÑановиÑÑÑ trueРоÑлиÑие Ð¾Ñ Ð¼Ð½Ð¾Ð³Ð¸Ñ
ÑзÑков пÑогÑаммиÑÐ¾Ð²Ð°Ð½Ð¸Ñ (напÑÐ¸Ð¼ÐµÑ PHP), "0" в JavaScript ÑвлÑеÑÑÑ true, как и ÑÑÑока из пÑобелов:
alert( !!"0" ); // true
alert( !!" " ); // лÑбÑе непÑÑÑÑе ÑÑÑоки, даже из пÑобелов - true!
ÐогиÑеÑкое пÑеобÑазование инÑеÑеÑно Ñем, как оно ÑоÑеÑаеÑÑÑ Ñ ÑиÑленнÑм.
Ðва знаÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ ÑавнÑ, но одно из ниÑ
в логиÑеÑком конÑекÑÑе true, дÑÑгое â false.
ÐапÑимеÑ, ÑавенÑÑво в ÑледÑÑÑем пÑимеÑе веÑно, Ñак как пÑоиÑÑ Ð¾Ð´Ð¸Ñ ÑиÑленное пÑеобÑазование:
alert( 0 == "\n0\n" ); // true
⦠Рв логиÑеÑком конÑекÑÑе Ð»ÐµÐ²Ð°Ñ ÑаÑÑÑ (0) даÑÑ false, пÑÐ°Ð²Ð°Ñ («\n0\n») â true, Ñак как лÑÐ±Ð°Ñ Ð½Ðµ пÑÑÑÐ°Ñ ÑÑÑока в логиÑеÑком конÑекÑÑе Ñавна true:
if ("\n0\n") {
alert( "true, ÑовÑем не как 0!" );
}
С ÑоÑки зÑÐµÐ½Ð¸Ñ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñипов в JavaScript ÑÑо ÑовеÑÑенно ноÑмалÑно. ÐÑи ÑÑавнении Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Â«==» â ÑиÑленное пÑеобÑазование, а в if â логиÑеÑкое, ÑолÑко и вÑего.
ÐÑого
Ð JavaScript еÑÑÑ ÑÑи пÑеобÑазованиÑ:
- СÑÑоковое:
String(value)â в ÑÑÑоковом конÑекÑÑе или пÑи Ñложении Ñо ÑÑÑокой. РабоÑÐ°ÐµÑ Ð¾ÑевиднÑм обÑазом. - ЧиÑленное:
Number(value)â в ÑиÑленном конÑекÑÑе, вклÑÑÐ°Ñ ÑнаÑнÑй плÑÑ+value. ÐÑоиÑÑ Ð¾Ð´Ð¸Ñ Ð¿Ñи ÑÑавнении ÑазнÑÑ Ñипов, кÑоме ÑÑÑогого ÑавенÑÑва. - ÐогиÑеÑкое:
Boolean(value)â в логиÑеÑком конÑекÑÑе, можно Ñакже ÑделаÑÑ Ð´Ð²Ð¾Ð¹Ð½Ñм ÐÐ:!!value.
ТоÑнÑе ÑаблиÑÑ Ð¿ÑеобÑазований Ð´Ð°Ð½Ñ Ð²ÑÑе в ÑÑой главе.
ÐÑобÑм ÑлÑÑаем ÑвлÑеÑÑÑ Ð¿ÑовеÑка ÑавенÑÑва Ñ null и undefined. Ðни ÑÐ°Ð²Ð½Ñ Ð´ÑÑг дÑÑгÑ, но не ÑÐ°Ð²Ð½Ñ ÑÐµÐ¼Ñ Ð±Ñ Ñо ни бÑло еÑÑ, ÑÑÐ¾Ñ ÑлÑÑай пÑопиÑан оÑобо в ÑпеÑиÑикаÑии.

ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)