Кіріспе

Жоғарғы деңгейдегі бағдарламалау тілі

Wikipedia-да JavaScript-тің қолданылуы

JavaScript ('/dʒ//ɑː//v//ə//s//k//r//ɪ//p//t/'), көбінесе JS деп қысқартылады, HTML және CSS-пен қатар вебтің бағдарламалау тілі және негізгі технологиясы болып табылады. Веб-сайттардың 99%-ы веб-беттің әрекетін клиенттік жағында JavaScript арқылы іске асырады. Веб-браузерлерде клиенттік кодты орындайтын арнайы JavaScript қозғалтқышы бар. Бұл қозғалтқыштар кейбір серверлерде және түрлі қосымшаларда да қолданылады. Браузерден тыс қолдану үшін ең танымал орындалу ортасы Node.js болып табылады. JavaScript – жоғарғы деңгейдегі, көбінесе уақытында құрастырылатын, ECMAScript стандартына сәйкес келетін тіл. Ол динамикалық типтеуге, прототипке негізделген объектілі бағдарлауға және бірінші сыныпты функцияларға ие. Ол көп парадигмалы, оқиға басқарылатын, функционалдық және императивті бағдарламалау стильдерін қолдайды. Онда мәтінмен, күндермен, тұрақты өрнектермен, стандартты деректер құрылымдарымен және Document Object Model (DOM) жұмыс істеуге арналған қолданбалық бағдарламалау интерфейстері (API) бар. ECMAScript стандартына желілік байланыс, сақтау немесе графикалық мүмкіндіктер сияқты кіріс/шығыс (I/O) операциялары кірмейді. Бірақ іс жүзінде веб-браузер немесе басқа орындалу ортасы I/O үшін JavaScript API-ін ұсынады. Java және JavaScript атаулары, синтаксисі және сәйкес стандартты кітапханалары жағынан ұқсас болғанымен, екі тіл ерекше және дизайны жағынан айқын айырмашылықтарға ие.

Netscape-те құру

Графикалық пайдаланушы интерфейсі бар алғашқы танымал веб-браузер – Mosaic 1993 жылы жарық көрді. Техникалық білімі жоқ адамдарға да қолжетімді болғандықтан, ол World Wide Web-тің ерте кезеңдеріндегі қарқынды өсуіне зор үлес қосты. Mosaic-тің негізгі әзірлеушілері кейін Netscape корпорациясын құрды, ол 1994 жылы Netscape Navigator деп аталатын жақсартылған браузерді шығарды. Бұл браузер тез арада ең көп қолданылатынға айналды. Вебтің қалыптасу кезеңінде веб-беттер тек статикалық болатын, браузерге жүктелгеннен кейін динамикалық мүмкіндіктер болмады. Дамып келе жатқан веб-әзірлеу саласында бұл шектеуді жоюға ниет болды, сондықтан 1995 жылы Netscape Navigator-ге бағдарламалау тілін қосу туралы шешім қабылданды. Осы мақсатқа жету үшін екі жол таңдалды: Java тілін енгізу үшін Sun Microsystems компаниясымен ынтымақтастық орнату, сонымен қатар Brendan Eich-ты Scheme тілін енгізу үшін шақыру. Мақсат – "халыққа арналған тіл" болды, бірақ Netscape басшылығы көп ұзамай Eich-қа Java синтаксисіне ұқсас, Scheme немесе басқа скрипт тілдерінен ерекшеленетін жаңа тіл жасауды тапсырды. JavaScript атауының таңдалуы оның Java-мен тікелей байланысты екенін қате түсіндіріп, шатастыру тудырды. Сол кезде дотком бумы басталды және Java танымал жаңа тіл болды, сондықтан Eich JavaScript атауын Netscape-тің маркетингтік әрекеті деп есептеді.

Microsoft-тың қабылдауы

Microsoft 1995 жылы Internet Explorer-ді ұсынды, бұл Netscape-пен браузерлер арасындағы бәсекеге әкелді. JavaScript саласында Microsoft өзінің JScript деп аталатын интерпретаторын жасады. Microsoft алғаш рет JScript-ті 1996 жылы CSS қолдауымен және HTML-ге қосымша мүмкіндіктермен бірге шығарды. Бұл іске асырулардың әрқайсысы Netscape Navigator-дегі баламаларынан едәуір өзгеше болды. Осы ерекшеліктер әзірлеушілерге веб-сайттарын екі браузерде де тиімді жұмыс істеуіне кедерес келтірді, нәтижесінде бірнеше жыл бойы "Netscape-те жақсы көрінеді" және "Internet Explorer-де жақсы көрінеді" деген логотиптер кеңінен қолданылды.

