JavaScript - JavaScript

JavaScript
Paradigmatadbirlarga asoslangan, funktsional, majburiy
LoyihalashtirilganBrendan Eich Dastlab, shuningdek, boshqa muhim hissa qo'shuvchilar ECMAScript spetsifikatsiya
Birinchi paydo bo'ldi1995 yil 4-dekabr; 24 yil oldin (1995-12-04)[1]
Barqaror chiqish
ECMAScript 2020[2] / Iyun 2020; 5 oy oldin (2020-06)
Ko'rib chiqish versiyasi
ECMAScript 2021
Matnni yozishDinamik, o'rdak
Fayl nomi kengaytmalari
Mayor amalga oshirish
V8, JavaScriptCore, SpiderMonkey, Chakra
Ta'sirlangan
AWK,[4] C, HyperTalk, Java,[5] Lua, Perl, Python, Sxema, O'zi
Ta'sirlangan
ActionScript, AtScript, CoffeeScript, Dart, JScript .NET, LiveScript, Maqsad-J, Opa, QML, Raku, TypeScript

JavaScript (/ˈɑːvəˌskrɪpt/),[6] sifatida qisqartiriladi JS, a dasturlash tili ga mos keladigan ECMAScript spetsifikatsiya.[7] JavaScript bu yuqori darajadagi, ko'pincha vaqtida tuzilgan va ko'p paradigma. Unda bor jingalak-qavs sintaksisi, dinamik yozish, prototipga asoslangan ob'ektga yo'naltirish va birinchi darajali funktsiyalar.

Bilan birga HTML va CSS, JavaScript-ning asosiy texnologiyalaridan biri Butunjahon tarmog'i.[8] JavaScript-ni faollashtirishga imkon beradi veb-sahifalar va uning muhim qismidir veb-ilovalar. Ning katta qismi veb-saytlar uchun foydalaning mijoz tomoni sahifa harakati,[9] va barcha asosiy veb-brauzerlar bag'ishlangan bor JavaScript mexanizmi uni ijro etish.

Ko'p paradigma tili sifatida JavaScript-ni qo'llab-quvvatlaydi tadbirlarga asoslangan, funktsional va majburiy dasturlash uslublari. Unda bor amaliy dasturlash interfeyslari Matn, sana bilan ishlash uchun (API) doimiy iboralar, standart ma'lumotlar tuzilmalari, va Hujjat ob'ekti modeli (DOM). Biroq, tilning o'zi hech birini o'z ichiga olmaydi kirish / chiqish (I / O), masalan tarmoq, saqlash, yoki grafikalar qulayliklar, chunki xost muhiti (odatda veb-brauzer) ushbu API-larni taqdim etadi.

Dastlab JavaScript dvigatellari faqat veb-brauzerlarda ishlatilgan, ammo hozirda ular ba'zilariga kiritilgan serverlar, odatda orqali Node.js. Ular, shuningdek, yaratilgan turli xil dasturlarga kiritilgan ramkalar kabi Elektron va Kordova.

JavaScript-da o'xshashliklar mavjud bo'lsa-da Java shu jumladan til nomi, sintaksis va tegishli standart kutubxonalar, ikki til bir-biridan ajralib turadi va dizayni jihatidan juda katta farq qiladi.

Tarix

Netscape-da yaratish

The Mozaik veb-brauzer 1993 yilda chiqarilgan. A bilan birinchi brauzer sifatida grafik foydalanuvchi interfeysi texnik bo'lmagan odamlar uchun qulay, bu yangi tug'ilgan chaqaloqning tez o'sishida muhim rol o'ynadi Butunjahon tarmog'i.[10] Mosaic-ning etakchi ishlab chiqaruvchilari keyinchalik Netscape yanada sayqallangan brauzer chiqargan korporatsiya, Netscape Navigator, 1994 yilda. Navigator tezda eng ko'p ishlatiladigan brauzerga aylandi.[11]

Ushbu Internet shakllangan yillarda, veb-sahifalar faqat statik bo'lishi mumkin, brauzerga sahifa yuklangandan so'ng dinamik harakat qilish qobiliyatiga ega emas. Rivojlanayotgan veb-ishlab chiqish sahnasida ushbu cheklovni olib tashlash istagi paydo bo'ldi, shuning uchun 1995 yilda Netscape qo'shishni qaror qildi skript tili Navigator-ga. Bunga erishish uchun ular ikkita marshrutni ta'qib qilishdi: hamkorlik qilish Quyosh mikrosistemalari joylashtirmoq Java dasturlash tili, shuningdek, yollash paytida Brendan Eich joylashtirmoq Sxema til.[12]

Tez orada Netscape rahbariyati eng yaxshi variant Eich uchun yangi til ishlab chiqish, ya'ni sintaksisini Java-ga o'xshash va kamroq Scheme yoki boshqa mavjud skript tillariga o'xshashligi haqida qaror qabul qildi.[12] Garchi yangi til va uning tarjimon Dastur 1995 yil sentyabr oyida Navigator-ning birinchi versiyasi sifatida yuborilganida rasmiy ravishda LiveScript deb nomlandi, uch oy o'tgach, bu nom JavaScript-ga o'zgartirildi.[12][1][13]

JavaScript-ni nomini tanlash chalkashliklarni keltirib chiqardi, ba'zida bu Java-ning ajralmas qismi kabi taassurot qoldirdi. O'sha paytda Java eng yangi dasturlash tili bo'lganligi sababli, bu Netscape tomonidan o'zining yangi til keshini berish uchun marketing hiylasi sifatida tavsiflangan.[14]

Microsoft tomonidan qabul qilish

Microsoft debyut qildi Internet Explorer 1995 yilda, a brauzer urushi Netscape bilan. JavaScript-ning old qismida, Microsoft teskari muhandislik navigator tarjimon o'zlarini yaratish uchun, deb nomlangan JScript.

JScript birinchi qo'llab-quvvatlash bilan birga 1996 yilda chiqarilgan CSS va kengaytmalari HTML. Ushbu dasturlarning har biri Navigator-dagi o'xshashlaridan sezilarli darajada farq qilar edi.[15][16] Ushbu farqlar ishlab chiquvchilarga o'z veb-saytlarini ikkala brauzerda yaxshi ishlashini qiyinlashtirdi, natijada bir necha yillar davomida "Netscape-da eng yaxshi ko'rilgan" va "Internet Explorer-da eng yaxshi ko'rilgan" logotiplari keng qo'llanildi.[15][17]

JScript-ning ko'tarilishi

1996 yil noyabrda, Netscape JavaScript-ni taqdim etdi ECMA International, barcha brauzer sotuvchilari mos keladigan standart spetsifikatsiya uchun boshlang'ich nuqtasi sifatida. Bu birinchi rasmiy ravishda chiqarilishiga olib keldi ECMAScript 1997 yil iyun oyida tilning spetsifikatsiyasi.

Standartlar jarayoni bir necha yil davom etdi, 1998 yil iyun oyida ECMAScript 2 va 1999 yil dekabrda ECMAScript 3 chiqarildi. ECMAScript 4 ustida ishlash 2000 yilda boshlandi.

Ayni paytda, Microsoft brauzer bozorida tobora ustun mavqega ega bo'ldi. 2000-yillarning boshlariga kelib Internet Explorer-ning bozor ulushi 95% ga etdi.[18] Bu shuni anglatardi JScript uchun amalda standart bo'ldi mijoz tomonidagi skript Internetda.

Dastlab Microsoft standartlar jarayonida qatnashdi va JScript tilida ba'zi takliflarni amalga oshirdi, ammo oxir-oqibat u ECMA ishida hamkorlikni to'xtatdi. Shunday qilib ECMAScript 4 koptok bilan ishlangan.

O'sish va standartlashtirish

Davrida Internet Explorer 2000-yillarning boshlarida dominantlik, mijozlar tomonidagi skriptlar to'xtab qoldi. Bu Netscape vorisi bo'lgan 2004 yilda o'zgarishni boshladi. Mozilla, ozod qildi Firefox brauzer. Firefox Internet Explorer-dan katta bozor ulushini olib, ko'pchilik tomonidan yaxshi qabul qilindi.[19]

2005 yilda Mozilla ECMA International-ga qo'shildi va shu bilan ish boshlandi XML uchun ECMAScript (E4X) standarti. Bu Mozilla bilan birgalikda ishlashga olib keldi Makromedia (keyinchalik tomonidan sotib olingan Adobe tizimlari ), ECMAScript 4 loyihasiga asoslangan E4X-ni ActionScript 3 tilida amalga oshirgan. Maqsad ActionScript 3-ni yangi ECMAScript 4 sifatida standartlashtirishga aylandi. Shu maqsadda Adobe Systems kompaniyasi ushbu versiyani chiqardi Tamarin sifatida amalga oshirish ochiq manba loyiha. Biroq, Tamarin va ActionScript 3 o'rnatilgan mijoz tomoni skriptlaridan juda farq qilar edi va ular bilan hamkorlik qilmasdan Microsoft, ECMAScript 4 hech qachon o'z samarasini bermagan.

