ÐпÑÑоналÑний ланÑÑжок ?. â Ñе безпеÑний ÑпоÑÑб доÑÑÑÐ¿Ñ Ð´Ð¾ вкладениÑ
влаÑÑивоÑÑей обâÑкÑÑв, навÑÑÑ ÑкÑо пÑомÑжниÑ
влаÑÑивоÑÑей не ÑÑнÑÑ.
ÐÑоблема âвÑдÑÑÑнÑÐ¾Ñ Ð²Ð»Ð°ÑÑивоÑÑÑâ
ЯкÑо ви ÑÑлÑки поÑали ÑиÑаÑи пÑдÑÑÑник Ñ Ð²Ð¸Ð²ÑаÑи JavaScript, можливо ÑÑ Ð¿Ñоблема вам наÑÐ°Ð·Ñ Ð½ÐµÐ·Ð½Ð°Ð¹Ð¾Ð¼Ð°, пÑоÑе вона доÑÑаÑнÑо ÑозповÑÑджена.
ÐапÑиклад, ÑозглÑнемо обâÑÐºÑ user Ñкий мÑÑÑиÑÑ ÑнÑоÑмаÑÑÑ Ð¿Ñо наÑиÑ
коÑиÑÑÑваÑÑв.
РбÑлÑÑоÑÑÑ Ð½Ð°ÑиÑ
коÑиÑÑÑваÑÑв Ñ Ð°Ð´ÑеÑа user.address з вÑлиÑÐµÑ user.address.street, пÑоÑе деÑ
Ñо виÑÑÑив Ð²Ð·Ð°Ð³Ð°Ð»Ñ Ð½Ðµ вказÑваÑи адÑеÑÑ.
ÐÑож ÑкÑо коÑиÑÑÑÐ²Ð°Ñ Ð½Ðµ вказав адÑеÑÑ, а ми ÑвоÑÑ ÑеÑÐ³Ð¾Ñ ÑпÑобÑÑмо оÑÑимаÑи доÑÑÑп до влаÑÑивоÑÑÑ user.address.street, Ñо оÑÑимаÑмо помилкÑ.
let user = {}; // коÑиÑÑÑÐ²Ð°Ñ Ð±ÐµÐ· влаÑÑивоÑÑÑ "address"
alert(user.address.street); // помилка!
Це оÑÑкÑваний ÑозвиÑок подÑй, Ñак пÑаÑÑÑ JavaScript. ÐÑкÑлÑки user.address Ñ undefined, Ñо Ñ ÑпÑоба оÑÑимаÑи user.address.street закÑнÑÑÑÑÑÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¾Ñ.
ÐÑоÑе в багаÑÑоÑ
жиÑÑÑвиÑ
ÑиÑÑаÑÑÑÑ
бÑло б набагаÑо зÑÑÑнÑÑе пÑоÑÑо оÑÑимаÑи undefined, Ñо бÑде ознаÑаÑи âÐ½ÐµÐ¼Ð°Ñ Ð²ÑлиÑÑâ.
â¦Ð©Ðµ один пÑиклад. У вебÑозÑобÑÑ Ð¼Ð¸ можемо оÑÑимаÑи обâÑÐºÑ ÐºÐ¾ÑÑий вÑдповÑÐ´Ð°Ñ ÐµÐ»ÐµÐ¼ÐµÐ½ÑÑ Ð½Ð° вебÑÑоÑÑнÑÑ Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ ÑпеÑÑалÑниÑ
меÑодÑв, напÑиклад: document.querySelector('.elem'). ÐÑоÑе ÑкÑо ми намагаÑимемоÑÑ Ð¾ÑÑимаÑи елеменÑ, Ñкого Ð½ÐµÐ¼Ð°Ñ Ð½Ð° ÑÑоÑÑнÑÑ, Ñо нам веÑнеÑÑÑÑ null.
// document.querySelector('.elem') ÑÑвний null ÑкÑо Ñакого елеменÑа не ÑÑнÑÑ
let html = document.querySelector('.elem').innerHTML; // помилка оÑкÑлÑки null
ÐÐ»Ñ Ð·Ð°ÐºÑÑпленнÑ. ЯкÑо елеменÑа Ð½ÐµÐ¼Ð°Ñ Ð½Ð° вебÑÑоÑÑнÑÑ, ми оÑÑимаÑмо Ð¿Ð¾Ð¼Ð¸Ð»ÐºÑ Ð¿Ñи ÑпÑÐ¾Ð±Ñ Ð´Ð¾ÑÑÑÐ¿Ñ Ð´Ð¾ влаÑÑивоÑÑÑ .innerHTML вÑд null. Рв деÑкиÑ
випадкаÑ
, коли вÑдÑÑÑнÑÑÑÑ ÐµÐ»ÐµÐ¼ÐµÐ½Ñа Ð´Ð»Ñ Ð½Ð°Ñ Ñ Ð½Ð¾ÑмоÑ, ми Ñ
оÑÑли б пÑоÑÑо оÑÑимаÑи .innerHTML = null (ÑобÑо html = null).
Як ми можемо Ñе ÑеалÑзÑваÑи?
ÐайоÑевиднÑÑим ÑÑÑеннÑм бÑло б пеÑевÑÑиÑи влаÑÑивÑÑÑÑ Ð²Ð¸ÐºÐ¾ÑиÑÑавÑи if або за Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ Ñмовного опеÑаÑоÑа ?:
let user = {};
alert(user.address ? user.address.street : undefined);
ÐаÑÑÐ°Ð½Ñ ÑобоÑий, помилки не бÑде⦠Ðле виглÑÐ´Ð°Ñ Ñе вкÑай неелеганÑно. Як ви баÑиÑе "user.address" двÑÑÑ Ð·âÑвлÑÑÑÑÑÑ Ð² кодÑ.
ÐÑÑ Ñк Ñе ж Ñаме виглÑÐ´Ð°Ñ Ð´Ð»Ñ document.querySelector:
let html = document.querySelector('.elem') ? document.querySelector('.elem').innerHTML : null;
Ðи баÑимо, Ñо поÑÑк елеменÑа document.querySelector('.elem') наÑпÑÐ°Ð²Ð´Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°ÑÑÑÑÑ ÑÑÑ Ð´Ð²ÑÑÑ. Ðе добÑе.
ÐÐ»Ñ Ð²Ð»Ð°ÑÑивоÑÑей ÑÐºÑ Ð»ÐµÐ¶Ð°ÑÑ Ð³Ð»Ð¸Ð±Ñе, Ñе ÑÑÐ°Ñ Ð¿ÑÐ¾Ð±Ð»ÐµÐ¼Ð¾Ñ Ð¾ÑкÑлÑки поÑÑебÑÑ Ð±ÑлÑÑого дÑблÑваннÑ.
СпÑобÑймо оÑÑимаÑи доÑÑÑп до user.address.street.name.
let user = {}; // коÑиÑÑÑÐ²Ð°Ñ Ð±ÐµÐ· влаÑÑивоÑÑÑ "address"
alert(user.address ? user.address.street ? user.address.street.name : null : null);
ÐиглÑÐ´Ð°Ñ Ð¿ÑоÑÑо Ð¶Ð°Ñ Ð»Ð¸Ð²Ð¾ Ñа незÑозÑмÑло.
Ðле не Ñ
вилÑйÑеÑÑ, ÑÑнÑÑ ÐºÑаÑий ваÑÑÐ°Ð½Ñ ÑеалÑзаÑÑÑ ÑÐ°ÐºÐ¾Ñ Ð·Ð°Ð´Ð°ÑÑ Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ Ð»Ð¾Ð³ÑÑного опеÑаÑоÑа &&:
let user = {}; // коÑиÑÑÑÐ²Ð°Ñ Ð±ÐµÐ· влаÑÑивоÑÑÑ "address"
alert( user.address && user.address.street && user.address.street.name ); // undefined (Ð½ÐµÐ¼Ð°Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¸)
ÐогÑÑне âÐâ з ланÑÑжком влаÑÑивоÑÑей гаÑанÑÑÑ Ð½Ð°Ð¼, Ñо вÑÑ Ð²Ð¾Ð½Ð¸ ÑÑнÑÑÑÑ (ÑкÑо ж Ð½Ñ â обÑиÑÐ»ÐµÐ½Ð½Ñ Ð¿ÑипинÑÑÑÑÑÑ), але й Ñе вÑе Ñе не Ñдеал.
Як ви баÑиÑе, Ñмена влаÑÑивоÑÑей доÑÑ Ð´ÑблÑÑÑÑÑÑ Ð² кодÑ. РпÑÐ¸ÐºÐ»Ð°Ð´Ñ Ð²Ð¸Ñе влаÑÑивÑÑÑÑ user.address зâÑвлÑÑÑÑÑÑ ÑÑиÑÑ.
ÐÑÑ ÑÐ¾Ð¼Ñ Ð¾Ð¿ÑÑоналÑний ланÑÑжок ?. бÑв доданий в мовÑ. Щоб ÑозвâÑзаÑи ÑÑ Ð¿ÑÐ¾Ð±Ð»ÐµÐ¼Ñ Ñаз Ñ Ð½Ð°Ð·Ð°Ð²Ð¶Ð´Ð¸!
ÐпÑÑоналÑний ланÑÑжок
ÐпÑÑоналÑний ланÑÑжок ?. пÑипинÑÑ Ð¾Ð±ÑиÑленнÑ, ÑкÑо знаÑÐµÐ½Ð½Ñ Ð¿ÐµÑед ?. Ñ undefined або null, Ñ Ð¿Ð¾Ð²ÐµÑÑÐ°Ñ undefined.
ÐÐ»Ñ ÑÑиÑлоÑÑÑ Ð½Ð°Ð´Ð°Ð»Ñ Ð² ÑÑй ÑÑаÑÑÑ Ð¼Ð¸ бÑдемо говоÑиÑи пÑо знаÑеннÑ, Ñо воно âÑÑнÑÑâ, ÑкÑо воно вÑдÑÑзнÑÑÑÑÑÑ Ð²Ñд null Ñи undefined
ÐнÑими Ñловами, value?.prop:
- пÑаÑÑÑ Ñк
value.prop, ÑкÑоvalueÑÑнÑÑ, - ÑнакÑе (коли
valueÑundefined/null) воно повеÑÑаÑundefined.
ÐÑÑ Ð±ÐµÐ·Ð¿ÐµÑний ÑпоÑÑб доÑÑÑÐ¿Ñ Ð´Ð¾ влаÑÑивоÑÑÑ user.address.street за Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ ?.:
let user = {}; // коÑиÑÑÑÐ²Ð°Ñ Ð±ÐµÐ· влаÑÑивоÑÑÑ "address"
alert( user?.address?.street ); // undefined (Ð½ÐµÐ¼Ð°Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¸)
Такий код виглÑÐ´Ð°Ñ ÐºÐ¾ÑоÑÑим Ñ ÑиÑÑÑÑим, Ð²Ð·Ð°Ð³Ð°Ð»Ñ Ð½ÐµÐ¼Ð°Ñ Ð½ÑÑкого дÑблÑваннÑ.
ÐÑÑ Ð¿Ñиклад Ñз document.querySelector:
let html = document.querySelector('.elem')?.innerHTML; // бÑде undefined, ÑкÑо Ð½ÐµÐ¼Ð°Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñа
ЧиÑÐ°Ð½Ð½Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ âaddressâ з user?.address ÑпÑаÑÑÑ Ð½Ð°Ð²ÑÑÑ ÐºÐ¾Ð»Ð¸ в змÑннÑй user збеÑÑгаÑÑÑÑÑ Ð·Ð¾Ð²ÑÑм не обâÑкÑ:
let user = null;
alert( user?.address ); // undefined
alert( user?.address.street ); // undefined
ÐвеÑнÑÑÑ ÑвагÑ, Ñо ÑинÑакÑÐ¸Ñ ?. ÑобиÑÑ Ð½ÐµÐ¾Ð±Ð¾Ð²âÑÐ·ÐºÐ¾Ð²Ð¾Ñ ÑÑлÑки влаÑÑивÑÑÑÑ Ð¿ÐµÑед ним, а не бÑдÑ-ÑÐºÑ Ð½Ð°ÑÑÑпнÑ.
ÐапÑиклад в user?.address.street.name конÑÑÑÑкÑÑÑ user?. дозволÑÑ user залиÑаÑиÑÑ null/undefined (Ñ Ð¿Ð¾Ð²ÐµÑÑаÑи undefined в ÑÐ°ÐºÐ¾Ð¼Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÑ), але Ñе пÑаÑÑÑ ÑÑлÑки Ð´Ð»Ñ user. ÐоÑÑÑп до ÑеÑÑи влаÑÑивоÑÑей здÑйÑнÑÑÑÑÑÑ Ð·Ð²Ð¸Ñайним ÑпоÑобом. ЯкÑо ми Ñ
оÑемо, Ñоб ÑкаÑÑ Ð· ниÑ
бÑла необовâÑзковоÑ, ÑÐ¾Ð´Ñ ÐºÐ¾Ð½ÐºÑеÑно Ð´Ð»Ñ ÑÑÑÑ Ð²Ð»Ð°ÑÑивоÑÑÑ Ð½Ð°Ð¼ доведеÑÑÑÑ Ð·Ð°Ð¼ÑниÑи . на ?..
Ðам ÑлÑд викоÑиÑÑовÑваÑи ?. ÑÑлÑки в ÑиÑ
ÑиÑÑаÑÑÑÑ
коли ми пÑипÑÑкаÑмо, Ñо знаÑÐµÐ½Ð½Ñ Ð¼Ð¾Ð¶Ðµ не ÑÑнÑваÑи.
ÐапÑиклад, ÑкÑо за наÑÐ¾Ñ Ð»Ð¾Ð³ÑÐºÐ¾Ñ Ð¾Ð±âÑÐºÑ user ÑоÑно ÑÑнÑÑ, але його влаÑÑивÑÑÑÑ address Ñ Ð½ÐµÐ¾Ð±Ð¾Ð²âÑзковоÑ, ÑÐ¾Ð´Ñ Ð½Ð°Ð¼ ÑлÑд викоÑиÑÑовÑваÑи конÑÑÑÑкÑÑÑ user.address?.street. ÐÑоÑе аж нÑÑк не user?.address?.street.
Ð¢Ð¾Ð´Ñ ÑкÑо помилково змÑнна user виÑвиÑÑÑÑ Ð¿ÑÑÑоÑ, ми побаÑимо пÑогÑÐ°Ð¼Ð½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÑ Ñ Ð·Ð¼Ð¾Ð¶ÐµÐ¼Ð¾ Ñе випÑавиÑи. Ð ÑнÑÐ¾Ð¼Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÑ, ÑкÑо ми зловживаÑмо ?., помилки можÑÑÑ Ð·Ð°Ð¼Ð¾Ð²ÑÑваÑиÑÑ Ñам де Ñе непоÑÑÑбно й ÑÑкладнÑваÑи пÑоÑÐµÑ Ð½Ð°Ð»Ð°Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ.
?. повинна бÑÑи оголоÑеноÑЯкÑо змÑÐ½Ð½Ð¾Ñ user Ð²Ð·Ð°Ð³Ð°Ð»Ñ Ð½Ðµ ÑÑнÑÑ, ÑÐ¾Ð´Ñ ÐºÐ¾Ð½ÑÑÑÑкÑÑÑ user?.anything видаÑÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÑ:
// ReferenceError: user is not defined
user?.address;
ÐмÑнна обовâÑзково повинна бÑÑи оголоÑена (напÑиклад let/const/var user або Ñк паÑамеÑÑ ÑÑнкÑÑÑ). ÐпÑÑоналÑний ланÑÑжок пÑаÑÑÑ ÑÑлÑки з Ñинними змÑнними.
СкоÑоÑене обÑиÑленнÑ
Як вже говоÑилоÑÑ, ?. негайно пÑипинÑÑ Ð¾Ð±ÑиÑленнÑ, ÑкÑо лÑÐ²Ð¾Ñ ÑаÑÑини не ÑÑнÑÑ.
Таким Ñином, ÑкÑо Ñ Ð´Ð¾Ð´Ð°ÑÐºÐ¾Ð²Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÐ¸ ÑÑнкÑÑй або опеÑаÑÑÑ Ð¿ÑавоÑÑÑ Ð²Ñд ?., вони не бÑдÑÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ñ.
ÐапÑиклад:
let user = null;
let x = 0;
user?.sayHi(x++); // Ð½ÐµÐ¼Ð°Ñ "user", оÑже до x++ обÑиÑÐ»ÐµÐ½Ð½Ñ Ð½Ðµ дÑйде
alert(x); // 0, знаÑÐµÐ½Ð½Ñ Ð½Ðµ бÑло збÑлÑÑено
ÐнÑÑ ÑпоÑоби заÑÑоÑÑваннÑ: ?.(), ?.[]
ÐпÑÑоналÑний ланÑÑжок ?. â Ñе не опеÑаÑоÑ, а ÑпеÑÑалÑна ÑинÑакÑиÑна конÑÑÑÑкÑÑÑ, Ñо Ñакож пÑаÑÑÑ Ð· ÑÑнкÑÑÑми Ñа квадÑаÑними дÑжками.
ÐапÑиклад, ?.() викоÑиÑÑовÑÑÑÑÑÑ Ð´Ð»Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÑ Ð¿Ð¾ÑенÑÑйно вÑдÑÑÑнÑÐ¾Ñ ÑÑнкÑÑÑ.
РпÑÐ¸ÐºÐ»Ð°Ð´Ñ Ð½Ð¸Ð¶Ñе не в ÑÑÑÑ
коÑиÑÑÑваÑÑв Ñ Ð¼ÐµÑод admin:
let userAdmin = {
admin() {
alert("Я адмÑнÑÑÑÑаÑоÑ");
}
};
let userGuest = {};
userAdmin.admin?.(); // Я адмÑнÑÑÑÑаÑоÑ
userGuest.admin?.(); // нÑÑого (Ð½ÐµÐ¼Ð°Ñ Ñакого меÑодÑ)
РобоÑ
випадкаÑ
ÑпоÑаÑÐºÑ Ð²Ð¸ÐºÐ¾ÑиÑÑовÑÑмо кÑÐ°Ð¿ÐºÑ (userAdmin.admin) Ð´Ð»Ñ Ð´Ð¾ÑÑÑÐ¿Ñ Ð´Ð¾ влаÑÑивоÑÑÑ admin, оÑкÑлÑки обâÑÐºÑ ÐºÐ¾ÑиÑÑÑваÑа ÑоÑно ÑÑнÑÑ, а Ñе ознаÑаÑ, Ñо ми можемо звеÑнÑÑиÑÑ Ð´Ð¾ бÑдÑ-ÑÐºÐ¾Ñ Ð¹Ð¾Ð³Ð¾ влаÑÑивоÑÑÑ.
Ðже поÑÑм ?.() пеÑевÑÑÑÑ Ð»ÑÐ²Ñ ÑаÑÑинÑ: ÑкÑо ÑÑнкÑÑÑ admin ÑÑнÑÑ, Ñо вона виконаÑÑÑÑÑ (Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÑ Ð· userAdmin). ÐнакÑе (Ð´Ð»Ñ userGuest) обÑиÑÐ»ÐµÐ½Ð½Ñ Ð¿ÑипиниÑÑÑÑ Ð±ÐµÐ· помилок.
Також ÑÑнÑÑ ÑинÑакÑÐ¸Ñ ?.[], ÑкÑо ми Ñ
оÑемо оÑÑимаÑи доÑÑÑп до влаÑÑивоÑÑÑ Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ ÐºÐ²Ð°Ð´ÑаÑниÑ
дÑжок [], а не ÑеÑез кÑÐ°Ð¿ÐºÑ .. Як Ñ Ð² ÑеÑÑÑ Ð²Ð¸Ð¿Ð°Ð´ÐºÑв, Ñакий ÑпоÑÑб Ð´Ð°Ñ Ð·Ð¼Ð¾Ð³Ñ Ð±ÐµÐ·Ð¿ÐµÑно ÑиÑаÑи влаÑÑивоÑÑÑ Ð¾Ð±âÑкÑа ÑкиÑ
може не ÑÑнÑваÑи.
let key = "firstName";
let user1 = {
firstName: "Ðван"
};
let user2 = null;
alert( user1?.[key] ); // Ðван
alert( user2?.[key] ); // undefined
Ðи Ñакож можемо викоÑиÑÑовÑваÑи ?. з delete:
delete user?.name; // видалиÑи user.name, ÑкÑо коÑиÑÑÑÐ²Ð°Ñ ÑÑнÑÑ
?. Ð´Ð»Ñ Ð±ÐµÐ·Ð¿ÐµÑного ÑиÑÐ°Ð½Ð½Ñ Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð²Ð»Ð°ÑÑивоÑÑей, але не Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸ÑÑÐпÑÑоналÑний ланÑÑжок ?. не Ð¼Ð°Ñ ÑенÑÑ Ñ Ð»ÑвÑй ÑаÑÑÐ¸Ð½Ñ Ð¿ÑиÑвоÑваннÑ.
ÐапÑиклад:
let user = null;
user?.name = "Ðван"; // Ðомилка, не ÑпÑаÑÑÑ
// Ñе по ÑÑÑÑ Ñе ж Ñаме, Ñо й undefined = "John"
Ðоно недоÑÑаÑнÑо «ÑозÑмне» Ð´Ð»Ñ ÑÑого.
ÐÑдÑÑмки
СинÑакÑÐ¸Ñ Ð¾Ð¿ÑÑоналÑного ланÑÑжка ?. Ð¼Ð°Ñ ÑÑи ÑоÑми:
obj?.propâ повеÑÑаÑobj.prop, ÑкÑо ÑÑнÑÑobj, Ñundefinedв ÑнÑÐ¾Ð¼Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÑ.obj?.[prop]â повеÑÑаÑobj[prop], ÑкÑо ÑÑнÑÑobj, Ñundefinedв ÑнÑÐ¾Ð¼Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÑ.obj.method?.()â викликаÑobj.method(), ÑкÑо ÑÑнÑÑobj.method, в ÑнÑÐ¾Ð¼Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÑ Ð¿Ð¾Ð²ÐµÑÑаÑundefined.
Як баÑимо, вÑÑ Ð²Ð¾Ð½Ð¸ пÑоÑÑÑ Ñа зÑозÑмÑÐ»Ñ Ð² викоÑиÑÑаннÑ. ?. пеÑевÑÑÑÑ Ð»ÑÐ²Ñ ÑаÑÑÐ¸Ð½Ñ Ð½Ð° ÑÑвнÑÑÑÑ null/undefined Ñ Ð´Ð¾Ð·Ð²Ð¾Ð»ÑÑ Ð¿ÑодовжÑваÑи обÑиÑÐ»ÐµÐ½Ð½Ñ ÑкÑо Ñе не Ñак.
ÐанÑÑжок ?. дозволÑÑ Ð±ÐµÐ· Ð²Ð¸Ð½Ð¸ÐºÐ½ÐµÐ½Ð½Ñ Ð¿Ð¾Ð¼Ð¸Ð»Ð¾Ðº звеÑÑаÑиÑÑ Ð´Ð¾ вкладениÑ
влаÑÑивоÑÑей.
Ðднак, поÑÑÑбно ÑозÑмно заÑÑоÑовÑваÑи ?., ÑÑлÑки в ÑиÑ
випадкаÑ
де допÑÑÑимо, Ñо лÑва ÑаÑÑина не ÑÑнÑÑ. Щоб Ñаким Ñином не пÑиÑ
овÑваÑи поÑенÑÑÐ¹Ð½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¸ пÑогÑамÑваннÑ.
ÐоменÑаÑÑ
<code>, Ð´Ð»Ñ ÐºÑлÑÐºÐ¾Ñ ÑÑдкÑв â обгоÑнÑÑÑ ÑÑ Ñегом<pre>, Ð´Ð»Ñ Ð¿Ð¾Ð½Ð°Ð´ 10 ÑÑдкÑв â викоÑиÑÑовÑйÑе пÑÑоÑниÑÑ (plnkr, jsbin, codepenâ¦)