JScript-тің пайда болуы

Брендан Эйх осы кезең туралы былай деді: "Бұл әлі де қосымша тіл сияқты. Оны баяу немесе жалықтыратын деп есептейді. Адамдар ашылатын терезелерді немесе ескі браузердің төменгі жағындағы ескі статус жолағында жылжып өтетін хабарламаларды жасайтын". Осының салдарынан JScript веб-беттерде клиенттік жақ скрипті үшін де-факто стандартқа айналды. Microsoft бастапқыда стандарттау процесіне қатысып, кейбір ұсыныстарды JScript тілінде іске асырды, бірақ кейіннен ECMA жұмысына қатысуын тоқтатты. Сөйтіп, ECMAScript 4 жобасы тоқтатылды.

Өсу және стандарттау

2000-жылдардың басында Internet Explorer үстемдік еткен кезеңде клиенттік жағындағы скрипттер дамуы тоқтап қалды. Бұл 2004 жылы Netscape-тің ізбасары Mozilla Firefox браузерін шығарғаннан кейін өзгерді. Firefox көптеген қолданушылар тарапынан жақсы қабылданып, Internet Explorer-ден маңызды үлесті алып қойды. 2005 жылы Mozilla ECMA International ұйымына қосылды және XML (E4X) стандарты үшін ECMAScript жұмысын бастады. Бұл Mozilla-ның Macromedia (кейін Adobe Systems сатып алған) компаниясымен бірлесіп жұмыс істеуіне әкелді, олар E4X-ті ECMAScript 4 жобасына негізделген ActionScript 3 тілінде іске асырды. Мақсат – ActionScript 3-ті жаңа ECMAScript 4 стандарты ретінде қабылдау болды. Осы мақсатта Adobe Systems Tamarin атты бағдарламаны ашық кодты жоба ретінде жариялады. Дегенмен, Tamarin және ActionScript 3 клиенттік скрипттерден тым көп ерекшеленді, ал Microsoft-тың қолдауы болмағандықтан ECMAScript 4 жобасы аяқталмай қалды. Осы аралықта ECMA жұмысына қатысы жоқ ашық кодты қауымдастықтарда маңызды өзгерістер болып жатты. 2005 жылы Jesse James Garrett Ajax терминін енгізіп, деректерді бетті толығымен жаңартпастан фондық режимде жүктеуге мүмкіндік беретін, JavaScript тіліне негізделген веб-қосымшаларын жасауға арналған технологиялар жиынтығын сипаттады. Бұл JavaScript-тің қайта жандану кезеңін бастады, оның алдында ашық кодты кітапханалар мен олардың айналасындағы қауымдастықтар тұрды. jQuery, Prototype, Dojo Toolkit және MooTools сияқты көптеген жаңа кітапханалар құрылды. Google 2008 жылы V8 JavaScript қозғалтқышымен жабдықталған Chrome браузерін ұсынды, ол бәсекелестерінен жылдам болды. Негізгі инновация – уақыт бойынша компиляция (JIT) технологиясы болды, сондықтан басқа браузер әзірлеушілері де JIT үшін өздерінің қозғалтқыштарын жаңартуға мәжбүр болды. 2008 жылдың шілдесінде осы түрлі тараптар Ослода конференция өткізді. Бұл 2009 жылдың басында барлық қатысты жұмыстарды біріктіру және тілді дамыту туралы келісімге әкелді. Нәтижесінде 2009 жылдың желтоқсанында ECMAScript 5 стандарты жарық көрді.

Жетілу кезеңі