Ayni paytda, ECMA ishiga aloqador bo'lmagan ochiq manbali jamoalarda juda muhim o'zgarishlar yuz berdi. 2005 yilda, Jessi Jeyms Garret atamani ishlab chiqqan oq qog'ozni chiqardi Ayaks va yaratish uchun JavaScript-ni qo'llab-quvvatlovchi texnologiyalar to'plamini tavsifladi veb-ilovalar bu erda sahifani to'liq qayta yuklash zaruriyatidan qochib, ma'lumotlar fonda yuklanishi mumkin. Bu JavaScript-ning qayta tiklanish davrini boshlagan, ochiq manbali kutubxonalar va ular atrofida shakllangan jamoalar tomonidan boshqarilgan. Ko'plab yangi kutubxonalar, shu jumladan yaratilgan jQuery, Prototip, Dojo Toolkit va MooTools.

Google debyut uning Chrome brauzer 2008 yilda, bilan V8 Raqobatchilardan tezroq bo'lgan JavaScript-ni qidiruvi.[20][21] Asosiy yangilik bo'ldi o'z vaqtida kompilyatsiya (JIT),[22] shuning uchun boshqa brauzer sotuvchilari JIT uchun dvigatellarini kapital ta'mirlashlari kerak edi.[23]

2008 yil iyulda bu xilma-xil partiyalar konferentsiya uchun yig'ildilar Oslo. Natijada, 2009 yil boshida barcha tegishli ishlarni birlashtirish va tilni oldinga siljitish to'g'risida kelishuvga erishildi. Natijada 2009 yil dekabrda chiqarilgan ECMAScript 5 standarti paydo bo'ldi.

Voyaga etish

Til bo'yicha katta ishlar bir necha yil davom etdi, natijada nashr etilgan nashr bilan rasmiylashtirilgan rasmiy qo'shimchalar va aniqliklar to'plami bilan yakunlandi. ECMAScript 2015 yilda 6 ta.[24]

2016 yildan 2019 yilgacha ECMAScript standartining har yili yangi versiyasi nashr etildi, ammo o'zgarishlar ko'lami 5 yoki 6 nashrlariga qaraganda ancha kichik edi. Shunday qilib, endi JavaScript-ni etuk til deb hisoblash mumkin, bu asosan o'rnashib qolgan.

Hozirgi JavaScript ekotizimi juda ko'p kutubxonalar va ramkalar, o'rnatilgan dasturlash amaliyoti va JavaScript-ni veb-brauzerlardan tashqarida ko'paytirish. Bundan tashqari, ko'tarilish bilan bitta sahifali dasturlar va boshqa JavaScript-ni talab qiladigan veb-saytlar, bir qator transplantatorlar rivojlanish jarayoniga yordam berish uchun yaratilgan.[25]

Savdo belgisi

"JavaScript" bu a savdo belgisi ning Oracle korporatsiyasi Qo'shma Shtatlarda.[26] U Netscape Communications va boshqa tomonlar tomonidan ixtiro qilingan va amalga oshirilgan texnologiyalar uchun litsenziyaga muvofiq foydalaniladi.[27]

Veb-sayt mijozlaridan foydalanish

JavaScript dominant hisoblanadi mijoz tomoni 95% bilan Internetning skript tili veb-saytlar undan shu maqsadda foydalanish.[9] Skriptlar ichiga o'rnatilgan yoki kiritilgan HTML hujjatlar va DOM bilan o'zaro aloqada bo'lish. Barcha asosiy veb-brauzerlar ichki o'rnatilgan JavaScript mexanizmi foydalanuvchi qurilmasidagi kodni bajaradigan.

Stsenariy xulq-atvorga misollar

  • Sahifani qayta yuklamasdan yangi sahifa tarkibini yuklash. Masalan, ijtimoiy tarmoqlar veb-saytlar foydalanuvchilar sahifani tark etmasdan yangi xabarlarni yuborishlari uchun Ajax-dan foydalanadilar.
  • Sahifa elementlarini animatsiya qilish, masalan, ularni o'chirish va o'chirish, o'lchamlarini o'zgartirish va ularni siljitish.
  • O'yinlar va video kabi interaktiv tarkib.
  • Tasdiqlanmoqda a qiymatlari veb-shakl serverga yuborilishidan oldin ularning maqbul ekanligiga ishonch hosil qilish.
  • Uchun foydalanuvchining xatti-harakatlari to'g'risida ma'lumot uzatish tahlil, reklamani kuzatish va shaxsiylashtirish.

Kutubxonalar va ramkalar

Veb-saytlarning aksariyati uchinchi tomondan foydalanadi JavaScript kutubxonasi yoki veb-dastur doirasi ularning mijoz tomonidagi sahifa skriptlarining bir qismi sifatida.[28]

jQuery veb-saytlarning 70% dan ortig'i foydalanadigan eng mashhur kutubxona.[28]

The Burchakli ramka tomonidan yaratilgan Google veb-xizmatlari uchun; u hozir ochiq manba va boshqa veb-saytlar tomonidan ishlatilgan. Xuddi shunday, Facebook yaratgan Javob bering veb-sayti uchun ramka va keyinchalik uni ochiq manba sifatida chiqardi; boshqa saytlar, shu jumladan Twitter, endi undan foydalaning. Kabi boshqa ochiq manbali ramkalar mavjud Backbone.js va Vue.js.[28]

Bundan farqli o'laroq, "Vanilla JS" atamasi hech qanday kutubxona yoki ramkalarni ishlatmaydigan veb-saytlar uchun ishlab chiqarilgan, buning o'rniga to'liq JavaScript-ni ishlashiga tayanadi.[29]

Boshqa foydalanish

JavaScript-ni ishlatish undan kengaydi veb-brauzer ildizlar. JavaScript dvigatellari endi ikkala uchun ham boshqa dasturiy ta'minot tizimlariga kiritilgan server tomoni veb-saytlarni joylashtirish va brauzerdan tashqari ilovalar.

Server tomonidan JavaScript-ni ishlatishni rag'batlantirish uchun dastlabki urinishlar bo'lgan Netscape Enterprise Server va Microsoft "s Internet-axborot xizmatlari,[30][31] ammo ular kichik joylar edi.[32] Server tomonida foydalanish oxir-oqibat 2000-yillarning oxirida, yaratilishi bilan o'sishni boshladi Node.js va boshqa yondashuvlar.[32]

Elektron, Kordova va boshqalar dasturiy ta'minot asoslari JavaScript-da amalga oshirilgan xatti-harakatlar bilan ko'plab dasturlarni yaratish uchun ishlatilgan. Boshqa brauzerlardan tashqari dasturlarga quyidagilar kiradi Adobe Acrobat skriptlarni qo'llab-quvvatlash PDF hujjatlar[33] va GNOME Shell JavaScript-da yozilgan kengaytmalar.[34]

Yaqinda JavaScript ba'zi birlarida paydo bo'la boshladi o'rnatilgan tizimlar, odatda Node.js.-dan foydalanish orqali.[35][36][37]

Xususiyatlari

Quyidagi xususiyatlar, agar aniq boshqacha ko'rsatilmagan bo'lsa, barcha mos keladigan ECMAScript dasturlari uchun umumiydir.

Imperativ va tuzilgan

