Ushbu JavaScript asoslarini o'rganing va yanada yaxshi dasturchi bo'ling

Discover Funktsional JavaScript BookAuthority tomonidan yaratilgan eng yaxshi yangi Funktsional dasturlash kitoblaridan biri deb topildi!

JavaScript-da ibtidoiy narsalar, ob'ektlar va funktsiyalar mavjud. Ularning barchasi qadriyatlardir. Hammasi ob'ekt sifatida, hatto ibtidoiy sifatida ham ko'rib chiqiladi.

Primitivlar

Raqam, mantiqiy, torli, aniqlanmagan va null ibtidoiy.

Raqam

JavaScript-da bitta raqam turi mavjud, 64-bitli ikkilamchi suzuvchi nuqta turi. O'nli raqamlarning arifmetikasi aniq emas.

Siz allaqachon bilganingizdek, 0,1 + 0,2 0,3 ga teng bo'lmaydi. Ammo butun sonlar bilan arifmetika aniq, shuning uchun 1 + 2 === 3.

Raqamlar Number.prototype ob'ektidan usullarni meros qilib oladi. Usullarni raqamlarga qo'ng'iroq qilish mumkin:

(123) .toString (); // "123"
(1.23) .Taqdim etilgan (1); //"1.2 "

Satrlarni raqamlarga o'tkazish funktsiyalari mavjud: Number.parseInt (), Number.parseFloat () va Number ():

Raqam.parseInt ("1") // 1
Number.parseInt ("matn") // NaN
Raqam.parseFloat ("1.234") //1.234
Raqam ("1") // 1
Raqam ("1.234") //1.234

Noto'g'ri arifmetik operatsiyalar yoki noto'g'ri konversiyalar istisno qilmaydi, lekin NaN "Not a-number" qiymatiga olib keladi. Number.isNaN () NaN ni aniqlay oladi.

+ Operatori qo'shishi yoki bog'lashi mumkin.

1 + 1 // 2
"1" + "1" // "11"
1 + "1" // "11"

Qator

Bir qator Unicode belgilarini saqlaydi. Matn ikki tirnoq ichida "" yoki bitta tirnoq ichida "'bo'lishi mumkin.

Strings String.prototype-dan usullarni meros qilib oladi. Ular quyidagi usullarga ega: substring (), indexOf () va concat ().

"matn" .substring (1,3) // "ex"
"matn" .indexOf ('x') // 2
"text" .concat ("end") // "matn oxiri"

Simlar, barcha boshlang'ichlar singari, o'zgarmasdir. Masalan, concat () mavjud satrni o'zgartirmaydi, lekin yangisini yaratadi.

Boolean