Тілге қатысты ауқымды жұмыстар бірнеше жыл бойы жалғасып, 2015 жылы ECMAScript 6 жариялануымен бірге кеңейтілген толықтырулар мен жетілдірулер ресми түрде бекітілді. 2009 жылы Райан Даль құраған Node.js, веб-браузерлерден тыс JavaScript қолданысын едәуір арттырды. Node V8 қозғалтқышын, оқиға циклын және I/O API-ларын біріктіре отырып, дербес JavaScript орындалу ортасын қамтамасыз етеді. 2018 жылға қарай Node миллиондаған әзірлеушілер қолданды, ал npm әлемдегі кез келген пакет менеджерінен көп модульдерге ие болды. ECMAScript спецификациясының жобасы қазіргі уақытта GitHub-та ашық түрде сақталады. Тілге қатысты ұсынылатын өзгерістер жан-жақты қарастыру процесінен өтеді. Қазір әзірлеушілер нұсқа нөмірлеріне емес, алдағы мүмкіндіктердің статусына жеке-жеке назар аударады. Сауда белгісі алғаш рет 1997 жылдың 6 мамырында Sun Microsystems компаниясына тіркелген, ал 2009 жылы Sun компаниясын сатып алған Oracle компаниясына берілді.

Веб-сайтты клиент жағында пайдалану

JavaScript – 99% веб-сайттар оны осы мақсатта пайдаланатын, вебтің басым клиенттік жазба тілі. jQuery ең көп қолданылатын тіл. Дегенмен, ешқандай кітапханалар мен фреймворктерді пайдаланбай, тек стандартты JavaScript мүмкіндіктеріне ғана сүйенетін веб-сайттарды атау үшін "Vanilla JS" термині пайда болды.

Басқа қолданылу

JavaScript-ті қолдану веб-браузерлерде пайда болған бастапқы орнынан асып, кеңірек тарады. JavaScript қозғалтқыштары енді серверлік веб-сайттарды іске қосу және браузерлік емес қолданбалар үшін де түрлі бағдарламалық жүйелерге енгізілген. Серверлік жағында JavaScript-ті қолдануды ілкі дамытуға жасалған тыянақтар Netscape Enterprise Server және Microsoft-тың Internet Information Services болды, бірақ олар шектеулі қолданысқа ие болды. Electron, Cordova, React Native және басқа да қолданбалық құралдар JavaScript-те іске асырылған логикаға негізделген көптеген қолданбаларды жасауға пайдаланылды. Басқа браузерлік емес қолданбаларға PDF құжаттарын скрипттеуге мүмкіндік беретін Adobe Acrobat және JavaScript-те жазылған GNOME Shell кеңейтулері кіреді. Соңғы кезде JavaScript кіріктірілген жүйелерде де пайда бола бастады, көбінесе Node.js арқылы.

Орындау уақыты жүйесі

JavaScript қозғалтқышы скрипттердің кеңірген ортамен өзара әрекеттесуіне мүмкіндік беретін объектілер мен әдістерді ұсыну үшін орындалу уақыты жүйесіне (веб-браузер немесе дербес жүйе) енгізілуі тиіс. Бұған I/O үшін қажетті API-лер, мысалы, желілік байланыс, сақтау немесе графикалық мүмкіндіктер кіреді. Орындалу уақыты скрипттерді импорттау мүмкіндігін де қамтамасыз етеді. JavaScript – бір жіпті тіл. Орындалу уақыты кезектегі хабарларды бірінен соң бірін өңдейді және әрбір жаңа хабарға сәйкес функцияны шақырып, функция аргументтері мен жергілікті айнымалыларымен шақыру стегінің фреймін жасайды. Шақыру стегі функцияның қажеттіліктеріне қарай қысқарып, ұзарады. Функция аяқталғаннан кейін шақыру стегі бос болса, JavaScript кезектегі келесі хабарламаға көшеді. Бұл оқиға циклы деп аталады, ол "толық орындалғанға дейін" деп сипатталады, себебі әрбір хабарлама келесісі қарастырылмас бұрын толығымен өңделеді. Дегенмен, тілдің бір уақытта орындалу моделі оқиға циклын бұғаттамайтын ретінде сипаттайды: бағдарламаның I/O операциялары оқиғалар мен кері шақыру функцияларын пайдаланып жүзеге асырылады. Яғни, мысалы, JavaScript дерекқорынан жауап күтіп тұрғанда тышқанның басуын өңдеуге болады. Node.js, Deno және Bun – дербес орындалу уақыттарының белгілі мысалдары.

Ерекшеліктері

