Ранее, в главе ÐÑеобÑазование Ñипов Ð´Ð»Ñ Ð¿ÑимиÑивов Ð¼Ñ ÑаÑÑмаÑÑивали пÑеобÑазование Ñипов Ð´Ð»Ñ Ð¿ÑимиÑивов. ТепеÑÑ Ð´Ð¾Ð±Ð°Ð²Ð¸Ð¼ в наÑÑ ÐºÐ°ÑÑÐ¸Ð½Ñ Ð¼Ð¸Ñа обÑекÑÑ.
ÐÑваÑÑ Ð¾Ð¿ÐµÑаÑии, пÑи коÑоÑÑÑ Ð¾Ð±ÑÐµÐºÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ бÑÑÑ Ð¿ÑеобÑазован в пÑимиÑив.
ÐапÑимеÑ:
- СÑÑоковое пÑеобÑазование â еÑли обÑÐµÐºÑ Ð²ÑводиÑÑÑ ÑеÑез
alert(obj). - ЧиÑленное пÑеобÑазование â пÑи аÑиÑмеÑиÑеÑÐºÐ¸Ñ Ð¾Ð¿ÐµÑаÑиÑÑ , ÑÑавнении Ñ Ð¿ÑимиÑивом.
- ÐогиÑеÑкое пÑеобÑазование â пÑи
if(obj)и дÑÑÐ³Ð¸Ñ Ð»Ð¾Ð³Ð¸ÑеÑÐºÐ¸Ñ Ð¾Ð¿ÐµÑаÑиÑÑ .
РаÑÑмоÑÑим ÑÑи пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ оÑеÑеди.
ÐогиÑеÑкое пÑеобÑазование
ÐÑоÑе вÑего â Ñ Ð»Ð¾Ð³Ð¸ÑеÑким пÑеобÑазованием.
ÐÑбой обÑÐµÐºÑ Ð² логиÑеÑком конÑекÑÑе â true, даже еÑли ÑÑо пÑÑÑой маÑÑив [] или обÑÐµÐºÑ {}.
if ({} && []) {
alert( "ÐÑе обÑекÑÑ - true!" ); // alert ÑÑабоÑаеÑ
}
СÑÑоковое пÑеобÑазование
СÑÑоковое пÑеобÑазование пÑоÑе вÑего ÑвидеÑÑ, еÑли вÑвеÑÑи обÑÐµÐºÑ Ð¿Ñи помоÑи alert:
var user = {
firstName: 'ÐаÑилий'
};
alert( user ); // [object Object]
Ðак видно, ÑодеÑжимое обÑекÑа не вÑвелоÑÑ. ÐÑо поÑомÑ, ÑÑо ÑÑандаÑÑнÑм ÑÑÑоковÑм пÑедÑÑавлением полÑзоваÑелÑÑкого обÑекÑа ÑвлÑеÑÑÑ ÑÑÑока "[object Object]".
Такой вÑвод обÑекÑа не ÑодеÑÐ¶Ð¸Ñ Ð¸Ð½ÑеÑеÑной инÑоÑмаÑии. ÐоÑÑÐ¾Ð¼Ñ Ð¸Ð¼ÐµÐµÑ ÑмÑÑл его поменÑÑÑ Ð½Ð° ÑÑо-Ñо более полезное.
ÐÑли в обÑекÑе пÑиÑÑÑÑÑвÑÐµÑ Ð¼ÐµÑод toString, коÑоÑÑй возвÑаÑÐ°ÐµÑ Ð¿ÑимиÑив, Ñо он иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð¿ÑеобÑазованиÑ.
var user = {
firstName: 'ÐаÑилий',
toString: function() {
return 'ÐолÑзоваÑÐµÐ»Ñ ' + this.firstName;
}
};
alert( user ); // ÐолÑзоваÑÐµÐ»Ñ ÐаÑилий
toString Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð»Ñбой пÑимиÑивÐеÑод toString не обÑзан возвÑаÑаÑÑ Ð¸Ð¼ÐµÐ½Ð½Ð¾ ÑÑÑокÑ.
Ðго ÑезÑлÑÑÐ°Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð»Ñбого пÑимиÑивного Ñипа. ÐапÑимеÑ, ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑиÑло, как в пÑимеÑе ниже:
var obj = {
toString: function() {
return 123;
}
};
alert( obj ); // 123
ÐоÑÑÐ¾Ð¼Ñ Ð¼Ñ Ð¸ назÑваем его здеÑÑ Â«ÑÑÑоковое пÑеобÑазование», а не «пÑеобÑазование к ÑÑÑоке».
ÐÑе обÑекÑÑ, вклÑÑÐ°Ñ Ð²ÑÑÑоеннÑе, имеÑÑ Ñвои ÑеализаÑии меÑода toString, напÑимеÑ:
alert( [1, 2] ); // toString Ð´Ð»Ñ Ð¼Ð°ÑÑивов вÑÐ²Ð¾Ð´Ð¸Ñ ÑпиÑок ÑлеменÑов "1,2"
alert( new Date ); // toString Ð´Ð»Ñ Ð´Ð°Ñ Ð²ÑÐ²Ð¾Ð´Ð¸Ñ Ð´Ð°ÑÑ Ð² виде ÑÑÑоки
alert( function() {} ); // toString Ð´Ð»Ñ ÑÑнкÑии вÑÐ²Ð¾Ð´Ð¸Ñ ÐµÑ ÐºÐ¾Ð´
ЧиÑленное пÑеобÑазование
ÐÐ»Ñ ÑиÑленного пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ð±ÑекÑа иÑполÑзÑеÑÑÑ Ð¼ÐµÑод valueOf, а еÑли его Ð½ÐµÑ â Ñо toString:
var room = {
number: 777,
valueOf: function() { return this.number; },
toString: function() { return this.number; }
};
alert( +room ); // 777, вÑзвалÑÑ valueOf
delete room.valueOf; // valueOf ÑдалÑн
alert( +room ); // 777, вÑзвалÑÑ toString
ÐеÑод valueOf обÑзан возвÑаÑаÑÑ Ð¿ÑимиÑивное знаÑение, инаÑе его ÑезÑлÑÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð¿ÑоигноÑиÑован. ÐÑи ÑÑом â не обÑзаÑелÑно ÑиÑловое.
valueOfУ болÑÑинÑÑва вÑÑÑоеннÑÑ
обÑекÑов Ñакого valueOf неÑ, поÑÑÐ¾Ð¼Ñ ÑиÑленное и ÑÑÑоковое пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ð½Ð¸Ñ
ÑабоÑаÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ð¾.
ÐÑклÑÑением ÑвлÑеÑÑÑ Ð¾Ð±ÑÐµÐºÑ Date, коÑоÑÑй поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¾Ð±Ð° Ñипа пÑеобÑазований:
alert( new Date() ); // toString: ÐаÑа в виде ÑиÑаемой ÑÑÑоки
alert( +new Date() ); // valueOf: кол-во миллиÑекÑнд, пÑоÑедÑиÑ
Ñ 01.01.1970
ÐÑли поÑмоÑÑеÑÑ Ð² ÑÑандаÑÑ, Ñо в пÑнкÑе 15.2.4.4 говоÑиÑÑÑ Ð¾ Ñом, ÑÑо valueOf еÑÑÑ Ñ Ð»ÑбÑÑ
обÑекÑов. Ðо он ниÑего не делаеÑ, пÑоÑÑо возвÑаÑÐ°ÐµÑ Ñам обÑÐµÐºÑ (непÑимиÑивное знаÑение!), а поÑÐ¾Ð¼Ñ Ð¸Ð³Ð½Ð¾ÑиÑÑеÑÑÑ.
Ðве ÑÑадии пÑеобÑазованиÑ
ÐÑак, обÑÐµÐºÑ Ð¿ÑеобÑазован в пÑимиÑив пÑи помоÑи toString или valueOf.
Ðо на ÑÑом пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ обÑзаÑелÑно заканÑиваÑÑÑÑ. Ðполне возможно, ÑÑо в пÑоÑеÑÑе вÑÑиÑлений ÑÑÐ¾Ñ Ð¿ÑимиÑив бÑÐ´ÐµÑ Ð¿ÑеобÑазован во ÑÑо-Ñо дÑÑгое.
ÐапÑимеÑ, ÑаÑÑмоÑÑим пÑименение к обÑекÑÑ Ð¾Ð¿ÐµÑаÑии ==:
var obj = {
valueOf: function() {
return 1;
}
};
alert( obj == true ); // true
ÐбÑÐµÐºÑ obj бÑл ÑнаÑала пÑеобÑазован в пÑимиÑив, иÑполÑзÑÑ ÑиÑленное пÑеобÑазование, полÑÑилоÑÑ 1 == true.
Ðалее, Ñак как знаÑÐµÐ½Ð¸Ñ Ð²ÑÑ ÐµÑÑ ÑазнÑÑ
Ñипов, пÑименÑÑÑÑÑ Ð¿Ñавила пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿ÑимиÑивов, ÑезÑлÑÑаÑ: true.
То же Ñамое â пÑи Ñложении Ñ Ð¾Ð±ÑекÑом пÑи помоÑи +:
var obj = {
valueOf: function() {
return 1;
}
};
alert( obj + "test" ); // 1test
Ðли воÑ, Ð´Ð»Ñ ÑазноÑÑи обÑекÑов:
var a = {
valueOf: function() {
return "1";
}
};
var b = {
valueOf: function() {
return "2";
}
};
alert( a + b ); // "12"
alert( a - b ); // "1" - "2" = -1
DateÐбÑÐµÐºÑ Date по иÑÑоÑиÑеÑким пÑиÑинам ÑвлÑеÑÑÑ Ð¸ÑклÑÑением.
ÐинаÑнÑй опеÑаÑÐ¾Ñ Ð¿Ð»ÑÑ + обÑÑно иÑполÑзÑÐµÑ ÑиÑленное пÑеобÑазование и меÑод valueOf. Ðак Ð¼Ñ Ñже знаем, еÑли подÑ
одÑÑего valueOf Ð½ÐµÑ (а его Ð½ÐµÑ Ñ Ð±Ð¾Ð»ÑÑинÑÑва обÑекÑов), Ñо иÑполÑзÑеÑÑÑ toString, Ñак ÑÑо в иÑоге пÑеобÑазование пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ðº ÑÑÑоке. Ðо еÑли еÑÑÑ valueOf, Ñо иÑполÑзÑеÑÑÑ valueOf. ÐÑÑе в пÑимеÑе как Ñаз a + b ÑÑо демонÑÑÑиÑÑÑÑ.
У обÑекÑов Date еÑÑÑ Ð¸ valueOf â возвÑаÑÐ°ÐµÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво миллиÑекÑнд, и toString â возвÑаÑÐ°ÐµÑ ÑÑÑÐ¾ÐºÑ Ñ Ð´Ð°Ñой.
â¦Ðо опеÑаÑÐ¾Ñ + Ð´Ð»Ñ Date иÑполÑзÑÐµÑ Ð¸Ð¼ÐµÐ½Ð½Ð¾ toString (Ñ
оÑÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ Ð±Ñ valueOf).
ÐÑо и еÑÑÑ Ð¸ÑклÑÑение:
// бинаÑнÑй плÑÑ Ð´Ð»Ñ Ð´Ð°ÑÑ toString, Ð´Ð»Ñ Ð¾ÑÑалÑнÑÑ
обÑекÑов valueOf
alert( new Date + "" ); // "ÑÑÑока даÑÑ"
ÐÑÑÐ³Ð¸Ñ Ð¿Ð¾Ð´Ð¾Ð±Ð½ÑÑ Ð¸ÑклÑÑений неÑ.
Ð ÑзÑке Java (ÑÑо не JavaScript, дÑÑгой ÑзÑк, здеÑÑ Ð¿ÑиведÑн Ð´Ð»Ñ Ð¿ÑимеÑа) логиÑеÑкие знаÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ ÑоздаваÑÑ, иÑполÑзÑÑ ÑинÑакÑÐ¸Ñ new Boolean(true/false), напÑÐ¸Ð¼ÐµÑ new Boolean(true).
Ð JavaScript Ñоже еÑÑÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð°Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ, коÑоÑÐ°Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ Â«Ð¾Ð±ÑекÑнÑÑ Ð¾Ð±ÑÑÑкÑ» Ð´Ð»Ñ Ð»Ð¾Ð³Ð¸ÑеÑкого знаÑениÑ.
ÐÑа возможноÑÑÑ Ð´Ð°Ð²Ð½Ð¾ ÑÑÑеÑÑвÑÐµÑ Ð»Ð¸ÑÑ Ð´Ð»Ñ ÑовмеÑÑимоÑÑи, она и не иÑполÑзÑеÑÑÑ Ð½Ð° пÑакÑике, поÑколÑÐºÑ Ð¿ÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº ÑÑÑаннÑм ÑезÑлÑÑаÑам. ÐекоÑоÑÑе из Ð½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ ÑилÑно ÑдивиÑÑ Ñеловека, не пÑивÑкÑего к JavaScript, напÑимеÑ:
var value = new Boolean(false);
if (value) {
alert( true ); // ÑÑабоÑаеÑ!
}
ÐоÑÐµÐ¼Ñ Ð·Ð°Ð¿ÑÑÑилÑÑ alert? ÐÐµÐ´Ñ Ð² if наÑ
одиÑÑÑ false⦠ÐÑовеÑим:
var value = new Boolean(false);
alert( value ); // вÑÐ²Ð¾Ð´Ð¸Ñ false, вÑе ок..
if (value) {
alert( true ); // ..но Ñогда поÑÐµÐ¼Ñ Ð²ÑполнÑеÑÑÑ alert в if ?!?
}
Ðело в Ñом, ÑÑо new Boolean â ÑÑо не пÑимиÑивное знаÑение, а обÑекÑ. ÐоÑÑÐ¾Ð¼Ñ Ð² логиÑеÑком конÑекÑÑе он пÑеобÑазÑеÑÑÑ Ðº true, в ÑезÑлÑÑаÑе ÑабоÑÐ°ÐµÑ Ð¿ÐµÑвÑй пÑимеÑ.
РвÑоÑой пÑÐ¸Ð¼ÐµÑ Ð²ÑзÑÐ²Ð°ÐµÑ alert, коÑоÑÑй пÑеобÑазÑÐµÑ Ð¾Ð±ÑÐµÐºÑ Ðº ÑÑÑоке, и он ÑÑановиÑÑÑ "false".
Ð JavaScript вÑÐ·Ð¾Ð²Ñ new Boolean/String/Number не иÑполÑзÑÑÑÑÑ, а иÑполÑзÑÑÑÑÑ Ð¿ÑоÑÑÑе вÑÐ·Ð¾Ð²Ñ ÑооÑвеÑÑÑвÑÑÑиÑ
ÑÑнкÑий, они пÑеобÑазÑÑÑ Ð·Ð½Ð°Ñение в пÑимиÑив нÑжного Ñипа, напÑÐ¸Ð¼ÐµÑ Boolean(val) === !!val.
ÐÑого
- РлогиÑеÑком конÑекÑÑе обÑÐµÐºÑ â вÑегда
true. - ÐÑи ÑÑÑоковом пÑеобÑазовании обÑекÑа иÑполÑзÑеÑÑÑ ÐµÐ³Ð¾ меÑод
toString. Ðн должен возвÑаÑаÑÑ Ð¿ÑимиÑивное знаÑение, пÑиÑÑм не обÑзаÑелÑно именно ÑÑÑокÑ. - ÐÐ»Ñ ÑиÑленного пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ÑполÑзÑеÑÑÑ Ð¼ÐµÑод
valueOf, коÑоÑÑй Ñакже Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑиÑÑ Ð»Ñбое пÑимиÑивное знаÑение. У болÑÑинÑÑва обÑекÑовvalueOfне ÑабоÑÐ°ÐµÑ (возвÑаÑÐ°ÐµÑ Ñам обÑÐµÐºÑ Ð¸ поÑÐ¾Ð¼Ñ Ð¸Ð³Ð½Ð¾ÑиÑÑеÑÑÑ), пÑи ÑÑом Ð´Ð»Ñ ÑиÑленного пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ÑполÑзÑеÑÑÑtoString.
ÐолнÑй алгоÑиÑм пÑеобÑазований еÑÑÑ Ð² ÑпеÑиÑикаÑии ECMAScript, ÑмоÑÑиÑе пÑнкÑÑ 11.8.5, 11.9.3, а Ñакже 9.1 и 9.3.
ÐамеÑим, Ð´Ð»Ñ Ð¿Ð¾Ð»Ð½Ð¾ÑÑ ÐºÐ°ÑÑинÑ, ÑÑо некоÑоÑÑе ÑеÑÑÑ Ð·Ð½Ð°Ð½Ð¸Ð¹ в инÑеÑÐ½ÐµÑ Ð¿ÑедлагаÑÑ Ð²Ð¾Ð¿ÑоÑÑ Ñипа:
{}[0] // ÑÐµÐ¼Ñ Ñавно?
{} + {} // а Ñак?
ÐÑли Ð²Ñ Ð·Ð°Ð¿ÑÑÑиÑе ÑÑи вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð² конÑоли, Ñо ÑезÑлÑÑÐ°Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÐºÐ°Ð·Ð°ÑÑÑÑ ÑÑÑаннÑм. ÐодвоÑ
здеÑÑ Ð² Ñом, ÑÑо еÑли ÑигÑÑнÑе Ñкобки {...} идÑÑ Ð½Ðµ в вÑÑажении, а в оÑновном поÑоке кода, Ñо JavaScript ÑÑиÑаеÑ, ÑÑо ÑÑо не обÑекÑ, а «блок кода» (как if, for, но без опеÑаÑоÑа пÑоÑÑо гÑÑппиÑовка команд вмеÑÑе иÑполÑзÑеÑÑÑ Ñедко).
ÐÐ¾Ñ Ð±Ð»Ð¾Ðº кода Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹:
{
alert("Ðлок")
}
РеÑли ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð¸Ð·ÑÑÑÑ, Ñо бÑÐ´ÐµÑ Ð¿ÑÑÑой блок {}, коÑоÑÑй ниÑего не делаеÑ. Ðва пÑимеÑа вÑÑе как Ñаз ÑодеÑÐ¶Ð°Ñ Ð¿ÑÑÑой блок в наÑале, коÑоÑÑй ниÑего не делаеÑ. ÐнаÑе говоÑÑ:
{}[0] // Ñо же ÑÑо и: [0]
{} + {} // Ñо же ÑÑо и: + {}
То еÑÑÑ, Ñакие вопÑоÑÑ â не на пÑеобÑазование Ñипов, а на понимание, ÑÑо еÑли { ... } наÑ
одиÑÑÑ Ð²Ð½Ðµ вÑÑажений, Ñо ÑÑо не обÑекÑ, а блок.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)