Boolening ikkita qiymati bor: haqiqiy va noto'g'ri.
Til haqiqat va soxta qadriyatlarga ega.
noto'g'ri, null, aniqlanmagan, '' (bo'sh satr), 0 va NaN soxta. Boshqa barcha qiymatlar, shu jumladan barcha ob'ektlar haqiqatdir.

Haqiqat qiymati haqiqiy deb baholanadi, bu mantiqiy kontekstda bajarilganda. Soxta qiymat noto'g'ri deb baholanadi. Soxta shoxni ko'rsatadigan keyingi misolni ko'rib chiqing.

ruxsat matni = '';
if (matn) {
  console.log ("Bu to'g'ri");
} else {
  console.log ("Bu noto'g'ri");
}

Tenglik operatori ===. Teng emas operator! ==.

O'zgaruvchilar

O'zgaruvchilar var, let va const yordamida aniqlanishi mumkin.

var o'zgaruvchini e'lon qiladi va ixtiyoriy ravishda boshlaydi. Var bilan e'lon qilingan o'zgaruvchilar funktsiyalar doirasiga ega. Ular funktsiyaning yuqori qismida e'lon qilinganidek ko'rib chiqiladi. Bunga o'zgaruvchan ko'tarish deyiladi.

Berilgan deklaratsiya blok doirasiga ega.

Initsializatsiya qilinmaydigan o'zgaruvchining qiymati aniqlanmagan.

Konst bilan e'lon qilingan o'zgaruvchini qayta tayinlab bo'lmaydi. Ammo uning qiymati hali ham o'zgarishi mumkin. const o'zgaruvchini muzlatadi, Object.freeze () ob'ektni muzlatadi. Const deklaratsiyasi blok doirasiga ega.

Ob'ektlar

Ob'ekt bu xususiyatlarning dinamik to'plami.

Xususiyat kaliti - bu noyob satr. Agar mulkiy kalit sifatida simli bo'lmagan satr ishlatilsa, u satrga aylantiriladi. Xususiyat qiymati ibtidoiy, ob'ekt yoki funktsiya bo'lishi mumkin.

Ob'ektni yaratishning eng oddiy usuli bu ob'ektdan tom ma'noda foydalanish:

ruxsat bering obj = {
  xabar: "xabar",
  doSomething: funktsiya () {}
}

Xususiyatlarga kirishning ikki yo'li mavjud: nuqta belgisi va qavs notasi. Istalgan vaqtda ob'ektning xususiyatlarini o'qish, qo'shish, tahrirlash va o'chirishimiz mumkin.

  • get: object.name, ob'ekt [ifoda]
  • to'siq: object.name = qiymat, ob'ekt [ifoda] = qiymat
  • o'chirish: ob'ektni o'chirish.name, ob'ektni o'chirish [ifoda]
ruxsat bering obj = {}; // bo'sh ob'ektni yaratish
obj.message = "Xabar"; // mulk qo'shish
obj.message = "Yangi xabar"; // mulkni tahrirlash
obj.message-ni o'chirish; // mulkni o'chirish

Ob'ektlardan xaritalar sifatida foydalanish mumkin. Oddiy xarita Object.create (null) yordamida yaratilishi mumkin:

let french = Object.create (null);
fransuzcha ["ha"] = "oui";
fransuzcha ["no"] = "non";
frantsuzcha ["ha"]; // "oui"

Ob'ektning barcha xususiyatlari hammaga ochiq. Object.keys () dan barcha xususiyatlarni takrorlash uchun foydalanish mumkin.

logProperty (ism) {
  console.log (ism); // mulk nomi
  console.log (obj [name]); // mulk qiymati
}
Object.keys (obj) .forEach (logProperty);

Object.assign () barcha xususiyatlarni bir ob'ektdan ikkinchisiga ko'chiradi. Ob'ektni barcha xususiyatlarini bo'sh ob'ektga nusxalash orqali klonlash mumkin:

let book = {sarlavha: "Yaxshi qismlar"};
let clone = Object.assign ({}, kitob);

O'zgarmas ob'ekt - bu bir marta yaratilgan ob'ektni o'zgartirish mumkin emas. Agar siz ob'ektni o'zgarmas qilib qo'ymoqchi bo'lsangiz, Object.freeze () dan foydalaning.

Ob'ektlar va boshqalar

Primitivlar (nol va aniqlanmaganlardan tashqari) ob'ektlar kabi muomala qilinadi, ularning uslublari bor, lekin ular ob'ekt emas.

Raqamlar, torlar va buklar ob'ektga teng keladigan o'rashlarga ega. Bular Number, String va Boolean funktsiyalari.

Primitivlarda xususiyatlarga kirishga ruxsat berish uchun, JavaScript doka ob'ektini yaratadi va uni yo'q qiladi. O'ralgan narsalarni yaratish va yo'q qilish jarayoni JavaScript mexanizmi tomonidan optimallashtirilgan.

Primitivlar o'zgarmas, ob'ektlar esa o'zgarishi mumkin.

Array

Arraylar indekslangan qiymatlar to'plami. Har bir qiymat elementdir. Elementlarga buyurtma beriladi va ularning indeks raqami bo'yicha kirish mumkin.

JavaScript-da massivga o'xshash ob'ektlar mavjud. Massivlar ob'ektlar yordamida amalga oshiriladi. Indekslar satrlarga aylantiriladi va qiymatlarni olish uchun nom sifatida ishlatiladi.

Let arr = ['A', 'B', 'C'] kabi oddiy massiv quyidagi ob'ekt kabi ob'ekt yordamida taqlid qilinadi:

{
  '0': 'A',
  '1': 'B',
  '2': 'C'
}

E'tibor bering, arr [1] arr ['1']: arr [1] === arr ['1'] qiymatlarini beradi.

Massivdan o'chirish bilan qiymatlarni olib tashlash teshiklarni qoldiradi. muammoni oldini olish uchun splice () dan foydalanish mumkin, ammo sekin bo'lishi mumkin.

let arr = ['A', 'B', 'C'];
o'chirish arr [1];
console.log (arr); // ['A', bo'sh, 'C']
console.log (arr.length); // 3

JavaScript-ning massivlari "indeks doirasidan tashqarida" istisnolarni bekor qilmaydi. Agar indeks mavjud bo'lmasa, u aniqlanmagan qaytadi.

Stack va navbatni massiv usullari yordamida osongina amalga oshirish mumkin:

ruxsat stack = [];
stack.push (1); // [1]
stack.push (2); // [1, 2]
let last = stack.pop (); // [1]
console.log (oxirgi); // 2
ruxsat berish qu = =];
navbat.push (1); // [1]
navbat.push (2); // [1, 2]
avval birinchi = quue.shift (); // [2]
console.log (birinchi); // 1