Егер басқаша айтылмаса, келесі мүмкіндіктер барлық сәйкес ECMAScript жүзеге асыруларына ортақ.

Императивті және құрылымдалған

JavaScript C тілінен құрастырылған бағдарламалау синтаксисінің көп бөлігін қолдайды (мысалы, if операторлары, while циклдары, switch операторлары, do while циклдары және т.б.). Бір толық емес ерекшелік – ауқым: бастапқыда JavaScript тек var арқылы функциялық ауқымға ие болды; блок ауқымы 2015 жылғы ECMAScript нұсқасында let және const түйін сөздерімен қосылды. C тілі сияқты, JavaScript өрнектер мен операторлар арасында ажырату жасайды. C тілінен бір синтаксистік айырмашылық – автоматты нүктелі үтір қою, ол операторларды аяқтайтын нүктелі үтірлерді жіберуге мүмкіндік береді.

Орындау уақытын бағалау

JavaScript орындалу кезінде жолдар түрінде берілген операторларды орындай алатын eval функциясын қамтиды.

Үлгілер

JavaScript көптеген басқа объектіге бағытталған тілдер мұрагерлік үшін сыныптарды пайдаланғанда, прототиптерді қолданады. JavaScript-те прототиптер арқылы сыныптарға негізделген көптеген мүмкіндіктерді имитациялауға болады.

Нысан конструкторлары ретінде функциялар

Функциялар әдеттегі рөлімен қатар, объект конструкторлары ретінде де қолданылады. Функцияны `new` сөзімен шақыру прототиптің экземплярын жасайды, конструктордың қасиеттері мен әдістерін мұралайды (Object прототипінің қасиеттерін қоса алғанда). ECMAScript 5 нысанды құруға мүмкіндік беретін `Object.create` әдісін ұсынады, бұл Object прототипінен автоматты түрде мұрагерлік етпей, нақты экземпляр жасауға болады (ескі орталарда прототипті null деп белгілеуге болады). Конструктордың прототип қасиеті жаңа объектінің ішкі прототипі ретінде қолданылатын объектіні анықтайды. Конструктор ретінде қолданылатын функцияның прототипін өзгерту арқылы жаңа әдістерді қосуға болады. JavaScript-тің кіріктірілген конструкторлары, мысалы `Array` немесе `Object` прототиптері де бар, оларды өзгертуге болады. Object прототипін өзгертуге мүмкіндік болғанымен, мұндай амал көбінесе жаман тәжірибе саналады, себебі JavaScript-тегі көптеген объектілер Object прототипінен әдістер мен қасиеттерді мұралайды және олар прототиптің өзгеруін күтпейді.

Әдіс ретінде функциялар

Көптеген объектіге бағытталған тілдерден өзгеше, JavaScript-те функцияның анықтамасы мен әдістің анықтамасы арасында ешқандай айырмашылық жоқ. Айырмашылық, керісінше, функция шақырылған кезде туындайды. Функция, егер ол объектінің әдісі ретінде шақырылса, сол шақыру үшін функцияның жергілікті `this` кілт сөзі сол объектіге байланысты болады.

Функционалды

JavaScript функциялары бірінші дәрежелі болып табылады; функция объекті ретінде қарастырылады. Осылайша, функцияда қасиеттері мен әдістері болуы мүмкін, мысалы, `call` және `bind`.

Лексикалық тұйықтау

Ұялы функция – басқа функцияның ішінде анықталған функция. Ол сыртқы функция шақырылған сайын жаңадан құрылады. Бұған қоса, әрбір ұялы функция лексикалық жабылуды қалыптастырады: сыртқы функцияның лексикалық кеңістігі (тұрақты мәндерді, жергілікті айнымалыларды немесе аргументтерді қоса алғанда) әрбір ішкі функция нысанының ішкі жай-күйінің бір бөлігіне айналады, тіпті сыртқы функция орындалуын аяқтағаннан кейін де.

Анонимді функция

JavaScript анонимді функцияларды да қолдайды.

Өкілеттілік

JavaScript жасырын және нақты түрде делегациялауды қолдайды.

Функциялар рөл ретінде (тұлға белгілері мен миксиндер)

