12 прыёмаў працы з JavaScript, якіх няма ў большасці тутарыялаў
Калі я пачаў вывучаць JavaScript, то перш за ўсё склаў спіс прыёмаў, якія дапамагалі мне эканоміць час. Я падгледзеў іх у іншых праграмістаў, на розных сайтах і ў мануалах.
У гэтым артыкуле я пакажу 12 выдатных спосабаў палепшыць і паскорыць свой JavaScript-код. У большасці выпадкаў яны ўніверсальныя.
Нагадваем:для ўсіх чытачоў "Хабра" - зніжка 10 000 рублёў пры запісе на любы курс Skillbox па промакодзе "Хабр".
Тып аб'екта Set быў уведзены ў ES6, разам з …, spread-аператарам, мы можам выкарыстоўваць яго для стварэння новага масіва, у якім змяшчаюцца толькі унікальныя значэння.
У звычайнай сітуацыі для выканання той жа аперацыі трэба значна больш кода.
Гэты прыём працуе для масіваў, якія змяшчаюць прымітыўныя тыпы: undefined, null, boolean, string і number. Калі вы працуеце з масівам, які змяшчае аб'екты, функцыі або дадатковыя масівы, вам спатрэбіцца іншы падыход.
Даўжыня кэш-масіва ў цыклах
ЦЫКЛЫ
Калі вы вывучаеце for для цыклаў, то вынікаеце стандартнай працэдуры:
for (let i = 0; i < array.length; i++){
console.log(i);
}
Тым не менш, пры такім сінтаксісе цыкл for паўторна правярае даўжыню масіва пры кожнай ітэрацыі.
Часам гэта можа быць карысна, але ў большасці выпадкаў больш эфектыўна кэшаваць даўжыню масіва, што запатрабуе аднаго звароту да яго. Мы можам зрабіць гэта шляхам вызначэння зменнай даўжыні, дзе задаць зменную i, напрыклад, так:
for (let i = 0, length = array.length; i < length; i++){
console.log(i);
}
У прынцыпе, амаль тое ж самае, што і вышэй, але пры павелічэнні памеру цыклу мы атрымаем значную эканомію часу.
Ацэнка кароткага замыкання (ацэнка Макарці)
УМОВНЫЯ АПЕРАТАРЫ
Тэрнарны аператар - хуткі і эфектыўны спосаб напісаць простыя (а часам і не вельмі простыя) conditional statements:
х> 100? "больш за 100": "менш за 100";
х> 100? (x> 200? "больш за 200": "паміж 100-200"): "менш за 100";
Але часам нават тэрнарны аператар больш складаны, чым патрабуецца. Замест яго мы можам выкарыстоўваць 'and' && і 'or' || лагічныя аператары для адзнакі некаторых выразаў яшчэ больш кароткім спосабам. Яго часта называюць "кароткім замыканнем" або "ацэнкай кароткага замыкання".
Як гэта працуе
Скажам, мы жадаем вярнуць толькі адна з двух або больш умоў.
Выкарыстанне && верне першае значэнне. Калі кожны аперанд ацэньваецца як true, то будзе вернуты апошні вылічаны выраз.
let one = 1, two = 2, three = 3;
console.log(one && two && three); // Result: 3
console.log(0 && null); // Result: 0
Выкарыстанне || дазволіць вярнуць першае true значэнне. Калі кожны аперанд ацэньваецца як false, то будзе вернута апошняе вылічанае значэнне.
let one = 1, two = 2, three = 3;
console.log(one || two || three); // Result: 1
console.log(0 || null); // Result: null
Прыклад 1
Скажам, мы жадаем вярнуць length зменнай, але не ведаем яе тып.
У гэтым выпадку можна выкарыстоўваць if/else для праверкі таго, што foo - падыходны тып, але гэты спосаб можа апынуцца занадта доўгім. Таму лепш возьмем нашае «кароткае замыканне».
return (foo || []).length;
Калі зменная foo мае прыдатную length, то яна і будзе вернутая. У адваротным выпадку мы атрымаем 0.
Прыклад 2
Ці былі ў вас праблемы з доступам да ўкладзенага аб'екта? Вы можаце не ведаць, ці існуе аб'ект або адно з яго падуласцівасцяў, і гэта можа прывесці да праблем.
Напрыклад, мы хацелі атрымаць доступ да якасці data ў this.state, але data не вызначана, пакуль наша праграма не верне запыт на выбарку.
У залежнасці ад таго, дзе мы яго выкарыстоўваем, выклік this.state.data можа перашкодзіць запуску дадатку. Каб вырашыць праблему, мы маглі б абгарнуць гэта ва ўмоўнае выраз:
Больш прыдатным варыянтам будзе выкарыстанне аператара "or".
return (this.state.data || 'Fetching Data');
Мы не можам змяніць код вышэй, каб выкарыстоўваць &&. Аператар "Fetching Data" && this.state.data верне this.state.data незалежна ад таго, з'яўляецца ён undefined ці не.
Апцыянальны ланцужок
Можна прапанаваць выкарыстоўваць апцыянальны ланцужок пры спробе вярнуць уласцівасць глыбока ў дрэвападобную структуру. Так, сімвал знака пытання? можа выкарыстоўвацца для вымання ўласцівасці, толькі калі яно не роўна нулю (null).
Напрыклад, мы маглі б выканаць рэфактарынг прыкладу вышэй, атрымаўшы this.state.data?.. (). Гэта значыць data вяртаецца толькі ў тым выпадку, калі значэнне не null.
Ці, калі важна, ці вызначана state ці не, мы маглі б вярнуць this.state?.data.
Пераўтварэнне ў Boolean
ПЕРАТВОРЕННЕ ТЫПОЎ
Акрамя звычайных лагічных функцый true і false, JavaScript таксама разглядае ўсе іншыя значэнні як truthy ці falsy.
Пакуль не паказана іншае, усе значэнні ў JavaScript - truthy, за выключэннем 0, "", null, undefined, NaN і, вядома, false. Апошнія зьяўляюцца falsy.
Мы можам лёгка пераключацца паміж тымі і іншымі, выкарыстоўваючы аператар!, Які таксама пераўтворыць тып у лагічны.
Могуць быць сітуацыі, калі + будзе інтэрпрэтавацца як аператар канкатэнацыі, а не складання. У пазбяганне гэтага варта выкарыстоўваць тыльды: ~~. Гэты аператар эквівалентны выразу -n-1. Напрыклад, ~ 15 роўна -16.
Выкарыстанне двух тыльд запар зводзіць на нішто аперацыю, таму што - (- - n - 1) - 1 = n + 1 - 1 = n. Іншымі словамі, ~ -16 роўна 15.
Пачынаючы з ES7, можна выкарыстоўваць аператар узвядзення ў ступень ** у якасці скарачэння для ступеняў. Гэта значна хутчэй, чым выкарыстанне Math.pow (2, 3). Накшталт проста, але ў спіс прыёмаў гэты момант уключаны, паколькі далёка не ўсюды ён згадваецца.
console.log(2 ** 3); // Result: 8
Не варта блытаць яго з сімвалам ^, які звычайна выкарыстоўваецца для ўзвядзення ў ступень. Але вось у JavaScript гэта аператар XOR.
Да ES7 скарачэнне ** можна было ўжываць толькі для ступеняў з падставай 2 з выкарыстаннем аператара пабітавага зруху налева <<:
Пры неабходнасці пераўтварыць float у цэлы лік можна скарыстацца Math.floor(), Math.ceil() ці Math.round(). Але ёсць і хутчэйшы шлях, для гэтага выкарыстоўваем |, гэта значыць аператар OR.
Паводзіны | у значнай ступені залежыць ад таго, ці маеце вы справу са станоўчымі ці адмоўнымі лікамі, таму гэты спосаб падыходзіць толькі ў тым выпадку, калі вы ўпэўненыя ў тым, што робіце.
n | 0 выдаляе ўсё, што ідзе пасля дзесятковага падзельніка, усякаючы лік з якая плавае кропкай да цэлага ліку.
Вы можаце атрымаць той жа эфект акруглення, выкарыстоўваючы ~~. Пасля прымусовага пераўтварэння ў цэлы лік значэнне застаецца нязменным.
Прыбіраны замыкальныя лікі
Аператар OR можна выкарыстоўваць для таго, каб прыбраць любую колькасць лічбаў з ліку. Гэта азначае, што нам не трэба пераўтвараць тыпы, як тут:
let str = "1553";
Number(str.substring(0, str.length - 1));
Стрэлачныя абазначэння ES6 можна выкарыстоўваць у метадах класа, і пры гэтым маецца на ўвазе прывязка. Дзякуючы гэтаму можна развітацца з выразамі, якія паўтараюцца, такімі як this.myMethod = this.myMethod.bind (this)!
Магчыма, вы ўжо выкарыстоўвалі JSON.stringify. Ці ведаеце вы, што ён дапамагае фарматаваць ваш JSON?
Метад stringify () прымае два неабавязковыя параметры: функцыю replacer, якую можна выкарыстоўваць для фільтрацыі які адлюстроўваецца JSON, і значэнне space.
console.log(JSON.stringify({ alpha: 'A', beta: 'B' }, null, 't'));
// Result:
// '{
// "alpha": A,
// "beta": B
// }'
Вось і ўсё, спадзяюся, што ўсе паказаныя прыёмы былі карысныя. А якія хітрасці ведаеце вы? Напішыце іх у каментарах.