Vazifalari

Vazifalar mustaqil xatti-harakatlarning birliklari.

Vazifalar - bu ob'ektlar. Vazifalar o'zgaruvchiga tayinlanishi mumkin, ob'ektlarda yoki massivlarda saqlanadi, boshqa funktsiyalarga argument sifatida uzatiladi va funktsiyalardan qaytariladi.

Funktsiyani aniqlashning uchta usuli mavjud:

  • Funktsiya Deklaratsiyasi (Funktsiya Bayonoti)
  • Funktsiya ifodasi (aka funktsiya so'zma-so'z)
  • Ok vazifasi

Funktsiya deklaratsiyasi

  • funktsiya - bu satrdagi birinchi kalit so'z
  • uning nomi bo'lishi kerak
  • uni aniqlashdan oldin foydalanish mumkin. Funktsiyalar deklaratsiyalari eng yuqori qismiga ko'chiriladi yoki "ko'tariladi".
doSomething () {} funktsiyasi

Funktsiya ifodasi

  • funktsiya satrdagi birinchi kalit so'z emas
  • ism ixtiyoriy. Anonim funktsiya ifodasi yoki nomlangan funktsiya ifodasi bo'lishi mumkin.
  • uni aniqlash kerak, keyin u bajarishi mumkin
  • u aniqlangandan so'ng avtomatik ravishda bajarilishi mumkin ("IIFE" darhol chaqiriladigan funktsiyalarni ifodalash)
doSomething = function () {} ga ruxsat bering

Ok vazifasi

Strelka funktsiyasi anonim funktsiya ifodasini yaratish uchun shakar sintaksisidir.

qilaylik doSomething = () => {};

Ok funktsiyalari bu va dalillarga ega emas.

Funktsiyani chaqirish

Funktsiya kalit so'zi bilan belgilangan funktsiyani turli xil usullarda ishlatish mumkin:

  • Funktsiya shakli
doSomething (dalillar)
  • Usul shakli
theObject.doSomething (dalillar)
theObject ["doSomething"] (dalillar)
  • Konstruktor shakli
yangi Konstruktor (dalillar)
  • Shaklni qo'llang
 doSomething.apply (mavzu, [dalillar])
 doSomething.call (loyiha, dalillar)

Vazifalarni ta'rifda e'lon qilinganidan ko'ra ko'proq yoki kamroq dalillar bilan ishlatish mumkin. Qo'shimcha dalillar e'tiborga olinmaydi va etishmayotgan parametrlar aniqlanmagan qilib o'rnatiladi.

Vazifalar (strelka funktsiyalaridan tashqari) ikkita soxta parametrga ega: bu va dalillar.

bu

Usullar ob'ektlarda saqlanadigan funktsiyalardir. Vazifalar mustaqil. Ushbu funktsiya qaysi ob'ekt ustida ishlash kerakligini bilishi uchun. bu funktsiya kontekstini bildiradi.

Funktsiya shakli bilan ishlaganda, buni ishlatish uchun hech qanday ma'no yo'q: doSomething (). Bu holda bu aniqlanmagan yoki qattiq rejim yoqilgan yoki yoqilmaganligiga qarab oyna ob'ekti.

Agar funktsiya theObject.doSomething () usuli yordamida chaqirilsa, bu ob'ektni ifodalaydi.

Agar funktsiya yangi Constructor () konstruktor sifatida ishlatilsa, bu yangi yaratilgan ob'ektni anglatadi.

Buning qiymati apply () yoki call () yordamida o'rnatilishi mumkin: doSomething.apply (theObject). Bunday holda, bu usulga birinchi parametr sifatida yuborilgan ob'ekt.