JavaScript рөл үлгілерінің, мысалы, қасиеттер мен араластырулар сияқты, функцияларға негізделген әртүрлі іске асырылуларын табиғи түрде қолдайды. Мұндай функция өзінің ішінде this кілт сөзіне байланысты кем дегенде бір әдіс арқылы қосымша мінез-құлықты анықтайды. Рөлді прототиптік тізбек арқылы бөліспейтін қосымша мінез-құлықты қажет ететін объектілерге call немесе apply арқылы нақты түрде тапсыру қажет.

Нысанның құрамы мен мұрагерлігі

Жазбаша функцияға негізделген делегация JavaScript-те композицияны қамтиды, ал жасырын делегация прототиптік тізбек бойымен жүрген әрбір сәтте орын алады, мысалы, объектіге тікелей тиесілі емес, бірақ оған қатысты әдісті табу үшін. Әдіс табылып қана қоймай, осы объектінің контекстінде шақырылады. Осылайша, JavaScript-тегі мұрагерлік конструктор функцияларының прототип қасиетіне байланысты делегация автоматты түрде жүзеге асырылады.

Нөлге негізделген нөмірлеу

JavaScript — нөлдік индекс тілі.

Вариадикалық функциялар

Функцияға белгісіз санда параметрлер жіберуге болады. Функция оларға формальды параметрлер арқылы, сондай-ақ жергілікті аргументтер объектісі арқылы қол жеткізе алады. bind әдісін пайдаланып, өзгергіш параметрлерді қабылдайтын функцияларды (вариадикалық функцияларды) да жасауға болады.

Массив пен объектінің литералдары

Көптеген скрипт тілдеріндегідей, массивтер мен объектілерді (басқа тілдерде ассоциативтік массивтер) ықшам қысқарту синтаксисімен жасауға болады. Шындығында, осы тікелей мәндер JSON дерек форматының негізін құрайды.

Тұрақты өрнектер

Perl-ге ұқсас түрде, JavaScript те реттегіш өрнектерді қолдайды, олар мәтінді өңдеуге арналған ықшам және қуатты синтаксиспен қамтамасыз етеді, бұл кіріктірілген жол функцияларынан гөрі күрделірек.

Уәделер мен Асинхрондылық/күту

JavaScript асинхронды операцияларды өңдеу үшін Promise және Async/await мүмкіндіктерін қолдайды.

Уәделер

Promise-ге кіріктірілген объекті уәделерді басқару және асинхронды операцияның нәтижесіне байланысты функцияларды қамтамасыз етеді. Жақында JavaScript спецификациясы біріктіру әдістерін енгізді, олар дамытушыларға бірнеше JavaScript уәделерін біріктіруге және түрлі жағдайларға сүйенген операцияларды орындауға мүмкіндік береді. Енгізілген әдістер: Promise.race, Promise.all, Promise.allSettled және Promise.any.

Қадамдастыру/ күту

Асинхронды, бұғаттамайтын функцияны қалыпты синхронды функция сияқты құрылымдауға мүмкіндік береді. Асинхронды, бұғаттамайтын кодты, минималды қосымша шығындармен, дәстүрлі синхронды, бұғаттайтын кодқа ұқсас етіп жазуға болады.

Қауіпсіздік

JavaScript және DOM қауіпті авторларға веб арқылы клиенттік компьютерде іске қосылатын скрипттерді жеткізу мүмкіндігін ұсынады. Браузер жасаушылары бұл тәуекелді екі шектеу арқылы азайтады. Біріншіден, скрипттер тек вебке қатысты әрекеттерді ғана орындай алатын сенімді ортада (sandbox) іске қосылады, файлдарды құру сияқты жалпы мақсаттағы бағдарламалау міндеттерін орындай алмайды. Екіншіден, скрипттер бірдей түпкілікті саясатпен (same origin policy) шектеледі: бір веб-сайттың скрипттері екінші сайтқа жіберілген пайдаланушы аты, құпия сөздері немесе cookie сияқты ақпаратқа қол жеткізе алмайды. JavaScript-ке қатысты көптеген қауіпсіздік қателіктері осы бірдей түпкілікті саясатты немесе сенімді ортаны бұзу болып табылады. ADsafe және Secure ECMAScript (SES) сияқты жалпы JavaScript-тің қосымша жиынтықтары бар, олар, әсіресе үшінші тараптар жасаған кодта (мысалы, жарнамаларда) қауіпсіздіктің жоғары деңгейін қамтамасыз етеді. Closure Toolkit – үшінші тараптың JavaScript және HTML кодтарын қауіпсіз ендіру және оқшаулауға арналған тағы бір жоба. Контент қауіпсіздігі саясаты – веб-бетте тек сенімді кодтың іске қосылуын қамтамасыз етудің басты жолы.