JavaScript-ning ko'p qismi qo'llab-quvvatlanadi tizimli dasturlash sintaksis C (masalan, agar bayonotlar, esa ilmoqlar, almashtirish bayonotlar, bajaring ko'chadan va boshqalar). Qisman istisnolardan biri qamrov doirasi: JavaScript-da dastlab faqat bor edi funktsiyalarni qamrab olish bilan var. ECMAScript 2015 kalit so'zlarni qo'shdi ruxsat bering va konst bloklarni qamrab olish uchun, ya'ni JavaScript-da endi funktsiya ham, blok miqyosi ham mavjud. C singari, JavaScript ham ularni ajratib turadi iboralar va bayonotlar. S dan sintaktik farqning biri avtomatik vergul kiritish, bu odatda bayonotlarni tugatadigan nuqta-vergullarni chiqarib tashlashga imkon beradi.[38]

Zaif terildi

JavaScript bu zaif terilgan, ya'ni ishlatilgan operatsiyaga qarab ma'lum turlar bevosita berkitilishini anglatadi.[39]

  • Ikkilik + operator ikkala operandni ham satrga chiqaradi, agar ikkala operand ham raqam bo'lmasa. Buning sababi, qo'shish operatori birlashtirish operatori vazifasini bajaradi
  • Ikkilik - operator har doim ikkala operandni raqamga chiqaradi
  • Ikkala yagona operatorlar (+, -) har doim operandni raqamga tashlaydi

Qadriyatlar quyidagi qatorlarga o'tkaziladi:[39]

  • Iplar mavjud bo'lib qoladi
  • Raqamlar ularning simli tasviriga o'tkaziladi
  • Massivlar elementlarini satrlarga tashlaydi, so'ngra ular vergul bilan qo'shiladi (,)
  • Boshqa ob'ektlar mag'lubiyatga aylantiriladi [object Object] qayerda Ob'ekt - bu ob'ektning konstruktorining nomi

Qadriyatlar satrlarga tashlab, so'ngra satrlarni raqamlarga tashlash orqali raqamlarga tashlanadi. Ushbu jarayonlarni aniqlash orqali o'zgartirish mumkin toString va qiymatiOf funktsiyalari prototip navbati bilan qator va raqamlarni quyish uchun.

JavaScript ushbu konversiyalarni amalga oshirishi uchun tanqid oldi, chunki qoidalarning murakkabligi nomuvofiqlikda bo'lishi mumkin.[40][39] Masalan, qatorga son qo'shganda, son birikma hosil qilishdan oldin qatorga tashlanadi, ammo qatordan sonni ayirganda, ayirishdan oldin qator raqamga tashlanadi.

JavaScript-da tanqidga uchragan bir qator savollar mavjud:[39]
chap operandoperatoro'ng operandnatija
[] (bo'sh qator)+[] (bo'sh qator)"" (bo'sh satr)
[] (bo'sh qator)+{} (bo'sh narsa)"[object Object]" (mag'lubiyat)
yolg'on (mantiqiy)+[] (bo'sh qator)"yolg'on" (mag'lubiyat)
"123"(mag'lubiyat)+1 (raqam)"1231" (mag'lubiyat)
"123" (mag'lubiyat)-1 (raqam)122 (raqam)

Ko'pincha eslatib o'tiladi {} + [] ni natijasida 0 (raqam). Bu noto'g'ri {} bo'sh ob'ekt o'rniga bo'sh kod bloki sifatida talqin qilinadi va bo'sh massiv qolgan unary tomonidan raqamga tashlanadi + operator. Agar siz ifodani qavs ichiga o'ralgan bo'lsangiz ({} + []) jingalak qavslar bo'sh narsa sifatida talqin qilinadi va ifoda natijasi "[object Object]" kutilganidek.[39]

Dinamik

Yozish
JavaScript bu dinamik ravishda terilgan boshqalar kabi stsenariy tillari. A turi bilan bog'langan qiymat ifoda o'rniga. Masalan, a o'zgaruvchan dastlab raqam bilan bog'langan bo'lishi mumkin mag'lubiyat.[41] JavaScript-da ob'ektlar turini sinashning turli usullari, shu jumladan o'rdak terish.[42]
Ish vaqtini baholash
JavaScript-ga an baholash ish vaqtida satr sifatida berilgan so'zlarni bajarishi mumkin bo'lgan funktsiya.

Ob'ektga yo'naltirish (prototipga asoslangan)

JavaScript-dagi prototip meros tomonidan tavsiflanadi Duglas Crockford kabi:

Siz protetib ob'ektlar yaratasiz, so'ngra… yangi nusxalar yaratasiz. Ob'ektlar JavaScript-da o'zgaruvchan, shuning uchun biz ularga yangi maydonlarni va usullarni berib, yangi nusxalarni ko'paytira olamiz. Keyinchalik ular yangi ob'ektlar uchun prototip sifatida harakat qilishlari mumkin. Bizga juda ko'p o'xshash ob'ektlarni yaratish uchun sinflar kerak emas ... Ob'ektlar ob'ektlardan meros bo'lib olinadi. Undan ko'ra ko'proq ob'ektga yo'naltirilgan nima bo'lishi mumkin?[43]

JavaScript-da, an ob'ekt bu assotsiativ qator, prototip bilan to'ldirilgan (pastga qarang); har bir mag'lubiyat tugmasi ob'ekt nomini beradi mulk va bunday nomni ko'rsatishning ikkita sintaktik usuli mavjud: nuqta belgisi (obj.x = 10) va qavs yozuvlari (obj ['x'] = 10). Mulk ish vaqtida qo'shilishi, tiklanishi yoki o'chirilishi mumkin. Ob'ektning aksariyat xususiyatlarini (va ob'ektning prototip meros zanjiriga tegishli har qanday xususiyatni) uchun ... ichida pastadir

Prototiplar
JavaScript-ni ishlatadi prototiplar bu erda ko'plab boshqa ob'ektga yo'naltirilgan tillar foydalanadi sinflar uchun meros olish.[44] JavaScript-da prototiplar bilan ko'plab sinfga asoslangan xususiyatlarni taqlid qilish mumkin.[45]
Ob'ektni quruvchi sifatida funktsiyalar
Funksiyalar odatdagi roli bilan birga ob'ekt konstruktorlari kabi ikki baravar ko'payadi. Funktsiya chaqiruvining prefiksi yangi konstruktordan xususiyatlar va usullarni meros qilib olgan prototipning nusxasini yaratadi ( Ob'ekt prototip).[46] ECMAScript 5 quyidagilarni taklif qiladi Ob'ekt yaratish avtomatik ravishda meros olmasdan nusxani aniq yaratishga imkon beradigan usul Ob'ekt prototip (eski muhitlar prototipni tayinlashi mumkin bekor).[47] Konstruktor prototip xususiyat yangi ob'ektning ichki prototipi uchun foydalaniladigan ob'ektni aniqlaydi. Konstruktor sifatida ishlatiladigan funktsiya prototipini o'zgartirish orqali yangi usullarni qo'shish mumkin. Kabi JavaScript-ning o'rnatilgan konstruktorlari Array yoki Ob'ekt, shuningdek o'zgartirilishi mumkin bo'lgan prototiplarga ega. O'zgartirish mumkin bo'lsa ham Ob'ekt prototipi, odatda yomon amaliyot deb hisoblanadi, chunki JavaScript-dagi aksariyat ob'ektlar usullari va xususiyatlarini meros qilib oladi Ob'ekt prototip va ular prototipning o'zgartirilishini kutishmaydi.[48]
Vazifalar usul sifatida
Ko'p ob'ektga yo'naltirilgan tillardan farqli o'laroq, funktsiya ta'rifi va a o'rtasida farq yo'q usul ta'rifi. Aksincha, farq funktsiyani chaqirish paytida yuz beradi; funktsiya ob'ekt usuli sifatida chaqirilganda, funktsiya mahalliy bu kalit so'z ushbu chaqiruv uchun ushbu ob'ektga bog'langan.

Funktsional

A funktsiya bu birinchi sinf; funktsiya ob'ekt deb hisoblanadi. Shunday qilib, funktsiya kabi xususiyatlarga va usullarga ega bo'lishi mumkin .call () va .bind ().[49] A ichki funktsiya - bu boshqa funktsiya doirasida aniqlangan funktsiya. Har safar tashqi funktsiya chaqirilganda yaratiladi. Bundan tashqari, har bir ichki funktsiya a hosil qiladi leksik yopilish: The leksik ko'lam tashqi funktsiyani (har qanday doimiy, mahalliy o'zgaruvchini yoki argument qiymatini o'z ichiga olgan holda) tashqi funktsiya bajarilgandan keyin ham har bir ichki funktsiya ob'ekti ichki holatining bir qismiga aylanadi.[50] JavaScript-ni ham qo'llab-quvvatlaydi noma'lum funktsiyalar.

Delegativ

JavaScript yashirin va aniq qo'llab-quvvatlaydi delegatsiya.

Vazifalar rol sifatida (Xususiyatlar va aralashmalar)
JavaScript turli xil funktsiyalarga asoslangan dasturlarni tabiiy ravishda qo'llab-quvvatlaydi Rol[51] kabi naqshlar Xususiyatlari[52][53] va Aralashmalar.[54] Bunday funktsiya qo'shimcha xatti-harakatni kamida bilan bog'langan bitta usul bilan belgilaydi bu uning ichida kalit so'z funktsiya tanasi. Keyin roli aniq berilishi kerak qo'ng'iroq qiling yoki murojaat qilish protetib zanjiri orqali taqsimlanmagan qo'shimcha xatti-harakatlarga ega bo'lishi kerak bo'lgan narsalarga.
Ob'ekt tarkibi va merosxo'rlik
Funktsiyaga asoslangan aniq delegatsiya o'z ichiga oladi tarkibi JavaScript-da, prototip zanjiri yurish paytida, masalan, ob'ektga tegishli bo'lishi mumkin bo'lgan, lekin to'g'ridan-to'g'ri ob'ektga tegishli bo'lmagan usulni topish uchun yashirin delegatsiya allaqachon sodir bo'ladi. Usul topilgandan so'ng, ushbu ob'ekt kontekstida chaqiriladi. Shunday qilib meros olish JavaScript-da konstruktor funktsiyalarining prototip xususiyatiga bog'liq bo'lgan delegatsiya avtomatizmi bilan qoplangan.

Turli xil

Ish vaqti muhiti
JavaScript odatda ish vaqti muhitiga tayanadi (masalan, a veb-brauzer ) skriptlar atrof-muhit bilan o'zaro ta'sir qilishi mumkin bo'lgan ob'ektlar va usullarni ta'minlash (masalan, veb-sahifa) DOM ). Ushbu muhitlar bittatishli. Shuningdek, JavaScript-ni skriptlarni kiritish / import qilish imkoniyatini ta'minlash uchun ish vaqti muhitiga tayanadi (masalan, HTML <script> elementlar). Bu o'z-o'zidan til xususiyati emas, lekin aksariyat JavaScript-larda keng tarqalgan. JavaScript jarayonlari xabarlar dan navbat birma-bir. JavaScript-ga qo'ng'iroqlar funktsiya har bir yangi xabar bilan bog'lanib, a chaqiruv to'plami funktsiyasi bilan ramka dalillar va mahalliy o'zgaruvchilar. Qo'ng'iroqlar to'plami funktsiya ehtiyojlari asosida qisqaradi va o'sadi. Funktsiya tugagandan so'ng qo'ng'iroqlar to'plami bo'sh bo'lsa, JavaScript navbatdagi navbatdagi xabarga o'tadi. Bunga voqea halqasi, "tugatishga yugurish" deb ta'riflanadi, chunki har bir xabar keyingi xabar ko'rib chiqilishidan oldin to'liq qayta ishlanadi. Biroq, til paralellik modeli voqea tsiklini quyidagicha tavsiflaydi blokirovka qilmaydigan: dastur kirish / chiqish yordamida amalga oshiriladi voqealar va qayta qo'ng'iroq qilish funktsiyalari. Bu shuni anglatadiki, masalan, ma'lumotlar bazasi so'rovi ma'lumotni qaytarishini kutish paytida JavaScript sichqonchani bosishi mumkin.[55]
Turli xil funktsiyalar
Belgilanmagan miqdordagi parametrlarni funktsiyaga o'tkazish mumkin. Funktsiya orqali ularga kirish mumkin rasmiy parametrlar va shuningdek, mahalliy orqali dalillar ob'ekt. Turli xil funktsiyalar yordamida ham yaratilishi mumkin bog'lash usul.
Array va ob'ektiv literallar
Ko'pgina skript tillari, massivlar va ob'ektlar singari (assotsiativ massivlar boshqa tillarda) har biri qisqa yorliqli sintaksis yordamida yaratilishi mumkin. Aslida, bular adabiyotshunoslar asosini tashkil etadi JSON ma'lumotlar formati.
Doimiy iboralar
JavaScript-ni ham qo'llab-quvvatlaydi doimiy iboralar ga o'xshash tarzda Perl, bu matnni manipulyatsiya qilish uchun ixcham va kuchli sintaksisni taqdim etadi, bu o'rnatilgan satr funktsiyalariga qaraganda ancha murakkab.[56]
Va'dalar
JavaScript shuningdek, asenkron operatsiyalarni boshqarish usuli bo'lgan va'dalarni qo'llab-quvvatlaydi. O'rnatilgan Promise ob'ekti mavjud bo'lib, u va'dalarni ko'rib chiqish uchun juda ko'p funktsiyalarga ruxsat beradi va ularni qanday hal qilish kerakligini belgilaydi. Bu ishlov beruvchilarni asenkron harakatning yakuniy muvaffaqiyati yoki muvaffaqiyatsizlik sababi bilan bog'lashga imkon beradi. Bu asenkron usullar sinxron usullar kabi qiymatlarni qaytarishga imkon beradi: zudlik bilan yakuniy qiymatni qaytarish o'rniga, asenkron usul kelajakda biron bir nuqtada qiymatni etkazib berishni va'da qiladi. Yaqinda JavaScript spetsifikatsiyasida kombinator usullar joriy etildi, bu ishlab chiquvchilarga bir nechta JavaScript va'dalarini birlashtirishga va turli xil stsenariylar asosida operatsiyalarni bajarishga imkon beradi. Kiritilgan usullar: Promise.race, Promise.all, Promise.allSettled va Promise.any.

Sotuvchiga tegishli kengaytmalar

Tarixiy jihatdan, ba'zilari JavaScript dvigatellari ushbu nostandart xususiyatlarni qo'llab-quvvatladi:

  • shartli ushlamoq bandlar (Java kabi)
  • massivni tushunish va generator ifodalari (masalan, Python)
  • qisqacha funktsiya ifodalari (funktsiya (args) expr; ushbu eksperimental sintaksis o'q vazifalarini oldindan bajargan)
  • XML uchun ECMAScript (E4X), ECMAScript-ga mahalliy XML yordamini qo'shadigan kengaytma (21-versiyadan beri Firefox-da qo'llab-quvvatlanmaydi)[57])

Sintaksis

Oddiy misollar

O'zgaruvchilar JavaScript-ni quyidagilar yordamida aniqlash mumkin var,[58] ruxsat bering[59] yoki konst[60] kalit so'zlar.

// "x`" nomli funktsiyaga asoslangan o'zgaruvchini e'lon qiladi va bilvosita tayinlaydi// unga "aniqlanmagan" maxsus qiymat. Qiymatsiz o'zgaruvchilar avtomatik ravishda// belgilanmagan deb belgilandi.var x;// O'zgaruvchilar qo'lda "aniqlanmagan" ga o'rnatilishi mumkinvar x2 = aniqlanmagan;// "y`" nomli blokirovka qilingan o'zgaruvchini e'lon qiladi va uni aniq qilib o'rnatadi// "aniqlanmagan". `Let` kalit so'zi ECMAScript 2015-da kiritilgan.ruxsat bering y;// "z`" nomli blokirovka qilingan, qayta tayinlanmaydigan o'zgaruvchini e'lon qiladi va o'rnatadi// string literal. "Const" kalit so'zi ECMAScript 2015 da kiritilgan,// va aniq tayinlangan bo'lishi kerak.// `const` kalit so'zi doimiy degan ma'noni anglatadi, shuning uchun o'zgaruvchini qayta tayinlab bo'lmaydi// qiymati "doimiy" bo'lgani uchun.konst z = "bu qiymatni qayta tayinlash mumkin emas!";// `myNumber` nomli o'zgaruvchini e'lon qiladi va literal raqamni beradi (qiymat// `2`) unga.ruxsat bering myNumber = 2;// "myNumber" -ni qayta tayinlaydi, uni so'zma-so'z harflar qatoriga o'rnatadi ("foo" `qiymati).// JavaScript dinamik ravishda terilgan tildir, shuning uchun bu qonuniydir.myNumber = "foo";

Ga e'tibor bering Izohlar yuqoridagi misolda, ularning hammasidan oldin ikkitasi bo'lgan oldinga siljishlar.

O'rnatilgan narsa yo'q Kirish / chiqish JavaScript-dagi funksionallik; ish vaqti muhiti buni ta'minlaydi. ECMAScript spetsifikatsiyasi 5.1 nashrida quyidagilar qayd etilgan:[61]

Darhaqiqat, ushbu spetsifikatsiyada tashqi ma'lumotlarni kiritish yoki hisoblash natijalari bo'yicha qoidalar mavjud emas.

Biroq, ish vaqti muhitlarining aksariyati a konsol ob'ekt[62] chiqishni chop etish uchun ishlatilishi mumkin. Mana bu minimalist Salom dunyo dasturi JavaScript-da:

konsol.jurnal("Salom Dunyo!");

Oddiy rekursiv funktsiyasi:

funktsiya faktorial(n) {    agar (n === 0)        qaytish 1; // 0! = 1    qaytish n * faktorial(n - 1);}faktorial(3); // qaytaradi 6

An noma'lum funktsiya (yoki lambda):

funktsiya hisoblagich() {    ruxsat bering hisoblash = 0;    qaytish funktsiya() {        qaytish ++hisoblash;    };}ruxsat bering yopilish = hisoblagich();yopilish(); // qaytadi 1yopilish(); // qaytaradi 2yopilish(); // qaytaradi 3

Ushbu misol JavaScript-da, funktsiyalarni yopish ularning mahalliy bo'lmagan o'zgaruvchilarini mos yozuvlar orqali olish.

Ok funktsiyalari birinchi marta kiritilgan 6-nashr - ECMAScript 2015 . Ular JavaScript-da yozish funktsiyalari uchun sintaksisni qisqartiradilar. Ok funktsiyalari tabiatan noma'lum; Yaratgandan keyin ularni chaqirish uchun ularga murojaat qilish uchun o'zgaruvchiga ehtiyoj bor.

Ok funktsiyasining misoli:

// Strelka funktsiyalari `function` kalit so'zini tashlab qo'yamiz.// Bu erda `long_example` noma'lum funktsiya qiymatiga ishora qiladi.konst uzun_misol = (kirish1, kirish2) => {    konsol.jurnal("Salom Dunyo!");    konst chiqish = kirish1 + kirish2;    qaytish chiqish;};// Qavslar bo'lmasa, o'q funktsiyasi shunchaki ifodani qaytaradi// Demak, bu erda (input1 + input2)konst short_example = (kirish1, kirish2) => kirish1 + kirish2;uzun_misol(2, 3); // "Salom, dunyo!" va 5 ni qaytaradishort_example(2, 5);  // qaytaradi 7// Agar o'q funktsiyasi faqat bitta parametrga ega bo'lsa, qavslarni olib tashlash mumkin.konst no_parentheses = kiritish => kiritish + 2;no_parentheses(3); // qaytaradi 5

JavaScript-da, ob'ektlar funktsiyalar bilan bir xil tarzda yaratilgan; bu a sifatida tanilgan funktsiya ob'ekti.

Ob'ekt misoli:

funktsiya To'p(r) {    bu.radius = r; // "r" argumenti to'p ob'ekti uchun mahalliy hisoblanadi    bu.maydon = Matematika.PI * (r ** 2); // qavslar aniqlashtirishdan boshqa hech narsa qilmaydi        // ob'ektlar funktsiyalarni o'z ichiga olishi mumkin ("usul")    bu.ko'rsatish = funktsiya() {        DrawCircle(bu.radius); // boshqa funktsiyaga murojaat qiladi (aylana chizadigan)    };}ruxsat bering myBall = yangi To'p(5); // radiusi 5 ga teng bo'lgan shar ob'ektining yangi nusxasini yaratadimyBall.radius++; // ob'ekt xususiyatlari odatda tashqi tomondan o'zgartirilishi mumkinmyBall.ko'rsatish(); // meros bo'lib o'tgan "ko'rsatish" funktsiyasidan foydalanish

Turli xil funktsiya namoyish (dalillar maxsus o'zgaruvchan ):[63]

funktsiya sum() {    ruxsat bering x = 0;    uchun (ruxsat bering men = 0; men < dalillar.uzunlik; ++men)        x += dalillar[men];    qaytish x;}sum(1, 2); // qaytaradi 3sum(1, 2, 3); // qaytaradi 6

Darhol chaqiriladigan funktsiya ifodalari ko'pincha yopilishlarni yaratish uchun ishlatiladi. Yopish xususiyatlar va usullarni nom maydonida to'plash va ulardan ba'zilarini shaxsiy qilish imkonini beradi:

ruxsat bering hisoblagich = (funktsiya() {    ruxsat bering men = 0; // xususiy mulk    qaytish {   // ommaviy usullar        olish: funktsiya() {            ogohlantirish(men);        },        o'rnatilgan: funktsiya(qiymat) {            men = qiymat;        },        o'sish: funktsiya() {            ogohlantirish(++men);        }    };})(); // modulhisoblagich.olish();      // 0 ni ko'rsatadihisoblagich.o'rnatilgan(6);hisoblagich.o'sish(); // 7 ni ko'rsatadihisoblagich.o'sish(); // 8 ni ko'rsatadi

JavaScript-da modullarni eksport qilish va import qilish[64]

Eksport misoli:

/ * mymodule.js * /// Ushbu funktsiya eksport qilinmagani uchun shaxsiy bo'lib qoladiruxsat bering sum = (a, b) => {    qaytish a + b;}// O'zgaruvchilarni eksport qilisheksport ruxsat bering ism = "Elis";eksport ruxsat bering yoshi = 23;// Nomlangan funktsiyalarni eksport qilisheksport funktsiya qo'shish(num1, num2) {    qaytish num1 + num2;}// Eksport klassieksport sinf Ko'paytirish {    konstruktor(num1, num2) {        bu.num1 = num1;        bu.num2 = num2;    }    qo'shish() {        qaytish sum(bu.num1, bu.num2);    }}

Import misoli:

// Bitta xususiyatni import qilishImport { qo'shish } dan './mymodule.js';konsol.jurnal(qo'shish(1, 2)); // 3// Bir nechta xususiyatlarni import qilishImport { ism, yoshi } dan './mymodule.js';konsol.jurnal(ism, yoshi);//> "Elis", 23 yosh// Barcha xususiyatlarni moduldan import qilishImport * dan './module.js'konsol.jurnal(ism, yoshi);//> "Elis", 23 yoshkonsol.jurnal(qo'shish(1,2));//> 3

Keyinchalik rivojlangan misol

Ushbu namunaviy kod turli xil JavaScript xususiyatlarini aks ettiradi.

/ * Ikkala raqamning eng past umumiy ko'paytmasini (LCM) topadi * /funktsiya LCMKalkulyator(x, y) { // konstruktor funktsiyasi    ruxsat bering checkInt = funktsiya(x) { // ichki funktsiya        agar (x % 1 !== 0)            otish yangi Xato turi(x + "butun son emas"); // var a = mouseX        qaytish x;    };        bu.a = checkInt(x)    // nuqta-vergul ^^^^ ixtiyoriy, yangi satr etarli    bu.b = checkInt(y);}// Konstruktor tomonidan yaratilgan ob'ekt namunalarining prototipi bu// bu konstruktorning "prototipi" xususiyati.LCMKalkulyator.prototip = { // ob'ekt to'g'ridan-to'g'ri    konstruktor: LCMKalkulyator, // prototipni tayinlashda konstruktor xususiyatini mos ravishda o'rnating    gcd: funktsiya() { // eng katta umumiy bo'luvchini hisoblaydigan usul        // Evklid algoritmi:        ruxsat bering a = Matematika.abs(bu.a), b = Matematika.abs(bu.b), t;        agar (a < b) {            // o'zgaruvchilarni almashtirish            // t = b; b = a; a = t;            [a, b] = [b, a]; // yo'q qilish topshirig'i yordamida almashtirish (ES6)        }        esa (b !== 0) {            t = b;            b = a % b;            a = t;        }        // Faqat bir marta GCDni hisoblash kerak, shuning uchun ushbu usulni "qayta aniqlang".        // (Aslida qayta aniqlash emas - bu nusxaning o'zida aniqlangan,        // shunda this.gcd LCMCalculator.prototype.gcd o'rniga ushbu "qayta ta'rif" ga murojaat qiladi.        // LCMCalculator ob'ekti a'zolari "a" va / yoki "b" keyinchalik o'zgartirilsa, bu noto'g'ri natijaga olib kelishini unutmang.)        // Shuningdek, 'gcd' === "gcd", bu ['gcd'] === this.gcd        bu["gcd"] = funktsiya() {            qaytish a;        };        qaytish a;    },    // Ob'ekt xususiyatining nomlari ikki (") yoki bitta (') tirnoq bilan ajratilgan qatorlar bilan belgilanishi mumkin.    lcm: funktsiya() {        // O'zgaruvchan nomlar ob'ekt xususiyatlari bilan to'qnashmaydi, masalan, | lcm | emas | this.lcm |.        // | this.a * this.b | dan foydalanmaslik FP aniqlik muammolarini oldini olish uchun        ruxsat bering lcm = bu.a / bu.gcd() * bu.b;                // Faqat bir marta lcm ni hisoblash kerak, shuning uchun ushbu usulni "qayta aniqlang".        bu.lcm = funktsiya() {            qaytish lcm;        };        qaytish lcm;    },    toString: funktsiya() {        qaytish "LCMCalculator: a =" + bu.a + ", b =" + bu.b;    }};// Umumiy chiqish funktsiyasini aniqlang; ushbu dastur faqat veb-brauzerlar uchun ishlaydifunktsiya chiqish(x) {    hujjat.tanasi.appendChild(hujjat.createTextNode(x));    hujjat.tanasi.appendChild(hujjat.createElement("br"));}// Izoh: Array () va forEach () xaritalari JavaScript 1.6 da aniqlangan.// Ular bu erda JavaScript-ning o'ziga xos funktsional xususiyatini namoyish qilish uchun ishlatiladi.[    [25, 55],    [21, 56],    [22, 58],    [28, 56]].xarita(funktsiya(juftlik) { // qator literal + xaritalash funktsiyasi    qaytish yangi LCMKalkulyator(juftlik[0], juftlik[1]);}).saralash((a, b) => a.lcm() - b.lcm()) // ushbu qiyosiy funktsiya bilan saralash; => "strelka funktsiyasi" deb nomlangan funktsiyalarning stenografiya shakli    .har biriga(printResult);funktsiya printResult(obj) {    chiqish(obj + ", gcd =" + obj.gcd() + ", lcm =" + obj.lcm());}

Quyidagi chiqish brauzer oynasida ko'rsatilishi kerak.

LCMCalculator: a = 28, b = 56, gcd = 28, lcm = 56LCMCalculator: a = 21, b = 56, gcd = 7, lcm = 168LCMCalculator: a = 25, b = 55, gcd = 5, lcm = 275LCMCalculator: a = 22, b = 58, gcd = 2, lcm = 638

Xavfsizlik

JavaScript va DOM zararli mualliflarga Internet orqali mijoz kompyuterida ishlash uchun skriptlarni etkazib berish imkoniyatini ta'minlash. Brauzer mualliflari ushbu cheklovni ikkita cheklov yordamida minimallashtiradi. Birinchidan, skriptlar qum qutisi bunda ular fayllarni yaratish kabi umumiy dasturlash vazifalarini emas, balki faqat veb-ga tegishli amallarni bajara oladilar. Ikkinchidan, skriptlar bir kelib chiqishi siyosati: bitta veb-sayt skriptlari boshqa saytga yuborilgan foydalanuvchi nomlari, parollar yoki cookie-fayllar kabi ma'lumotlarga kirish huquqiga ega emas. Javascript bilan bog'liq xavfsizlik xatolarining aksariyati bir xil kelib chiqish siyosati yoki qum maydonini buzishdir.

Umumiy JavaScript-ADsafe, Secure ECMAScript (SES) kichik to'plamlari mavjud, ular ko'proq xavfsizlikni ta'minlaydi, ayniqsa uchinchi shaxslar tomonidan yaratilgan kodlarda (masalan, reklama kabi).[65][66] Kaja uchinchi tomon JavaScript va HTML-ni xavfsiz joylashtirish va ajratish uchun yana bir loyihadir.

Tarkib xavfsizligi siyosati faqat buni ta'minlashning asosiy mo'ljallangan usuli hisoblanadi ishonchli kod veb-sahifada bajariladi.

Saytlararo zaifliklar

Javascript bilan bog'liq keng tarqalgan xavfsizlik muammosi saytlararo skript (XSS), buzilishi bir kelib chiqishi siyosati. XSS zaifliklari, tajovuzkor maqsadli veb-saytni, masalan, onlayn-bank veb-saytini, jabrlanuvchiga taqdim etilgan veb-sahifaga zararli skriptni kiritishga qodir bo'lganda yuzaga keladi. Ushbu misolda keltirilgan skript jabrlanuvchining imtiyozlari bilan yashirin ma'lumotlarni oshkor qilishi yoki jabrlanuvchining ruxsatisiz pul o'tkazmalari bilan bank dasturiga kirishi mumkin. XSS zaifliklarini hal qilish ulardan foydalanishdir HTML qochmoqda har doim ishonchsiz ma'lumotlarni ko'rsatganda.

Ba'zi brauzerlar qisman himoyani o'z ichiga oladi aks ettirilgan XSS hujumlari, unda tajovuzkor zararli skriptni o'z ichiga olgan URL manzilini taqdim etadi. Ammo, hatto ushbu brauzerlarning foydalanuvchilari ham ma'lumotlar bazasida zararli kod saqlanadigan boshqa XSS hujumlariga qarshi himoyasiz. Faqatgina server tomonidagi veb-dasturlarning to'g'ri dizayni XSS-ning oldini olishga qodir.

Brauzer mualliflari tomonidan amalga oshirilgan xatolar tufayli XSS zaifliklari ham paydo bo'lishi mumkin.[67]

Saytlararo yana bir zaiflik saytlararo so'rovlarni qalbakilashtirish (CSRF). CSRF-da, tajovuzkorning saytidagi kod jabrlanuvchining brauzerini aldab, foydalanuvchi maqsadli saytga kirishni istamagan (masalan, bankda pul o'tkazish kabi) harakatlarni amalga oshirmoqda. Maqsadli saytlar so'rovni autentifikatsiya qilish uchun faqat cookie-fayllarga tayanadigan bo'lsa, tajovuzkor saytidagi koddan kelib chiqadigan so'rovlar boshlang'ich foydalanuvchining bir xil haqiqiy kirish ma'lumotlariga ega bo'lishi mumkin. Umuman olganda, CSRF-ning echimi doimiy ta'sir ko'rsatishi mumkin bo'lgan har qanday so'rovni tasdiqlash uchun faqat cookie-fayllarda emas, balki maxfiy shakl maydonida autentifikatsiya qiymatini talab qilishdir. HTTP Referrer sarlavhasini tekshirish ham yordam berishi mumkin.

"JavaScript-ni olib qochish" bu CSRF hujumining bir turi bo'lib, unda a <script> tajovuzkor saytidagi yorliq jabrlanuvchining saytidagi shaxsiy ma'lumotlarni qaytaradigan sahifadan foydalanadi JSON yoki JavaScript. Mumkin echimlarga quyidagilar kiradi:

  • da autentifikatsiya belgisini talab qiladi POST va OLING shaxsiy ma'lumotni qaytaradigan har qanday javob uchun parametrlar.

Mijozga noto'g'ri ishonch

Mijoz-server dasturlarini ishlab chiquvchilari ishonchsiz mijozlar tajovuzkorlar nazorati ostida bo'lishi mumkinligini tan olishlari kerak. Ilova muallifi ularning JavaScript-kodlari maqsadga muvofiq (yoki umuman) ishlashini taxmin qila olmaydi, chunki belgilangan dushman tomonidan kodga kiritilgan har qanday sirni olish mumkin. Ba'zi natijalar:

  • Veb-sayt mualliflari JavaScript-ni qanday ishlashini mukammal yashira olmaydilar, chunki xomashyo manba kodi mijozga yuborilishi kerak. Kod bo'lishi mumkin xiralashgan, ammo obfuskatsiya teskari tarzda tuzilishi mumkin.
  • JavaScript-ni tasdiqlash faqatgina foydalanuvchilar uchun qulaylikni ta'minlaydi, xavfsizlikni emas. Agar sayt foydalanuvchi uning xizmat ko'rsatish shartlariga rozi bo'lganligini tasdiqlasa yoki yaroqsiz belgilarni faqat raqamlar bo'lishi kerak bo'lgan maydonlardan filtrlasa, u buni nafaqat mijoz, balki serverda ham bajarishi kerak.
  • Skriptlarni tanlab o'chirib qo'yish mumkin, shuning uchun rasmni saqlash uchun sichqonchaning o'ng tugmachasini bosish kabi operatsiyalarni oldini olish uchun JavaScript-ga ishonib bo'lmaydi.[68]
  • Parollar kabi maxfiy ma'lumotlarni, masalan, tajovuzkor tomonidan chiqarilishi mumkin bo'lgan JavaScript-ga joylashtirish juda yomon amaliyot hisoblanadi.[69]

Ishlab chiquvchilarga noto'g'ri ishonch

Kabi paketlarni boshqarish tizimlari npm va Bower JavaScript ishlab chiquvchilari orasida mashhurdir. Bunday tizimlar ishlab chiquvchiga o'z dasturining boshqa ishlab chiquvchilarning kutubxonalariga bog'liqligini osongina boshqarish imkonini beradi. Ishlab chiquvchilar kutubxonalarning texnik xizmatchilari ularni xavfsizligini va zamonaviyligini ta'minlashlariga ishonadilar, ammo bu har doim ham shunday emas. Ushbu ko'r-ko'rona ishonch tufayli zaiflik paydo bo'ldi. Ishonchli kutubxonalar kutubxonalarga asoslangan barcha dasturlarda xatolar yoki zaifliklar paydo bo'lishiga olib keladigan yangi nashrlarga ega bo'lishi mumkin. Aksincha, kutubxona yovvoyi tabiatda ma'lum bo'lgan zaifliklar bilan to'ldirilishi mumkin. 133k veb-saytlarning namunalari bo'yicha olib borilgan tadqiqotda tadqiqotchilar veb-saytlarning 37% kamida bitta taniqli zaifligi bo'lgan kutubxonani o'z ichiga olganligini aniqladilar.[70] "Har bir veb-saytda ishlatilgan eng qadimgi kutubxona versiyasi va ushbu kutubxonaning eng yangi versiyasi o'rtasidagi o'rtacha kechikish ALEXA-da 1177 kunni tashkil etadi va bir necha yil oldin ham faol foydalanilayotgan ba'zi kutubxonalarning rivojlanishi to'xtatilgan."[70] Yana bir imkoniyat - kutubxonani saqlovchi kutubxonani butunlay yo'q qilishi mumkin. Bu 2016 yil mart oyida Azer Kochulu o'z omborini olib tashlaganida yuz berdi npm. Bu uning kutubxonalariga qarab o'n minglab dasturlar va veb-saytlarning buzilishiga olib keldi.[71][72]

Brauzer va plaginlarni kodlashda xatolar

JavaScript brauzerning keng imkoniyatlari uchun interfeysni taqdim etadi, ularning ba'zilari kabi kamchiliklarga ega bo'lishi mumkin bufer toshib ketadi. Ushbu kamchiliklar tajovuzkorlarga foydalanuvchi tizimida istagan har qanday kodni ishlatadigan skriptlarni yozishga imkon beradi. Ushbu kod hech qanday tarzda boshqa JavaScript dasturi bilan cheklanmaydi. Masalan, haddan ziyod ekspluatatsiya qilingan bufer tajovuzkorga operatsion tizimga kirish huquqini berishi mumkin API superuser imtiyozlari bilan.

Ushbu kamchiliklar yirik brauzerlarga, shu jumladan Firefox,[73] Internet Explorer,[74] va Safari.[75]

Video pleer kabi plaginlar, Adobe Flash va keng doirasi ActiveX Microsoft Internet Explorer-da sukut bo'yicha yoqilgan boshqaruv elementlari JavaScript-da foydalanilishi mumkin bo'lgan kamchiliklarga ega bo'lishi mumkin (bunday kamchiliklar ilgari ishlatilgan).[76][77]

Windows Vista-da, Microsoft Internet Explorer jarayonini cheklangan imtiyozlar bilan ishga tushirish orqali buferning oshib ketishi kabi xatolar xavfini o'z ichiga olishga harakat qildi.[78] Gugl xrom xuddi shu tarzda sahifa ko'rsatuvchilarini o'zlarining "qum maydonlari" bilan cheklaydi.

Qum qutisini amalga oshirishda xatolar

Veb-brauzerlar, masalan, fayllarni yaratish yoki o'chirish uchun zarur bo'lgan imtiyozlar bilan JavaScript-ni qum maydonidan tashqarida ishlashga qodir. Bunday imtiyozlar Internetdan kod olish uchun mo'ljallanmagan.

Internetdan JavaScript-ga imtiyozlarni noto'g'ri berish Internet Explorer-ning ikkalasida ham zaifliklarda rol o'ynadi[79] va Firefox.[80] Windows XP Service Pack 2-da Microsoft Internet Explorer-da JScript-ning imtiyozlarini pasaytirdi.[81]

Microsoft Windows kompyuterning qattiq diskidagi JavaScript-ning fayllarini umumiy foydalanishga mo'ljallangan, qum bilan ta'minlanmagan dasturlar sifatida ishga tushirishga imkon beradi (qarang: Windows skript xosti ). Bu JavaScript-ni yaratadi (shunga o'xshash) VBScript ) a uchun nazariy jihatdan foydali vektor Troyan oti, garchi JavaScript troyan otlari amalda kam uchraydi.[82][tekshirib bo'lmadi ]

Uskuna zaifliklari

2015 yilda JavaScript-ga asoslangan eshkak eshish Hujum xavfsizlik tadqiqotchilari tomonidan qog'ozda tasvirlangan.[83][84][85][86]

2017 yilda brauzer orqali JavaScript-ga asoslangan hujumni chetlab o'tadigan namoyish etildi ASLR. Bu "ASLR⊕Cache" yoki AnC deb nomlanadi.[87][88]

2018 yilda e'lon qilgan qog'oz Spektr Intel va boshqa protsessorlarda spekulyativ ijroga qarshi hujumlar JavaScript dasturini o'z ichiga olgan.[89]

Rivojlanish vositalari

Muhim vositalar til bilan rivojlandi.

  • Ba'zi brauzerlarda ichki o'rnatilgan profillar. Shuningdek, benchmark.js va jsbench kabi mustaqil profil kutubxonalari yaratildi.[90][91]

Tegishli texnologiyalar

Java

JavaScript-ning o'xshashligi yoki ular bilan chambarchas bog'liqligi keng tarqalgan noto'g'ri tushuncha Java. To'g'ri, ikkalasida ham C ga o'xshash sintaksis mavjud (C tili ularning eng yaqin ota-bobolarining tili). Ularning ikkalasi ham odatda qum qutisi (brauzer ichida ishlatilganda) va JavaScript Java sintaksisini va standart kutubxonasini hisobga olgan holda ishlab chiqilgan. In particular, all Java keywords were reserved in original JavaScript, JavaScript's standard library follows Java's naming conventions, and JavaScript's Matematika va Sana objects are based on classes from Java 1.0,[92] but the similarities end there.

Java and JavaScript both first appeared in 1995, but Java was developed by Jeyms Gosling of Sun Microsystems, and JavaScript by Brendan Eich of Netscape Communications.

The differences between the two languages are more prominent than their similarities. Java has statik yozuv, while JavaScript's typing is dinamik. Java is loaded from compiled bytecode, while JavaScript is loaded as human-readable source code. Java's objects are sinfga asoslangan, while JavaScript's are prototipga asoslangan. Finally, Java did not support functional programming until Java 8, while JavaScript has done so from the beginning, being influenced by Sxema.

JSON

JSON, or JavaScript Object Notation, is a general-purpose data interchange format that is defined as a subset of JavaScript's object literal syntax.

Veb-yig'ish

Since 2017, web browsers have supported Veb-yig'ish, a binary format that enables a JavaScript mexanizmi to execute performance-critical portions of veb sahifa scripts close to native speed.[93] WebAssembly code runs in the same qum qutisi as regular JavaScript code.

asm.js is a subset of JavaScript that served as the forerunner of WebAssembly.[94]

Transpilers

JavaScript is the dominant client-side language of the Web, and many websites are script-heavy. Shunday qilib transpilers have been created to convert code written in other languages, which can aid the development process.[25]

Adabiyotlar

  1. ^ a b Press release announcing JavaScript, "Netscape and Sun announce JavaScript", PR Newswire, December 4, 1995
  2. ^ "Standard ECMA-262". Ecma International. 2020-06-17.
  3. ^ "nodejs/node-eps". GitHub.
  4. ^ "Brendan Eich: An Introduction to JavaScript, JSConf 2010". p. 22m. Olingan 25-noyabr, 2019. Eich: "function", eight letters, I was influenced by AWK.
  5. ^ Seibel, Peter (16 September 2009). Ish joyidagi kodchilar: Dasturlash bo'yicha hunarmandchilik haqida mulohazalar. ISBN  9781430219484. Olingan 25 dekabr, 2018. Eich: The immediate concern at Netscape was it must look like Java.
  6. ^ "JavaScript". Collins English Dictionary – Complete & Unabridged 2012 Digital Edition. William Collins Sons & Co. 2012. Olingan 21 avgust 2015.
  7. ^ "ECMAScript® 2020 Language Specification".
  8. ^ Flanagan, David. JavaScript - The definitive guide (6 nashr). p. 1. JavaScript is part of the triad of technologies that all Web developers must learn: HTML to specify the content of web pages, CSS to specify the presentation of web pages and JavaScript to specify the behaviour of web pages.
  9. ^ a b "Usage statistics of JavaScript as client-side programming language on websites". w3techs.com.
  10. ^ "Bloomberg Game Changers: Marc Andreessen". Bloomberg. 2011 yil 17 mart. Olingan 2011-12-07.
  11. ^ Enzer, Larry (31 August 2018). "The Evolution of the Web Browsers". Monmouth Web Developers. Olingan 31 avgust 2018.
  12. ^ a b v "Chapter 4. How JavaScript Was Created". speakingjs.com.
  13. ^ "TechVision: Innovators of the Net: Brendan Eich and JavaScript". Arxivlandi asl nusxasi 2008-02-08 da.
  14. ^ Fin JS (2016-06-17), Brendan Eich - CEO of Brave, olingan 2018-02-07
  15. ^ a b Champeon, Steve (6 April 2001). "JavaScript, How Did We Get Here?". oreilly.com. Arxivlandi asl nusxasi 2016-07-19. Olingan 16 iyul 2016.
  16. ^ "Microsoft Internet Explorer 3.0 Beta versiyasi endi mavjud". microsoft.com. Microsoft. 29 may 1996 yil. Olingan 16 iyul 2016.
  17. ^ McCracken, Harry (16 September 2010). "The Unwelcome Return of "Best Viewed with Internet Explorer"". technologizer.com. Olingan 16 iyul 2016.
  18. ^ "Mozilla Firefox Internet Browser Market Share Gains to 7.4%". Search Engine Journal. 2004 yil 24-noyabr. Olingan 2011-12-07.
  19. ^ Weber, Tim (May 9, 2005). "The assault on software giant Microsoft". BBC yangiliklari. Arxivlandi asl nusxasi 2017 yil 25 sentyabrda.
  20. ^ "Big browser comparison test: Internet Explorer vs. Firefox, Opera, Safari and Chrome". Kompyuter o'yinlari uchun uskunalar. Computec Media AG. Olingan 2010-06-28.
  21. ^ "Lifehacker Speed Tests: Safari 4, Chrome 2". Layfxaker. Olingan 2010-06-28.
  22. ^ "TraceMonkey: JavaScript Lightspeed, Brendan Eich's Blog". Olingan 2020-07-22.
  23. ^ "Mozilla asks, 'Are we fast yet?'". Simli. Olingan 18 yanvar 2019.
  24. ^ "ECMAScript 6: New Features: Overview and Comparison". es6-features.org. Olingan 2018-03-19.
  25. ^ a b Ashkenas, Jeremy. "JS-ga tuziladigan tillar ro'yxati". Olingan 6 fevral 2020.
  26. ^ "U.S. Trademark Serial No. 75026640". USPTO.
  27. ^ "Sun Trademarks". Sun Microsystems. Arxivlandi asl nusxasi 2010 yil 28 mayda. Olingan 2007-11-08.
  28. ^ a b v "Usage statistics of JavaScript libraries for websites". w3techs.com.
  29. ^ "Vanilla JS". vanilla-js.com. Olingan 2020-06-17.
  30. ^ Netscape Communications Corporation (11 December 1998). "Server-Side JavaScript Guide". oracle.com. Netscape Communications Corporation. Olingan 2016-07-16.
  31. ^ Clinick, Andrew (July 14, 2000). "Introducing JScript .NET". Microsoft Developer Network. Microsoft. Olingan 10 aprel 2018. [S]ince the 1996 introduction of JScript version 1.0 ... we've been seeing a steady increase in the usage of JScript on the server—particularly in Active Server Pages (ASP)
  32. ^ a b Mahemoff, Michael (17 December 2009). "Server-Side JavaScript, Back with a Vengeance". readwrite.com. Olingan 2016-07-16.
  33. ^ "JavaScript for Acrobat". Olingan 2009-08-18.
  34. ^ "Answering the question: "How do I develop an app for GNOME?"".
  35. ^ "Tessel 2... Leverage all the libraries of Node.JS to create useful devices in minutes with Tessel".
  36. ^ "Node.js Raspberry Pi GPIO Introduction".
  37. ^ "Espruino - JavaScript for Microcontrollers".
  38. ^ Flanagan, David (17 August 2006). JavaScript: The Definitive Guide: The Definitive Guide. "O'Reilly Media, Inc.". p. 16. ISBN  978-0-596-55447-7.CS1 maint: ref = harv (havola)
  39. ^ a b v d e "JavaScript quirks in one image from the Internet". The DEV Community. Olingan 2019-10-28.
  40. ^ "Wat". www.destroyallsoftware.com. Olingan 2019-10-28.
  41. ^ "JavaScript data types and data structures - JavaScript | MDN". Tuzuvchi.mozilla.org. 2017-02-16. Olingan 2017-02-24.
  42. ^ Flanagan 2006, 176–178 betlar.
  43. ^ Krokford, Duglas. "JavaScript-dagi prototip meros". Olingan 20 avgust 2013.
  44. ^ "Inheritance and the prototype chain". Mozilla Developer Network. Mozilla. Olingan 6 aprel 2013.
  45. ^ Herman, David (2013). Effective JavaScript. Addison-Uesli. p. 83. ISBN  978-0-321-81218-6.
  46. ^ Haverbeke, Marijn (2011). Eloquent JavaScript. Kraxmal bosilmaydi. 95-97 betlar. ISBN  978-1-59327-282-1.
  47. ^ Katz, Yehuda. "Understanding "Prototypes" in JavaScript". Olingan 6 aprel 2013.
  48. ^ Herman, David (2013). Effective JavaScript. Addison-Uesli. 125–127 betlar. ISBN  978-0-321-81218-6.
  49. ^ "Properties of the Function Object". Es5.github.com. Olingan 2013-05-26.
  50. ^ Flanagan 2006, p. 141.
  51. ^ The many talents of JavaScript for generalizing Role-Oriented Programming approaches like Traits and Mixins, Peterseliger.blogpsot.de, April 11, 2014.
  52. ^ Traits for JavaScript, 2010.
  53. ^ "Home | CocktailJS". Cocktailjs.github.io. Olingan 2017-02-24.
  54. ^ Angus Croll, A fresh look at JavaScript Mixins, published May 31, 2011.
  55. ^ "Concurrency model and Event Loop". Mozilla Developer Network. Olingan 2015-08-28.
  56. ^ Haverbeke, Marijn (2011). Eloquent JavaScript. Kraxmal bosilmaydi. 139–149 betlar. ISBN  978-1-59327-282-1.
  57. ^ "E4X – Archive of obsolete content | MDN". Mozilla Developer Network. Mozilla Foundation. Feb 14, 2014. Olingan 13 iyul 2014.
  58. ^ "var – JavaScript – MDN". The Mozilla Developer Network. Olingan 22 dekabr 2012.
  59. ^ "ruxsat". MDN veb-hujjatlari. Mozilla. Olingan 27 iyun 2018.
  60. ^ "const". MDN veb-hujjatlari. Mozilla. Olingan 27 iyun 2018.
  61. ^ "ECMAScript Language Specification – ECMA-262 Edition 5.1". Ecma International. Olingan 22 dekabr 2012.
  62. ^ "console". Mozilla Developer Network. Mozilla. Olingan 6 aprel 2013.
  63. ^ "arguments". Mozilla Developer Network. Mozilla. Olingan 6 aprel 2013.
  64. ^ "Import & Export Modules in javascript". Learnersbucket.com. Olingan 23 aprel 2019.
  65. ^ "Making JavaScript Safe for Advertising". ADsafe. Olingan 2013-05-26.
  66. ^ "Secure ECMA Script (SES)". Olingan 2013-05-26.
  67. ^ "Mozilla Cross-Site Scripting Vulnerability Reported and Fixed - MozillaZine Talkback". Mozillazine.org. Olingan 2017-02-24.
  68. ^ "Right-click "protection"? Forget about it". 2008-06-17. ISSN  1797-1993. Arxivlandi asl nusxasi 2011-08-09. Olingan 2008-06-17. Iqtibos jurnali talab qiladi | jurnal = (Yordam bering)
  69. ^ Rehorik, Jan. "Why You Should Never Put Sensitive Data in Your JavaScript". ServiceObjects Blog. ServiceObjects. Olingan 3 iyun 2019.
  70. ^ a b Lauinger, Tobias; Chaabane, Abdelberi; Arshad, Sajjad; Robertson, William; Wilson, Christo; Kirda, Engin (2016-12-21). "Thou Shalt Not Depend on Me: Analysing the Use of Outdated JavaScript Libraries on the Web" (PDF). Proceedings 2017 Network and Distributed System Security Symposium. arXiv:1811.00918. doi:10.14722/ndss.2017.23414. ISBN  978-1-891562-46-4. S2CID  17885720. Arxivlandi asl nusxasi (PDF) 2017-03-29. Olingan 2017-02-22.
  71. ^ Collins, Keith (March 27, 2016). "How one programmer broke the internet by deleting a tiny piece of code". Kvarts.
  72. ^ SC Magazine UK, Developer's 11 lines of deleted code 'breaks the internet' Arxivlandi 2017-02-23 da Orqaga qaytish mashinasi
  73. ^ Mozilla Corporation, Buffer overflow in crypto.signText()
  74. ^ Festa, Paul (August 19, 1998). "Buffer-overflow bug in IE". CNET. Arxivlandi asl nusxasi on December 25, 2002.
  75. ^ SecurityTracker.com, Apple Safari JavaScript Buffer Overflow Lets Remote Users Execute Arbitrary Code and HTTP Redirect Bug Lets Remote Users Access Files
  76. ^ SecurityFocus, Microsoft WebViewFolderIcon ActiveX Control Buffer Overflow Vulnerability
  77. ^ Fusion Authority, Macromedia Flash ActiveX Buffer Overflow Arxivlandi 2011-08-13 da Orqaga qaytish mashinasi
  78. ^ "Protected Mode in Vista IE7 – IEBlog". Blogs.msdn.com. 2006-02-09. Olingan 2017-02-24.
  79. ^ US CERT, Vulnerability Note VU#713878: Microsoft Internet Explorer does not properly validate source of redirected frame
  80. ^ Mozilla Foundation, Mozilla Foundation Security Advisory 2005–41: Privilege escalation via DOM property overrides
  81. ^ Microsoft korporatsiyasi, Changes to Functionality in Microsoft Windows XP Service Pack 2: Part 5: Enhanced Browsing Security
  82. ^ For one example of a rare JavaScript Trojan Horse, see Symantec Corporation, JS.Seeker.K
  83. ^ Gruss, Daniel; Moris, Klemmentin; Mangard, Stefan (2015-07-24). "Rowhammer.js: A Remote Software-Induced Fault Attack in JavaScript". arXiv:1507.06955 [cs.CR ].
  84. ^ Jean-Pharuns, Alix (2015-07-30). "Rowhammer.js Is the Most Ingenious Hack I've Ever Seen". Anakart. Vitse-muovin.
  85. ^ Goodin, Dan (2015-08-04). "DRAM 'Bitflipping' exploit for attacking PCs: Just add JavaScript". Ars Technica.
  86. ^ Auerbax, Devid (2015 yil 28-iyul). "Rowhammer security exploit: Why a new security attack is truly terrifying". slate.com. Olingan 29 iyul, 2015.
  87. ^ AnC VUSec, 2017
  88. ^ New ASLR-busting JavaScript is about to make drive-by exploits much nastier Ars Technica, 2017
  89. ^ Spectre Attack Spectre Attack
  90. ^ "Benchmark.js". benchmarkjs.com.
  91. ^ JSBEN.CH. "JSBEN.CH Performance Benchmarking Playground for JavaScript". jsben.ch.
  92. ^ Eich, Brendan (2008 yil 3 aprel). "Popularity". Olingan 2012-01-19.
  93. ^ "Edge Browser Switches WebAssembly to 'On' -- Visual Studio Magazine". Visual Studio jurnali.
  94. ^ "frequently asked questions". asm.js. Olingan 2014-04-13.

Qo'shimcha o'qish

  • Eloquent JavaScript; 3-chi Ed; Marijn Haverbeke; Kraxmalli press yo‘q; 472 pages; 2018 yil; ISBN  978-1593279509.(yuklab olish)
  • Principles of Object-Oriented JavaScript; Birinchi Ed; Nicholas Zakas; Kraxmalli press yo‘q; 120 bet; 2014 yil; ISBN  978-1593275402.

Tashqi havolalar