Buning qiymati funktsiya qayerda aniqlanganiga emas, balki qanday qilib funktsiya chaqirilishiga bog'liq. Bu, albatta, chalkashlik manbai.

dalillar

Pseudo-parametr argumentlari chaqirilganda ishlatilgan barcha dalillarni beradi. Bu massivga o'xshash ob'ekt, ammo qator emas. U qator usullariga ega emas.

funktsiya jurnali (xabar) {
  console.log (xabar);
}
logAll () {funktsiya
  let args = Array.prototype.slice.call (dalillar);
  return args.forEach (log);
}
logAll ("msg1", "msg2", "msg3");

Alternativa yangi dam olish parametrlari sintaksisi. Bu safar args massiv ob'ekti.

logAll (... args) funktsiyasi {
  return args.forEach (log);
}

qaytish

Qaytarilish bayoni bo'lmagan funktsiya aniqlanmagan qiymatni qaytaradi. Qaytishdan foydalanganda avtomatik yarimburchaklar qo'shilishiga e'tibor bering. Keyingi funktsiya bo'sh ob'ektni bermaydi, aksincha aniqlanmagan vazifani bajaradi.

funktsiya getObject () {
  qaytish
  {
  }
}
getObject ()

Muammoni oldini olish uchun {bilan qaytish bilan bir qatorda {foydalaning:

funktsiya getObject () {
  return {
  }
}

Dinamik yozish

JavaScript dinamik yozishga ega. Qiymatlar turlari bor, o'zgaruvchilar yo'q. Turlari ish vaqtida o'zgarishi mumkin.

funktsiya jurnali (value) {
  console.log (qiymat);
}
log (1);
jurnal ("matn");
jurnal ({xabar: "matn"});

Typeof () operatori o'zgaruvchining turini tekshirishi mumkin.

ruxsat bering n = 1;
tipof (n); // raqam
let s = "matn";
tipof (lar); // satr
let fn = function () {};
tipof (fn); // funktsiyasi

Bitta mavzu

Asosiy JavaScript ish vaqti bitta tishli. Bir vaqtning o'zida ikkita funktsiya ishlay olmaydi. Ish vaqti ishlov beriladigan xabarlar ro'yxatini saqlaydigan voqea navbatini o'z ichiga oladi. Hech qanday poyga shartlari, to'siqlar yo'q. Shu bilan birga, Voqealar navbatidagi kod tezkor ishlashi kerak. Aks holda brauzer javob bermaydi va vazifani o'ldirishni so'raydi.

Istisnolar

JavaScript-da istisno ishlash mexanizmi mavjud. Bu siz kutganingizdek ishlaydi, try / catch iborasi yordamida kodni o'rash orqali. Bayonotda barcha istisnolarni ko'rib chiqadigan bitta tutib turish bloki mavjud.

Ba'zan JavaScript-da, jim xatolar uchun afzal ko'rilishini bilish yaxshi. Muzlatilgan ob'ektni o'zgartirishga harakat qilganimda, keyingi kod istisno qilmaydi:

let obj = Object.freeze ({});
obj.message = "matn";

Qattiq rejim ba'zi bir ovozsiz JavaScript xatolarini yo'q qiladi. "qat'iy foydalanish"; qat'iy rejimni yoqadi.

Prototip naqshlari

Prototip tizimiga ob'ektlarni qurish uchun Object.create (), konstruktor funktsiyasi va sinf.

Keyingi misolni ko'rib chiqaylik:

servicePrototype = {ga ruxsat berish
 doSomething: funktsiya () {}
}
let service = Object.create (servicePrototype);
console.log (service .__ proto__ === servicePrototype); // rost

Object.create () o'zining prototipi sifatida servicePrototype ob'ekti bo'lgan yangi ob'ekt xizmatini quradi. Bu xizmat ob'ektida doSomething () mavjudligini anglatadi. Bundan tashqari, xizmatning __proto__ xususiyati servicePrototype ob'ektiga ishora qiladi.

Endi sinfdan foydalanib shunga o'xshash ob'ektni quraylik.

sinf xizmati {
  nimadir qil(){}
}
let service = yangi xizmat ();
console.log (service .__ proto__ === Service.prototype);

Servis klassida belgilangan barcha usullar Service.prototype ob'ektiga qo'shiladi. Servis sinfi misollarida bir xil prototip (Service.prototype) ob'ekti bo'ladi. Barcha holatlar usul qo'ng'iroqlarini Service.prototype ob'ektiga yuboradi. Usullar Service.prototype-da bir marta aniqlanadi va keyin barcha holatlar bo'yicha meros qilib olinadi.

Prototip zanjiri

Ob'ektlar boshqa ob'ektlardan meros qilib olinadi. Har bir ob'ekt prototipga ega va undan o'z xususiyatlarini meros qilib oladi. Prototip __proto__ "yashirin" mulki orqali mavjud.

Ob'ekt bo'lmagan xususiyatni so'rasangiz, JavaScript prototip zanjirida u talab qilingan mulkni topgunga qadar yoki zanjirning oxiriga yetguncha qarab turadi.

Funktsional naqshlar

JavaScript birinchi darajali funktsiyalar va yopilishlarga ega. Bu JavaScript-da funktsional dasturlash uchun yo'l ochadigan tushunchalar. Natijada, yuqori buyurtma funktsiyalari mumkin.

filtr (), xarita (), qisqartirish () funktsiyalar uslubida massivlar bilan ishlashning asosiy vositasi.

filter () qiymatlarni saqlash kerakligini belgilaydigan predikat funktsiyasi asosida ro'yxatdagi qiymatlarni tanlaydi.

map () xaritalar funktsiyasidan foydalanib, qiymatlar ro'yxatini boshqa qiymatlar ro'yxatiga o'zgartiradi.

ruxsat berilgan raqamlar = [1,2,3,4,5,6];
funktsiya isEven (number) {
  qaytish raqami% 2 === 0;
}
funktsiya doubleNumber (x) {
  qaytish x * 2;
}
let evenNumbers = numbers.filter (isEven);
// 2 4 6
let doubleNumbers = numbers.map (doubleNumber);
// 2 4 6 8 10 12

kamaytirish () qiymatlarning ro'yxatini bitta qiymatga qisqartiradi.

funktsiya addNumber (jami, qiymati) {
  return total + value;
}
funktsiya summasi (... args) {
  return args.reduce (addNumber, 0);
}
sum (1,2,3); // 6

Yopish - bu ota-ona funktsiyasi bajarilgandan keyin ham ota-ona funktsiyasining parametrlariga kirish huquqiga ega bo'lgan ichki funktsiya. Keyingi misolga qarang:

funktsiya createCount () {
   holat holati = 0;
   return funktsiya soni () {
      holat + = 1;
      qaytish holati;
   }
}
let count = createCount ();
console.log (count ()); // 1
console.log (count ()); // 2

count () - bu o'rnatilgan funksiya. count () o'zgaruvchisiga holatdan foydalanadi. Bu ota-ona createCount () funktsiyasini ishlatishda saqlanib qoladi. count () - bu yopilish.

Yuqori buyurtma funktsiyasi boshqa funktsiyani kirish sifatida qabul qiladigan, funktsiyani qaytaradigan yoki ikkalasini ham bajaradigan funktsiya.

filtr (), xarita (), qisqartirish () yuqori darajadagi funktsiyalardir.

Sof funksiya bu faqat uning kiritilishiga asoslangan qiymatni qaytaradigan funktsiya. Sof funktsiyalar tashqi funktsiyalarning parametrlaridan foydalanmaydi. Sof funktsiyalar mutatsiyalarni keltirib chiqarmaydi.

Oldingi misollarda isEven (), doubleNumber (), addNumber () va sum () sof funktsiyalardir.

Xulosa

JavaScript-ning kuchi uning oddiyligidadir.

JavaScript asoslarini bilish bizni tushunishni va undan foydalanishni yaxshilaydi.

Discover Funktsional JavaScript BookAuthority tomonidan yaratilgan eng yaxshi yangi Funktsional dasturlash kitoblaridan biri deb topildi!

React-da funktsional dasturlash texnikasini qo'llash haqida ko'proq ma'lumot olish uchun Funktsional React-ni ko'rib chiqing.

Vue va Vuex haqida ko'proq ma'lumotni Vue.js komponentlariga tezkor kirishda o'qing.

Dizayn naqshlarining asoslarini qanday qo'llashni bilib oling.

Siz meni Twitter-da ham topishingiz mumkin.