Сайт аралық скрипттер

JavaScript-ке қатысты жиі кездесетін қауіпсіздік мәселесі – сайттар аралық скрипттеу (XSS), бұл бірдей түпнұсқа саясатын бұзу болып табылады. XSS осалдықтары шабуылшының мақсатты веб-сайтқа, мысалы, онлайн-банкинг веб-сайтына, құрбанға көрсетілетін веб-бетке қауіпті скрипт енгізуіне мүмкіндік береді. Осы мысалдағы скрипт содан кейін құрбанның құқықтарымен банктік қолданбаға қол жеткізе алады, құпия ақпаратты ашуға немесе құрбанның келісімінсіз ақша аударуға әкелуі мүмкін. XSS осалдықтарын жоюдың маңызды жолы – HTML-ді тазалау. Кейбір браузерлер қауіпті скрипт қосылған URL-ді ұсынатын, шағылысқан XSS шабуылдарына қарсы жартылай қорғаныспен келеді. Дегенмен, тіпті осы браузерлерді пайдаланушылар да басқа XSS шабуылдарына ұшырауы мүмкін, мысалы, қауіпті код дерекқорда сақталған жағдайларда. XSS-ті толығымен болдырмау үшін серверлік жағынан веб-қосымшаларды дұрыс жобалау қажет. XSS осалдықтары браузер авторларының орындалу қателіктерінен де туындауы мүмкін.

Сайт аралық сұрау салуды жалғандау

Сайттар аралық сұраныстың жалғандануы (CSRF) – сайттар аралық осалдықтың тағы бір түрі. CSRF-де шабуылдаушының сайтындағы код құрбанның браузерін мақсатты сайтта пайдаланушы қаламаған әрекеттерді жасауға мәжбүр етеді (мысалы, банкте ақша аудару). Мақсатты сайттар сұрауды аутентификациялау үшін тек cookie-лерге ғана сүйенетін болса, шабуылдаушының сайтындағы кодтан келетін сұраулар бастаушы пайдаланушының бірдей жарамды кіру деректерін алып жүруі мүмкін. Жалпы, CSRF-тің шешімі – ұзақ мерзімді әсер ететін кез келген сұрауды аутентификациялау үшін аутентификациялық мәнді жасырын форма өрісінде, cookie-лерде ғана емес, талап ету болып табылады. HTTP Referrer аттарын тексеру де көмектеседі. "JavaScript hijacking" – CSRF шабуылының бір түрі, онда шабуылдаушының сайтындағы <script> тегі құрбанның сайтындағы жеке ақпаратты (мысалы, JSON немесе JavaScript) қайтаратын бетті пайдаланады. Мүмкін болатын шешімдер: жеке ақпаратты қайтаратын кез келген жауап үшін POST және GET параметрлерінде аутентификациялық токенді талап ету.

Клиентке сенім артудың қатесі

Клиент-серверлік қолданбаларды әзірлеушілер сенімсіз клиенттер шабуылшылардың бақылауында болуы мүмкін екенін ескеруі керек. Қолданба авторы өз JavaScript кодысы қалағандай (немесе тіпті) жұмыс істейді деп есептеуге болмайды, себебі кодқа енгізілген кез келген құпия ақпарат шебер шабуылшылармен алынып тасталуы мүмкін. Мұның кейбір салдары: Веб-сайт авторлары өз JavaScript кодысының жұмыс істеуін толығымен жасыра алмайды, өйткені бастапқы кодты клиентке жіберу қажет. Кодты бүркемелеуге болады, бірақ бүркемелеуді кері инженериялауға болады. JavaScript пішіншелерін тексеру – бұл пайдаланушыларға қолайлылық, бірақ қауіпсіздік емес. Егер сайт пайдаланушының қызмет көрсету шарттарымен келіскенін немесе тек сандарды қабылдайтын өрістерден жарамсыз символдарды сүзгіден өткізсе, мұны клиентте ғана емес, серверде де жасауы керек. Скрипттерді таңдап өшіруге болады, сондықтан JavaScript-ті суретті сақтау үшін оң жақ тінтуішті басу сияқты әрекеттерді болдырмау үшін пайдалануға болмайды. JavaScript-ке құпия ақпаратты, мысалы парольдерді енгізу – өте жаман тәжірибе, себебі оны шабуылшылар қолға түсіре алады. Прототип ластануы – бұл орындалу кезіндегі осалдық, онда шабуылшылар объектінің прототипіндегі кез келген қасиеттерді өзгерте алады.

Құрылысшыларға сенім артудың қателігі

Npm және Bower сияқты пакеттерді басқару жүйелері JavaScript әзірлеушілерінің арасында кең таралған. Мұндай жүйелер әзірлеушіге өз бағдарламасының басқа әзірлеушілердің бағдарламалық кітапханаларына тәуелділігін оңай басқаруға мүмкіндік береді. Әзірлеушілер кітапханаларды қолдаушылардың оларды қауіпсіз және жаңартылып отыратынына сенім артады, бірақ бұл әрқашан осылай бола бермейді. Осы сенімсіздіктің салдарынан осал тұс пайда болды. Кітапханаларға сүйенген жаңа нұсқалар, кітапханаларды пайдаланатын барлық бағдарламаларда қателер мен осалдықтардың пайда болуына себеп болуы мүмкін. Керісінше, кітапханада белгілі осалдықтар болса да, олар уақтылы жабылмай қалуы мүмкін. 133 мың веб-сайтты зерттеу барысында зерттеушілер веб-сайттардың 37%-ында кем дегенде бір белгілі осалдық бар кітапхана табылды. "ALEXA бойынша әр веб-сайтта қолданылатын ең көне кітапхана нұсқасы мен осы кітапхананың ең жаңа нұсқасы арасындағы орташа кешігу 1177 күнге жетеді, ал кейбір әлі де белсенді қолданылып жүрген кітапханалардың дамуы бірнеше жыл бұрын тоқтатылған".

Браузер мен плагин кодтау қателері

JavaScript браузердің кең ауқымды мүмкіндіктеріне интерфейс ұсынады, олардың кейбіреулерінде буфер асып кету сияқты қателер болуы мүмкін. Бұл қателер шабуылшыларға пайдаланушының жүйесінде кез келген кодты іске қосатын скрипттерді жазуға мүмкіндік береді. Бұл код әрі қарай басқа JavaScript қолданбасымен ғана шектелмейді. Мысалы, буфер асып кету қатесі арқылы шабуылшы операциялық жүйенің API-сына суперпайдаланушы құқықтарымен қол жеткізе алады. Осы қателер Firefox, Internet Explorer және Safari сияқты ірі браузерлерге әсер еткен. Видео проигрыштер, Adobe Flash және Microsoft Internet Explorer-де әдепкі бойынша қосылған ActiveX элементтерінің кең спектрі сияқты плагиндерде де JavaScript арқылы пайдаланылатын қателер болуы мүмкін (мұндай қателер бұрын қолданылған). Windows Vista жүйесінде Microsoft, Internet Explorer процесін шектеулі құқықтармен іске қосу арқылы буфер асып кету сияқты қателердің тәуекелдерін азайтуға тырысты. Google Chrome да өз беттік көрсету процестерін жеке "құмдық" ортасына шектейді.

Құмдық орнатқандағы қателер

Веб-браузерлер JavaScript-ті құмдық қорабынан тыс орындауға қабілетті, мысалы, файлдарды жасау немесе жою үшін қажетті құқықтармен. Мұндай құқықтар вебтен алынған кодқа берілмеуі керек. Вебтен JavaScript-ке дұрыс емес құқықтар беру Internet Explorer және Firefox екеуінде де осалдықтарға себеп болды. Windows XP Service Pack 2-де Microsoft Internet Explorer-де JScript-тің құқықтарын төмендетті. Microsoft Windows компьютердің қатты дискісіндегі JavaScript бастапқы файлдарын жалпы мақсаттағы, құмдық қорабына жатпайтын бағдарламалар ретінде іске қосуға мүмкіндік береді (қараңыз: Windows Script Host). Бұл JavaScript-ті (VBScript сияқты) теориялық түрде трояндық құбылысқа жеткізуге болатын арнаға айналдырады, бірақ JavaScript трояндықтары практикада сирек кездеседі.

Жабдыққа арналған осалдықтар

2015 жылы қауіпсіздік зерттеушілері бір мақалада Rowhammer шабуылының JavaScript негізіндегі прототипін сипаттады. 2017 жылы ASLR-ді айналып өтуге болатын браузер арқылы JavaScript шабуылы көрсетілді. Ол "ASLR⊕Cache" немесе AnC деп аталады. 2018 жылы Intel және басқа процессорлардағы болжамды орындауға (Speculative Execution) қарсы Spectre шабуылдарын жариялаған мақалада JavaScript іске асырылымы да бар болды.

Даму құралдары

Тілмен бірге маңызды құралдар да дамыды. Кез келген негізгі веб-браузерде веб-әзірлеу құралдары, оның ішінде JavaScript жөндеушісі орнатылған. Статикалық бағдарлама талдау құралдары, мысалы ESLint және JSLint, JavaScript кодын стандарттар мен ережелер жиынтығына сәйкестігін тексеріп шығады. Кейбір браузерлерде кіріктірілген профильдеушілер бар. Жеке профильдеу кітапханалары да жасалды, мысалы benchmark.js және jsbench. Көптеген мәтіндік редакторлар JavaScript кодын синтаксистік түрде ерекшелеуді қолдайды.

Жава

Көптеген адамдардың қате пікірі – JavaScript тілі Java тілімен тікелей байланысты. Шындығында, екеуінің де C тіліне ұқсас синтаксисі бар (C тілі – олардың ең жақын ортақ тілі). Олар көбінесе қауіпсіз ортада жұмыс істейді, ал JavaScript Java тілінің синтаксисі мен стандартты кітапханасын ескере отырып жасалған. Атап айтқанда, бастапқы JavaScript-те барлық Java кілт сөздері резервтелген, JavaScript-тің стандартты кітапханасы Java тілінің атау ережелерін сақтайды, ал JavaScript-тің объектілері Java 1.0 нұсқасының сыныптарына негізделген. Екі тіл де алғаш рет 1995 жылы пайда болды, бірақ Java тілін Sun Microsystems компаниясының Джеймс Гослинг, ал JavaScript тілін Netscape Communications компаниясының Брендан Эйх жасады. Екі тілдің арасындағы айырмашылықтар ұқсастықтарынан гөрі көбірек көрінеді. Java тілінде статикалық типтеу қолданылады, ал JavaScript тілінде динамикалық типтеу бар. Java тілі компиляцияланған байт-кодтан жүктеледі, ал JavaScript тілі адам оқи алатын бастапқы код ретінде жүктеледі. Java тілінің объектілері сыныптарға негізделген, ал JavaScript тілінің объектілері прототиптерге негізделген. Соңында, Java тілінде функционалдық бағдарламалау Java 8 нұсқасына дейін қолдау көрсетілмеді, ал JavaScript тілі басынан бастап осы мүмкіндікке ие, Scheme тілінің ықпалымен дамыды.

JSON

JSON – JavaScript-тен туындаған деректер форматы, сондықтан оның атауы JavaScript Object Notation. Ол көптеген басқа бағдарламалау тілдері қолдайтын, кеңінен таралған формат.

Транспилерлер

Көптеген веб-сайттар JavaScript-ті көп пайдаланады, сондықтан басқа тілдерде жазылған кодты JavaScript-ке түрлендіру үшін транспиляторлар құрылды, бұл әзірлеу процесін жеңілдетуге көмектеседі. TypeScript және CoffeeScript – JavaScript-ке транспиляцияланатын екі танымал тіл.

WebAssembly-ді қосу

WebAssembly – JavaScript-ті толықтыруға арналған, байт-код форматына ие жаңа тіл, әсіресе веб-бет скрипттерінің өнімділікке аса қатысты бөліктері үшін. Барлық маңызды JavaScript қозғалтқыштары WebAssembly-ді қолдайды, ол әдеттегі JavaScript кодымен бірдей қауіпсіз ортада жұмыс істейді. asm.js – WebAssembly-дің алдын бақтаған JavaScript-тің бір тармағы.