Internet Windows Android
Kengaytirish

JavaScript. Ma'lumotlar turlari va operatorlari

JavaScript-da o'zgaruvchilar nomlarini yaratish uchun sintaksis qoidalari mavjud:

  • O'zgaruvchilar nomlari uchun quyidagi belgilar qo'llaniladi: a-z, A-Z, raqamlar, $, pastki chiziq (_).
  • O'zgaruvchilar nomlari raqam bilan boshlanmaydi.
  • JavaScript katta-kichik harflarga sezgir, shuning uchun dasturlashda buni yodda saqlang. itcounter va u C ko'rsatkichlar turli xil o'zgaruvchilardir.
  • JavaScript-da o'zgaruvchi nomi uzunligi bo'yicha hech qanday cheklov yo'q.

Yaroqli o'zgaruvchilar nomlariga misollar:

  • hisoblagich
  • $ _itcounter
  • it_counter

Noto'g'ri o'zgaruvchilar nomlari:

  • 9 xonali
  • hisoblagich
  • #hisoblagich
  • va hisoblagich

O'zgaruvchilar var buyrug'i bilan e'lon qilinadi.

O'zgaruvchilar qatorlar va raqamlarni saqlashi mumkin. Aslida, siz boshqa turdagi ma'lumotlarni saqlashingiz mumkin, ammo ular haqida keyinroq gaplashamiz.

String o'zgaruvchilari

O'zgaruvchiga satr yozish uchun uning qiymatini qo'sh yoki bitta qo'shtirnoq ichiga olish kerak.

Var $ stroka_1 = "Salom!"; var $ stroka_2 = "Diqqat!";

Bitta tirnoq bilan yaratilgan qatorga qoʻsh tirnoq qoʻshishingiz mumkin va aksincha.

Var $ stroka_1 = "" Salom! "Salom bu."; var $ stroka_2 = "" Diqqat! "ogohlantirishdir."; document.write ($ stroka_1); document.write ("

Xuddi shu turdagi qo'shtirnoqni chop etish uchun undan teskari chiziq belgisi bilan qochish kerak. Hammasi oddiy:


"); document.write ($ stroka_2);

O'zgaruvchi qiymatlari boshqa o'zgaruvchilarga tayinlanishi mumkin:

Var $ stroka_1 = "\" Salom! \ "Salom."; var $ stroka_2 = "\" Diqqat! \ "ogohlantirishdir."; document.write ($ stroka_1); document.write ("
"); document.write ($ stroka_2); $stroka_2 = $stroka_1; document.write ("
"); document.write ($ stroka_2);

Bu misolda biz $ stroka_2 o'zgaruvchisiga birinchi navbatda bitta satr qiymatini tayinladik, keyin esa unga $ stroka_1 o'zgaruvchisining qiymatini berdik.

Birlashtiruvchi qatorlar

Bir nechta satrlarni birlashtirish juda keng tarqalgan. Misol uchun, bizning oxirgi misolimiz juda og'ir.

JavaScript-da satrlarni birlashtirish (birlashtirish) belgi yordamida amalga oshiriladi + .

Teg bilan ajratilgan 2 ta satr o'zgaruvchisini ko'rsatish uchun
o'zgaruvchilar uchun bitta buyruq hujjatidan foydalanishingiz mumkin.write ().

Var $ stroka_1 = "" Salom! "Salom bu."; var $ stroka_2 = "" Diqqat! "ogohlantirishdir."; document.write ($ stroka_1 + "
"+ $ stroka_2);

Birlashtirish operatori + o'zgaruvchilarda ham foydalanish mumkin:

Var $ stroka_1 = "" Salom! "Salom bu."; var $ stroka_2 = "" Diqqat! "ogohlantirishdir."; var $ stroka_3 = $ stroka_1 + "
"+ $ stroka_2; document.write ($ stroka_3);

Raqamli o'zgaruvchilar

Raqamli o'zgaruvchini yaratish uchun unga raqamli qiymat berish kifoya.

Var $ count_1 = 23; var $ count_2 = 10,34; document.write ($ count_1 - $ count_2);

Endi yana bir misol:

Var $ count_1 = 23; // Raqamli o'zgaruvchi. var $ stroka_1 = "57"; // String o'zgaruvchisi. document.write ($ stroka_1 + $ count_1);

Ko'ryapsizmi, $ stroka_1 o'zgaruvchisining qiymati qo'shtirnoq ichiga olingan, shuning uchun u matnli o'zgaruvchidir. Keyin biz matn va raqamli o'zgaruvchini qo'shamiz va "5723" qatorini olamiz, JavaScript bunday hollarda shunday ishlaydi - u raqamni satrga aylantiradi va uni yig'ilgan qatorga qo'shadi.

Mantiqiy o'zgaruvchilar

O'zgaruvchilarning bunday turi mavjud - mantiqiy. Bu oddiy, faqat ikkita qiymat mavjud: haqiqiy va noto'g'ri, ya'ni haqiqiy va noto'g'ri.

Ushbu turdagi ma'lumotlar taqqoslash operatsiyalarida qo'llaniladi. Mana bir nechta oddiy misollar:

  • 9> 1 to'g'ri.
  • 2>5 - yolg'on.
var $ soni = 2

Keling, mantiqiy qiymatlarni arifmetik operatsiyalarga almashtirishga harakat qilaylik. Keling, ikkita taqqoslash operatsiyasini umumlashtiramiz:

Var $ soni = (3> 2) + (4> 2); document.write ($ hisobi);

Bu g'alati yozuv, men bilaman. Lekin $ count o'zgaruvchisi 2 bo'ladi. Matematik kontekstda rost = 1 va noto'g'ri = 0.

Taqqoslash operatorlari JavaScript-da tez-tez ishlatiladigan if iborasida ishlatiladi. If so'zi inglizchada - agar degan ma'noni anglatadi.

Var $ soni = 100; if ($ count == 100) document.write ("O'zgaruvchi $ count 100.");

Ushbu misolda xabar ko'rsatiladi, chunki if bayonotining sharti ($ count == 100) to'g'ri. Agar siz $ count o'zgaruvchisining qiymatini 99 ga o'zgartirsangiz, u holda shart ($ count == 100) noto'g'ri bo'ladi va ekranda hech narsa ko'rsatilmaydi.

Oddiy o'zgaruvchilar turlari

JavaScript-da o'zgaruvchilar bir necha turlarga bo'linadi. Biz allaqachon string, raqamli va mantiqiy (mantiqiy) turlarni ko'rib chiqdik. Mana oddiy turlarning kengroq ro'yxati:

  • string - string o'zgaruvchisi.
  • raqam raqamli o'zgaruvchidir.
  • boolean mantiqiy o'zgaruvchidir.
  • null - "hech narsa" maxsus qiymati.
  • aniqlanmagan - "qiymat tayinlanmagan" yozing.

Null o'zgaruvchisining qiymati yagona mumkin bo'lgan null qiymatdan iborat bo'lgan o'ziga xos null turini hosil qiladi. null - "hech narsa" yoki "qiymat noma'lum" ma'nosiga ega bo'lgan maxsus qiymat.

Var $ narxi = null; // bu narx ma'lum emasligini anglatadi.

JavaScript-da siz typeof bayonotidan foydalanib o'zgaruvchilar turini bilib olishingiz mumkin.

Var $ soni; document.write (typeof $ count + "
"); var $ count = rost; document.write (typeof $ count +"
"); var $ count = " rost "; document.write ($ count + turi"
"); var $ count = 100; document.write (typeof $ count +"
"); var $ count = null; document.write (typeof $ count +"
");

Bayonot turi uchun sintaksis quyidagicha bo'lishi mumkin:

  • $ soni turi
  • typeof ($ hisobi)

Shunday qilib, oxirgi misoldagi kodni ishga tushiring va natijani ko'ring. Null o'zgaruvchining turi ob'ekt bo'ladi. Bu tildagi xatodir va u allaqachon yozilgan JavaScript skriptlarining tilning yangi versiyalari bilan mosligini saqlab qolish zarurati tufayli hech qachon tuzatilmaydi.

Ob'ekt tipi endi ibtidoiy tip emas, bu haqda boshqa darslarda gaplashamiz.

String, raqam, mantiqiy, massiv, ob'ekt.

JavaScript ma'lumotlar turlari

JavaScript o'zgaruvchilari ko'p bo'lishi mumkin ma'lumotlar turlari: raqamlar, satrlar, massivlar, ob'ektlar va boshqalar:

var uzunligi = 16; // Raqam
var lastName = "Jonson"; // String
var cars = ["Saab", "Volvo", "BMW"]; // Massiv
var x = (ismi: "Jon", familiyasi: "Doe"); // Ob'ekt

Ma'lumotlar turi tushunchasi

Dasturlashda ma'lumotlar turlari muhim tushunchadir.

O'zgaruvchilar bilan ishlash imkoniyatiga ega bo'lish uchun tur haqida biror narsa bilish muhimdir.

Ma'lumotlar turlarisiz kompyuter ushbu muammoni xavfsiz hal qila olmaydi:

Var x = 16 + "Volvo";

"Volvo" ni o'n oltiga qo'shish mantiqiymi? U xato qiladimi yoki natija beradimi?

JavaScript yuqoridagi misolni quyidagicha ko'rib chiqadi:

Var x = "16" + "Volvo";

Raqam va satr qo'shilganda, JavaScript raqamni satr sifatida ko'radi.

JavaScript iboralarni chapdan o'ngga qarab baholaydi. Turli xil ketma-ketliklar turli xil natijalarga olib kelishi mumkin:

Birinchi misolda JavaScript "Volvo" ga yetguncha 16 va 4 ni raqamlar sifatida ko'radi.

Ikkinchi misolda, birinchi operand satr bo'lganligi sababli, barcha operandlar satr sifatida ko'rib chiqiladi.

JavaScript dinamik turlarga ega

JavaScript dinamik turlarga ega. Bu shuni anglatadiki, bir xil o'zgaruvchi turli xil turlari sifatida ishlatilishi mumkin:

misol

var x; // Endi x aniqlanmagan
var x = 5; // Endi x - bu raqam
var x = "Jon"; // Endi x - bu String

JavaScript satrlari

Satr (yoki matn qatori) "Jon Doe" kabi belgilar qatoridir.

Satrlar qo'shtirnoq ichida yoziladi. Siz bitta yoki ikkita tirnoqdan foydalanishingiz mumkin:

misol

var carName = "Volvo XC60"; // Ikki tirnoq yordamida
var carName = "Volvo XC60"; // Yagona tirnoqlardan foydalanish

Agar ular satr atrofidagi tirnoqlarga mos kelmasa, qator ichida tirnoq belgilaridan foydalanishingiz mumkin:

misol

var answer = "It" s aright "; // Ikki tirnoq ichida bitta tirnoq
var answer = "U "Jonni" deb ataladi"; // Ikki tirnoq ichida bitta tirnoq
var answer = "U "Jonni" deb ataladi"; // Bitta tirnoq ichida qo'sh tirnoq

O'zingiz sinab ko'ring"

Keyinchalik ushbu qo'llanmada strings haqida ko'proq bilib olasiz.

JavaScript raqamlari

JavaScript-da faqat bitta turdagi raqamlar mavjud.

Raqamlar kasrsiz yoki kasrsiz yozilishi mumkin:

misol

var x1 = 34,00; // O'nli kasrlar bilan yozilgan
var x2 = 34; // O'nli kasrlarsiz yoziladi

Juda katta yoki ortiqcha kichik raqamlar ilmiy (eksponensial) belgilar bilan yozilishi mumkin:

Raqamlar haqida keyinroq ushbu qo'llanmada bilib olasiz.

JavaScript mantiqiy

Mantiqiy faqat ikkita qiymatga ega bo'lishi mumkin: true yoki false.

misol

var x = rost;
var y = noto'g'ri;

Mantiqiy ko'pincha shartli testda qo'llaniladi.

Shartli test haqida ko'proq ma'lumotni keyinroq ushbu qo'llanmada bilib olasiz.

JavaScript massivlari

JavaScript massivlari kvadrat qavslar yordamida yoziladi.

massiv elementlari vergul bilan ajratiladi.

Quyidagi kod uchta elementni (avtomobil nomlarini) o'z ichiga olgan cars deb nomlangan massivni e'lon qiladi (yaratadi):

Massiv indekslari noldan boshlanadi, ya'ni birinchi element, ikkinchi va hokazo.

Massivlar haqida ko'proq ma'lumotni keyinroq ushbu qo'llanmada bilib olasiz.

JavaScript obyektlari

JavaScript obyektlari jingalak qavslar ichiga olingan.

Obyekt xossalari nom sifatida yoziladi: qiymat juftlari, vergul bilan ajratilgan.

Yuqoridagi misoldagi ob'ekt (shaxs) 4 ta xususiyatga ega: ism, familiya, yosh va ko'z rangi.

Keyinchalik ushbu qo'llanmada ob'ektlar haqida ko'proq bilib olasiz.

TypeOf operatori

Siz JavaScript kodidan foydalanishingiz mumkin turiof JavaScript o'zgaruvchisi turini topish uchun operator:

misol

typeof "Jon" // Satrni qaytaradi
typeof 3.14 // Raqamni qaytaradi
typeof false // Booleanni qaytaradi
typeof // Ob'ektni qaytaradi
typeof (ism: "Jon", yosh: 34) // Ob'ektni qaytaradi

O'zgaruvchi - bu qiymat berilgan identifikator. O'zgaruvchiga dasturda kirish mumkin, unga tayinlangan qiymat bilan shu tarzda ishlaydi.

O'z-o'zidan, JavaScript o'zgaruvchisi unda saqlanadigan qiymatlar turi haqida ma'lumotni o'z ichiga olmaydi. Bu shuni anglatadiki, o'zgaruvchiga, masalan, satrga yozish orqali siz keyinchalik unga raqam yozishingiz mumkin. Bunday operatsiya dasturda xatolikka olib kelmaydi. Shuning uchun JavaScript ba'zan "tiplanmagan" til deb ataladi.

O'zgaruvchidan foydalanishdan oldin uni var yoki let kalit so'zi yordamida e'lon qilish kerak. Konstanta haqida gap ketganda, const kalit so'zi ishlatiladi. Siz ushbu kalit so'zlardan foydalanmasdan o'zgaruvchini e'lon qilishingiz va unga qiymat belgilashingiz mumkin, ammo bu tavsiya etilmaydi.

▍Var kalit so'zi

ES2015 dan oldin, var kalit so'zidan foydalanish o'zgaruvchilarni e'lon qilishning yagona usuli edi.

Var a = 0
Agar bu konstruktsiyada var o'tkazib yuborilsa, qiymat e'lon qilinmagan o'zgaruvchiga tayinlanadi. Ushbu operatsiyaning natijasi dasturning qaysi rejimda bajarilishiga bog'liq.

Shunday qilib, agar qattiq rejim yoqilgan bo'lsa, bu xatolikka olib keladi. Agar qat'iy rejim yoqilmagan bo'lsa, o'zgaruvchi bilvosita e'lon qilinadi va global ob'ektga tayinlanadi. Xususan, bu funktsiyada shu tarzda bilvosita e'lon qilingan o'zgaruvchi funktsiya o'z ishini tugatgandan so'ng mavjud bo'lishini anglatadi. Odatda, funktsiyalarda e'lon qilingan o'zgaruvchilar o'z chegaralaridan "ketmasligi" kutiladi. Bu shunday ko'rinadi:

Funktsiya notVar () (bNotVar = 1 // buni qilmaslik yaxshiroq) notVar () console.log (bNotVar)
Konsol 1 ball oladi, odatda dasturdan bunday xatti-harakatni hech kim kutmaydi, bNotVar = 1 ifodasi o'zgaruvchini e'lon qilish va ishga tushirishga urinish emas, balki funksiya doirasidan tashqarida bo'lgan o'zgaruvchiga kirishga urinish sifatida ko'rinadi ( bu juda normal). Natijada, yashirin o'zgaruvchan deklaratsiyalar o'quvchini chalkashtirib yuboradi va dasturning kutilmagan xatti-harakatlariga olib kelishi mumkin. Biz funksiyalar va qamrovlar haqida keyinroq gaplashamiz, ammo hozircha ifodaning ma’nosi o‘zgaruvchini e’lon qilish bo‘lsa, maxsus kalit so‘zlardan foydalanishga harakat qiling. Agar ushbu misolda funksiyaning tanasi var bNotVar = 1 shaklida qayta yozilsa, yuqoridagi kod parchasini ishga tushirishga urinish xato xabariga olib keladi (uni brauzer konsolida ko'rishingiz mumkin).

Misol uchun, u quyidagicha ko'rinishi mumkin: Tugallanmagan ReferenceError: bNotVar aniqlanmagan. Uning ma'nosi dastur mavjud bo'lmagan o'zgaruvchi bilan ishlay olmasligi bilan bog'liq. Kutilmaganda o'zini tutishi mumkin bo'lgan tushunarsiz kod yozishdan ko'ra, dasturni birinchi marta ishga tushirganingizda bunday xato xabarini ko'rish yaxshiroqdir.

Agar o'zgaruvchini e'lon qilishda u ishga tushirilmasa yoki hech qanday qiymat berilmasa, unga avtomatik ravishda aniqlanmagan qiymat beriladi.

Var a // typeof a === "aniqlanmagan"
var kalit so'zi bilan e'lon qilingan o'zgaruvchilar ko'p marta qayta e'lon qilinishi mumkin, ularga yangi qiymatlar tayinlanadi (lekin bu o'quvchini chalkashtirib yuborishi mumkin).

Var a = 1 var a = 2
Bitta ifodada bir nechta o'zgaruvchilar e'lon qilinishi mumkin:

Var a = 1, b = 2
O'zgaruvchining qamrovi - bu o'zgaruvchi mavjud bo'lgan (ko'rinadigan) dastur maydoni.

Funksiyadan tashqarida var kalit soʻzi bilan ishga tushirilgan oʻzgaruvchi global obyektga tayinlanadi. U global miqyosga ega va dasturning istalgan joyidan foydalanish mumkin. Agar oʻzgaruvchi funksiya ichidagi var kalit soʻzi yordamida eʼlon qilingan boʻlsa, u faqat shu funksiya ichida koʻrinadi va u uchun mahalliy oʻzgaruvchi hisoblanadi.

Agar oʻzgaruvchi nomi global miqyosdagi oʻzgaruvchining nomiga toʻgʻri keluvchi var funksiyasidan foydalangan holda funksiyada eʼlon qilinsa, u global oʻzgaruvchi bilan “ust-boshlanadi”. Ya'ni, funksiya ichidagi bunday o'zgaruvchiga kirishda uning mahalliy versiyasidan foydalaniladi.

Bloklar (jingalak qavslar ichiga olingan kod sohalari) yangi doiralar yaratmasligini tushunish muhimdir. Funktsiya chaqirilganda yangi qamrov yaratiladi. var kalit so'zi blok doirasiga emas, balki funksional doira deb ataladigan narsaga ega.

Agar o'zgaruvchi funktsiya kodida e'lon qilingan bo'lsa, u butun funktsiya kodiga ko'rinadi. Agar o'zgaruvchi funktsiya kodining oxirida var yordamida e'lon qilingan bo'lsa ham, siz kodning boshida ham unga murojaat qilishingiz mumkin, chunki JavaScript ko'tarish mexanizmidan foydalanadi. Ushbu mexanizm o'zgaruvchan deklaratsiyalarni "ko'taradi", lekin ularni ishga tushirish operatsiyalarini emas. Bu chalkashlik manbai bo'lishi mumkin, shuning uchun funktsiyangizning boshida o'zgaruvchilarni e'lon qilishni qoidaga aylantiring.

▍let kalit so'zi

Let kalit so'zi ES2015 da taqdim etilgan va uni oddiygina var ning "blok" versiyasi deb atash mumkin. Let kalit so'zi bilan e'lon qilingan o'zgaruvchilar u e'lon qilingan blok, bayonot yoki ifoda va ichki bloklarga qamrab olinadi.

“Let” so‘zining o‘zi chalkashdek tuyulsa, uning o‘rniga “let” so‘zini ishlatishni tasavvur qilishingiz mumkin. Keyin let color = "qizil" iborasini ingliz tiliga shunday tarjima qilish mumkin: "rang qizil bo'lsin" va rus tiliga - bu kabi: "rang qizil bo'lsin".

Let kalit so'zidan foydalanish orqali siz var kalit so'zi bilan bog'liq noaniqliklardan xalos bo'lishingiz mumkin (masalan, let yordamida bir xil o'zgaruvchini ikki marta e'lon qila olmaysiz). Funktsiyadan tashqarida let dan foydalanish, masalan, tsikllarni ishga tushirishda global o'zgaruvchilar yaratmaydi.

Masalan, bunday kod xatoga yo'l qo'yadi:

uchun (i = 0; i< 5; i++) { console.log(i) } console.log(i)
Agar siklni ishga tushirish vaqtida var kalit so'zi yordamida hisoblagich i e'lon qilinsa, u o'z ishini tugatgandan so'ng i tsikldan tashqarida mavjud bo'ladi.

Hozirgi vaqtda zamonaviy standartlar asosida JS dasturlarini ishlab chiqishda var dan butunlay voz kechib, faqat let va const kalit so'zlaridan foydalanish mumkin.

▍const kalit so'zi

Var yoki let kalit so'zlari yordamida e'lon qilingan o'zgaruvchilar ustidan yozish mumkin. Agar bu kalit so'zlar o'rniga const ishlatilsa, uning yordamida e'lon qilingan va ishga tushirilgan konstantaga yangi qiymat berish mumkin emas.

Const a = "test"
Bu misolda a doimiysiga yangi qiymat berish mumkin emas. Ammo shuni ta'kidlash kerakki, agar a raqam kabi ibtidoiy qiymat emas, balki ob'ekt bo'lsa, const kalit so'zidan foydalanish bu ob'ektni o'zgarishlardan himoya qilmaydi.

Ob'ekt o'zgaruvchiga yozilgan deb aytishganda, ular aslida nimani anglatadi, o'zgaruvchi ob'ektga havolani saqlaydi. Ushbu havolani o'zgartirib bo'lmaydi va havola olib boradigan ob'ektning o'zini o'zgartirish mumkin.

const kalit so'zi ob'ektlarni o'zgarmas qilib qo'ymaydi. U shunchaki tegishli konstantalarda yozilgan ularga havolalarni o'zgarishlardan himoya qiladi. Bu shunday ko'rinadi:

Const obj = () console.log (obj.a) obj.a = 1 // ishlayotgan console.log (obj.a) // obj = 5 // xatolik yuzaga keladi
Initsializatsiya vaqtida doimiy objga yangi bo'sh ob'ekt yoziladi. Uning mavjud bo'lmagan xususiyatiga kirishga urinish a xatolikka olib kelmaydi. Konsol aniqlanmagan bo'ladi. Shundan so'ng, biz ob'ektga yangi xususiyat qo'shamiz va unga yana kirishga harakat qilamiz. Bu safar ushbu xususiyatning qiymati konsolga yuboriladi - 1. Agar siz misolning oxirgi satriga izohni olib tashlasangiz, ushbu kodni bajarishga urinish xatolikka olib keladi.

const kalit so'zi let so'ziga juda o'xshaydi, xususan, u blokli.

Zamonaviy sharoitda, qiymatlari o'zgartirilishi rejalashtirilmagan barcha ob'ektlarni e'lon qilish uchun const kalit so'zidan foydalanish juda maqbuldir, faqat alohida holatlarda ruxsat beriladi. Nega? Gap shundaki, dasturlarni murakkablashtirmaslik va xatolarga yo'l qo'ymaslik uchun mavjud bo'lgan eng oddiy konstruktsiyalardan foydalanishga intilish yaxshiroqdir.

Ma'lumotlar turlari

JavaScript ba'zan "tiplanmagan" til deb ataladi, ammo bu unday emas. To'g'ri, siz o'zgaruvchilarga har xil turdagi qiymatlarni yozishingiz mumkin, ammo JavaScript-da ma'lumotlar turlari mavjud. Xususan, biz ibtidoiy va ob'ektli ma'lumotlar turlari haqida gapiramiz.

Qiymatning ma'lumotlar turini aniqlash uchun typeof operatoridan foydalanishingiz mumkin. Operand turini ko'rsatadigan qatorni qaytaradi.

▍Birlamchi ma'lumotlar turlari

Mana JavaScript ibtidoiy ma'lumotlar turlari ro'yxati:
  • raqam (raqam)
  • qator (tor)
  • mantiqiy (mantiqiy qiymat)
  • null (maxsus qiymat null)
  • aniqlanmagan (maxsus qiymat aniqlanmagan)
  • belgi (belgi, maxsus holatlarda qo'llaniladi, ES6 da kiritilgan)
Bu yerda ma'lumotlar turlarining nomlari typeof operatori tomonidan qaytariladigan shaklda ko'rsatilgan.

Keling, ushbu ro'yxatdagi eng ko'p ishlatiladigan ma'lumotlar turlari haqida gapiraylik.

Raqam turi

JavaScript raqamlari qiymatlari 64 bitli ikki aniqlikdagi suzuvchi nuqtali raqamlar sifatida taqdim etiladi.

Raqamli harflar kodda butun, kasr sonlar esa o'nli yozuvda ifodalanadi. Raqamlarni yozish uchun boshqa usullardan foydalanishingiz mumkin. Misol uchun, agar sonli harfning boshida 0x prefiksi bo'lsa, u o'n oltilik yozuvda yozilgan raqam sifatida talqin qilinadi. Raqamlar ko'rsatkichli yozuvda ham yozilishi mumkin (bunday raqamlarda siz e harfini topishingiz mumkin).

Mana butun sonlarni yozishga misollar:

10 5354576767321 0xCC // o'n oltilik raqam
Mana kasr sonlar.

3.14 .1234 5.2e4 //5.2 * 10 ^ 4
Raqamli harflar (bu xatti-harakat ba'zi boshqa ibtidoiy turlar uchun ham xosdir), siz ularni ob'ekt deb atamoqchi bo'lganingizda, operatsiya bajarilayotganda avtomatik ravishda mos keladigan ob'ektlarga aylantiriladi, ular "ob'ektni o'rash" deb ataladi. Bunday holda, biz ob'ektni o'rash raqami haqida gapiramiz.

Masalan, Google Chrome konsolida raqamli harflar yozilgan a o'zgaruvchisiga ob'ekt sifatida kirishga urinish qanday ko'rinishga ega.

Raqamli ob'ektni o'rash bo'yicha maslahat

Agar, masalan, Number turidagi ob'ektning toString () usulidan foydalansangiz, u raqamning satr tasvirini qaytaradi. Brauzer konsolida (va oddiy kodda) bajarilishi mumkin bo'lgan mos keladigan buyruq quyidagicha ko'rinadi:

A.toString ()
Usul nomidan keyin qo'sh qavslarga e'tibor bering. Agar ular ta'minlanmagan bo'lsa, tizim xatolikka yo'l qo'ymaydi, lekin kutilgan natija o'rniga konsol 5 raqamining simli tasviriga umuman o'xshamaydigan narsani ko'rsatadi.

Global Number ob'ektidan konstruktor sifatida foydalanish mumkin, uning yordami bilan yangi raqamlar yaratilishi mumkin (garchi u bu shaklda deyarli ishlatilmasa ham), u o'z misollarini yaratmasdan mustaqil ob'ekt sifatida ham ishlatilishi mumkin (ya'ni, ba'zi raqamlar bilan ifodalangan). yordam beradi). Masalan, uning Number.MAX_VALUE xususiyati JavaScript-da ifodalanishi mumkin bo'lgan maksimal raqamli qiymatni o'z ichiga oladi.

String turi

String qiymatlari belgilar ketma-ketligidir. Bunday qiymatlar bitta yoki ikkita tirnoq ichiga olingan satr harflari sifatida belgilanadi.

"Bir qator" "Boshqa qator"
String qiymatlarini teskari chiziq belgisi yordamida bir nechta qismlarga bo'lish mumkin.

"A \ string"
Satrda qochish ketma-ketliklari bo'lishi mumkin, ular satr konsolga chop etilganda izohlanadi. Masalan, \ n ketma-ketligi satr tasmasi belgisini bildiradi. Teskari chiziq belgisi qo'shtirnoq ichiga olingan qatorlarga qo'shtirnoq qo'shish uchun ham ishlatilishi mumkin. Qo'shtirnoq belgisidan \ bilan qochish tizim uni maxsus belgi sifatida ko'rib chiqmasligiga olib keladi.

"Men ishlab chiquvchiman"
Satrlarni + operatori yordamida birlashtirish mumkin.

"A" + "string"

Shablon harflari

ES2015 shablon literallari yoki shablon satrlari deb ataladigan narsalarni taqdim etdi. Ular teskari belgilar (`) bilan o'ralgan satrlar va ba'zi qiziqarli xususiyatlarga ega.

`string`
Misol uchun, siz JavaScript ifodalarini baholash natijasi bo'lgan shablon harflarida ba'zi qiymatlarni almashtirishingiz mumkin.

`$ (bir narsa) bilan string` `$ boʻlgan satr (bir narsa + bir narsaElse)` `$ (obj.something ()) li satr`
Teskari belgilardan foydalanish ko'p qatorli satr harflarini yozishni osonlashtiradi:

`$ (bir narsa) bo'lgan satr`

Boolean turi

JavaScript-da mantiqiy so'zlar bilan ishlashda ishlatiladigan bir nechta ajratilgan so'zlar mavjud - haqiqiy va noto'g'ri. ==, ===, kabi taqqoslash operatsiyalari< , >, rost yoki yolgʻonni qaytaring.

Mantiqiy ifodalar dastur oqimini boshqarishga yordam berish uchun if va while kabi konstruksiyalarda qo'llaniladi.

Shuni ta'kidlash kerakki, agar rost yoki noto'g'ri qiymat kutilgan bo'lsa, siz til tomonidan avtomatik ravishda haqiqiy (haqiqat) yoki noto'g'ri (noto'g'ri) deb talqin qilinadigan boshqa qiymatlardan foydalanishingiz mumkin.

Xususan, quyidagilar noto'g'ri qiymatlardir:

0 -0 NaN undefined null "" // bo'sh qator
Boshqa barcha qiymatlar to'g'ri.

Null turi

JavaScript maxsus qiymatga ega, null, bu qiymat yo'qligini ko'rsatadi. Shunga o'xshash ma'nolar boshqa tillarda ham qo'llaniladi.

Belgilanmagan tur

O'zgaruvchiga yozilgan aniqlanmagan qiymat bu o'zgaruvchi ishga tushirilmaganligini va uning qiymati yo'qligini ko'rsatadi.

Bu qiymat qaytish kalit so'zi yordamida natijani aniq qaytarmaydigan funksiyalardan avtomatik ravishda qaytariladi. Agar funktsiya chaqirilganda ko'rsatilmagan ba'zi parametrlarni qabul qilsa, u ham aniqlanmaganga o'rnatiladi.

Qiymatni aniqlanmaganligini tekshirish uchun siz quyidagi konstruktsiyadan foydalanishingiz mumkin.

O'zgaruvchining turi === "aniqlanmagan"

▍Obyektlar

Barcha ibtidoiy bo'lmagan qiymatlar ob'ekt turiga tegishli. Biz funktsiyalar, massivlar, biz "ob'ektlar" deb ataydigan narsalar va boshqa ko'plab ob'ektlar haqida gapiramiz. Ushbu ma'lumotlar turlarining barchasi ob'ekt turiga asoslanadi va ular ko'p jihatdan farq qilsalar ham, ularning umumiy tomonlari ham ko'p.

Ifodalar

Ifodalar - bu amalga oshirilgan hisob-kitoblar asosida ma'lum bir qiymatni qayta ishlash va olish mumkin bo'lgan kod bo'laklari. JavaScript-da ifodalarning bir nechta toifalari mavjud.

Arifmetik ifodalar

Raqamlar bilan baholanadigan iboralar ushbu turkumga kiradi.

1/2 i ++ i - = 2 i * 2

String ifodalari

Bunday ifodalarni baholash natijasi satrlardir.

"A" + "string" "A" + = "string"

Birlamchi ifodalar

Literallar, konstantalar, identifikator murojaatlari shu turkumga kiradi.

2 0.02 "bir narsa" rost noto'g'ri bu // ijro konteksti, joriy ob'ektga havola aniqlanmagan i // bu erda i o'zgaruvchi yoki doimiy
Bunga ba'zi JavaScript kalit so'zlari va konstruktsiyalari ham kiradi.

Funktsiya klassi funktsiyasi * // rentabellik generatori // rentabellik generatorini to'xtatib turish / davom ettirish buyrug'i * // boshqa iterator yoki generatorga asinxronizatsiya funktsiyasini topshirish * // asinxron funktsional ifodani kutish // asinxron funksiya bajarilishini kutish / naqsh / i // muntazam ifoda ( ) // guruhlash

Massiv va obyektni ishga tushirish ifodalari

// massiv harfi () // ob'ekt harfi (a: 1, b: 2) (a: (b: 1))

Mantiqiy ifodalar

Mantiqiy ifodalar mantiqiy operatorlardan foydalanadi, ularni baholash natijasi mantiqiy qiymatlardir.

A && b a || b! a

Mulkga kirish ifodalari

Bu ifodalar ob'ektlarning xossalari va usullariga kirish imkonini beradi.

Object.property // ob'ekt ob'ektining xususiyatiga (yoki usuliga) kirish ["xususiyat"]

Obyekt yaratish ifodalari

yangi ob'ekt () yangi (1) yangi MyRectangle ("nom", 2, (a: 4))

Funktsiya deklaratsiyasi ifodalari

funktsiya () () funktsiya (a, b) (qaytish a * b) (a, b) => a * b a => a * 2 () => (2-ga qaytish)

Qiyin ifodalar

Bunday iboralar ob'ektlarning funktsiyalari yoki usullarini chaqirish uchun ishlatiladi.

A.x (2) window.resize ()

Ob'ektlar bilan ishlash

Yuqorida biz allaqachon ob'ektlarga duch keldik, ob'ekt literallari haqida, ularning usullarini chaqirish, ularning xususiyatlariga kirish haqida. Bu erda biz ob'ektlar haqida batafsilroq gaplashamiz, xususan, prototipli meros mexanizmini va class kalit so'zidan foydalanishni ko'rib chiqamiz.

▍ Prototipli meros

JavaScript zamonaviy dasturlash tillari orasida prototip merosni qo'llab-quvvatlashi bilan ajralib turadi. Ko'pgina ob'ektga yo'naltirilgan tillar sinfga asoslangan meros modelidan foydalanadi.

Har bir JavaScript ob'ekti prototipi bo'lgan boshqa ob'ektga ishora qiluvchi maxsus xususiyatga (__proto__) ega. Ob'ekt prototipning xususiyatlari va usullarini meros qilib oladi.

Faraz qilaylik, bizda ob'ekt harfi yordamida yaratilgan ob'ekt bor.

Const car = ()
Yoki Object konstruktori yordamida obyekt yaratdik.

Const car = yangi ob'ekt ()
Ikkala holatda ham avtomobil prototipi Object.prototype bo'ladi.

Agar siz ob'ekt bo'lgan massiv yaratsangiz, uning prototipi Array.prototype ob'ekti bo'ladi.

Const list = // yoki shunday const list = new Array ()
Buni quyidagicha tekshirishingiz mumkin.

Avtomobil .__ proto__ == Ob'ekt.prototip // haqiqiy avtomobil .__ proto__ == yangi Ob'ekt () .__ proto__ // haqiqiy ro'yxat .__ proto__ == Ob'ekt.prototip // noto'g'ri ro'yxat .__ proto__ == Array.prototip / / haqiqiy ro'yxat .__ proto__ == yangi massiv () .__ proto__ // rost
Bu erda biz __proto__ xususiyatidan foydalandik, u ishlab chiquvchi uchun mavjud bo'lishi shart emas, lekin odatda siz unga murojaat qilishingiz mumkin. Shuni ta'kidlash kerakki, ob'ektning prototipini olishning ishonchli usuli global Ob'ektning getPrototypeOf () usulidan foydalanishdir.

Object.getPrototypeOf (yangi Ob'ekt ())
Prototipning barcha xususiyatlari va usullari ushbu prototipga ega bo'lgan ob'ekt uchun mavjud. Misol uchun, ularning ro'yxati massiv uchun qanday ko'rinishga ega.


Massiv maslahati

Barcha ob'ektlar uchun asosiy prototip Object.prototype hisoblanadi.

Array.prototype .__ proto__ == Object.prototype
Object.prototype prototipiga ega emas.

Yuqorida biz ko'rgan narsa prototip zanjirining namunasidir.

Ob'ektning xossasi yoki usuliga kirishga harakat qilganingizda, agar ob'ektning o'zida bunday xususiyat yoki usul bo'lmasa, ular uning prototipida, keyin prototip prototipida qidiriladi va kerakli narsa topilmaguncha yoki prototip zanjiri tugamaguncha.

Yangi operator yordamida ob'ektlar yaratish va ob'ekt literallari yoki massiv literallaridan foydalanish bilan bir qatorda, Object.create () usuli yordamida ob'ektni yaratishingiz mumkin. Ushbu usulga o'tkazilgan birinchi argument u yaratgan ob'ektning prototipi bo'ladigan ob'ektdir.

Const car = Object.create (Object.prototype)
IsPrototypeOf () usuli yordamida ob'ekt boshqa ob'ektning prototip zanjirining bir qismi ekanligini tekshirishingiz mumkin.

Const ro'yxati = Array.prototype.isPrototypeOf (ro'yxat)

Konstruktor funktsiyalari

Yuqorida biz tilda mavjud bo'lgan konstruktor funksiyalaridan foydalangan holda yangi ob'ektlar yaratdik (ularni chaqirishda new kalit so'zi ishlatiladi). Bunday funktsiyalarni o'zingiz yaratishingiz mumkin. Keling, bir misolni ko'rib chiqaylik.

Funktsiya Shaxs (ism) (tush.name = ism) Shaxs.prototip.salom = funktsiya () (console.log (this.name)) ruxsat odam = yangi Shaxs ("Flavio") person.salom () console.log ( Person.prototype.isPrototypeOf (odam))
Bu erda biz konstruktor funksiyasini yaratamiz. Siz uni chaqirganingizda, konstruktor tanasidagi this kalit so'zi bilan ko'rsatilgan yangi ob'ekt yaratiladi. Biz bu obyektga name xossasini qo'shamiz va konstruktorga o'tgan narsani unga yozamiz. Ushbu ob'ekt konstruktordan avtomatik ravishda qaytariladi. Konstruktor funksiyasidan foydalanib, nom xossalari ular yaratilganda konstruktorga uzatilgan narsalarni o'z ichiga oladigan ko'plab ob'ektlarni yaratishingiz mumkin.

Konstruktorni yaratgandan so'ng, biz uning prototipiga ushbu funktsiya yordamida yaratilgan ob'ektning name xususiyatining qiymatini konsolga chop etadigan funksiya qo'shamiz. Ushbu konstruktor yordamida yaratilgan barcha ob'ektlar bir xil prototipga ega bo'ladi va shuning uchun bir xil salom () funktsiyasidan foydalanadi. Buni Shaxs tipidagi boshqa ob'ekt yaratish va uning salom () funksiyasini allaqachon misoldagi ob'ekt funktsiyasi bilan solishtirish orqali tekshirish oson (bu holda funksiya nomi qavssiz yoziladi).

▍Darslar

ES6 standartida JavaScript "sinf" sifatida tanildi.

Bungacha JavaScript faqat yuqorida tavsiflangan prototip meros mexanizmidan foydalanishi mumkin edi. JS ga boshqa tillardan kelgan dasturchilar uchun bu mexanizm g'ayrioddiy ko'rinardi. Shuning uchun tilda sinflar paydo bo'ldi, ular aslida prototip meros mexanizmi uchun "sintaktik shakar" hisoblanadi. Ya'ni, an'anaviy usul yordamida yaratilgan ob'ektlar ham, sinflar yordamida yaratilgan ob'ektlar ham prototiplarga ega.

Sinf deklaratsiyasi

Sinf deklaratsiyasi shunday ko'rinadi.

Sinf shaxsi (konstruktor (ism) (this.name = ism) salom () ("Salom, men" + this.name + "." deb qaytaring))
Sinf yangi ClassIdentifier () konstruksiyasi yordamida yangi ob'ektlarni yaratish uchun ishlatilishi mumkin bo'lgan identifikatorga ega.

Yangi obyekt yaratishda konstruktor usuli chaqiriladi, unga parametrlar uzatiladi.

Usullar sinfda e'lon qilinishi mumkin. Bizning holatda, salom () - bu sinfdan yaratilgan barcha ob'ektlar tomonidan chaqirilishi mumkin bo'lgan usul. Bu Person sinfi yordamida yangi ob'ekt yaratishga o'xshaydi.

Const flavio = yangi shaxs ("Flavio") flavio.hello ()

Sinfga asoslangan meros

Sinflar boshqa sinflarni kengaytirishi mumkin. Bunday sinflardan yaratilgan ob'ektlar asl sinfning usullarini ham, kengaytirilgan sinfda aniqlangan usullarni ham meros qilib oladi.

Agar boshqa sinfni kengaytiruvchi sinf (ushbu sinfdan meros bo'lib qolgan) nomi ota-sinfniki bilan bir xil bo'lgan usulga ega bo'lsa, bu usul dastlabkisidan ustun turadi.

Class Programmer extensions Person (salom () (qaytish super.hello () + "Men dasturchiman.")) Const flavio = new Programmer ("Flavio") flavio.hello ()
Yuqoridagi misoldagi salom () usulini chaqirish Salom, men Flavioman qatorini qaytaradi. Men dasturchiman.

Sinflar o'zgaruvchilar (xususiyatlar) mavjudligini ta'minlamaydi, sinflar yordamida yaratilgan ob'ektlarning xossalari konstruktorda sozlanishi kerak.

Sinf ichida siz super kalit so'zidan foydalanib, ota-sinfga murojaat qilishingiz mumkin.

Statik usullar

Sinfda tavsiflangan usullarni sinfning o'ziga emas, balki ushbu sinf asosida yaratilgan ob'ektlarga murojaat qilish orqali chaqirish mumkin. Statik usullarni to'g'ridan-to'g'ri sinfga murojaat qilish orqali chaqirish mumkin.

Shaxsiy usullar

JavaScript-da xususiy (xususiy, shaxsiy) usullarni e'lon qilish imkonini beruvchi o'rnatilgan mexanizm mavjud emas. Ushbu cheklovni, masalan, yopilishlar yordamida chetlab o'tish mumkin.

Qabul qiluvchilar va sozlagichlar

Sinfda usullarni ularning oldidan get yoki set kalit so'zlari bilan tavsiflashingiz mumkin. Bu sizga qabul qiluvchilar va sozlagichlar - sinfdan yaratilgan ob'ektlarning xususiyatlariga kirishni boshqarish uchun ishlatiladigan funktsiyalarni yaratishga imkon beradi. Pseudo-xususiyatning qiymatini o'qishga urinilganda getter chaqiriladi va unga yangi qiymat yozishga harakat qilinganda sozlashchi chaqiriladi.

Sinf shaxsi (konstruktor (ism) (this.userName = name) to'siq nomi (qiymat) (this.userName = qiymat) olish nomi () (this.userNameni qaytaring))

Natijalar

Ushbu maqolada biz JavaScript-da o'zgaruvchilar, ma'lumotlar turlari, ifodalar va ob'ektlar bilan ishlash haqida gaplashdik. Funktsiyalar bizning keyingi maqolamizning mavzusi bo'ladi.

Hurmatli kitobxonlar! Agar siz JS-da uzoq vaqtdan beri yozayotgan bo'lsangiz, sinf kalit so'zining tilda paydo bo'lishiga qanday munosabatda ekanligingizni ayting.

Men “Oddiy haqida qiyin” nomli turkum maqolalar yozishga qaror qildim. Ushbu seriya JavaScript tiliga qaratilgan. Nima uchun "oddiy narsa qiyin"? Chunki men sizga aytadigan hamma narsani ma'lumotlar turlaridan boshlab tarjimon ishining o'ziga xos xususiyatlarini hisobga olgan holda aytib beraman. Bularning barchasi kompleks haqida, masalan, JavaScript va boshqa naqshlarda meros olish usullari haqida gapirib berish uchun amalga oshiriladi.

JavaScript prototipli tashkilotga ega ob'ektga yo'naltirilgan dasturlash tilidir.
"Tashkilot prototipi bilan" nimani anglatadi, biz keyingi maqolada gaplashamiz (bu albatta bo'ladi), lekin nima uchun u "ob'ektga yo'naltirilgan" va JSdagi hamma narsa ob'ektmi yoki yo'qmi, biz bugun bilib olamiz.
JS o'z maqsadlarini amalga oshirish uchun faqat 9 turdagi kerak. Bundan tashqari, ulardan faqat 6 tasi dasturda mavjud, qolgan 3 tasi faqat amalga oshirish darajasida mavjud va spetsifikatsiya tomonidan qo'llaniladi. Bir qarashda (va bu birinchi noto'g'ri tushuncha), JSdagi hamma narsa ob'ektlardir. Shunday qilib, dasturda mavjud bo'lgan oltita turdan beshtasi ibtidoiy deb ataladi va ob'ektlar emas (quyida men nima uchun va qanday qilib ularni ob'ektlar bilan aralashtirib yuborishini tushuntiraman). Bu besh ibtidoiy:

- String (s = 'str')
- Raqam (n = 10)
- mantiqiy (b = rost)

Va men ularni "falsafiy turlar" deb ataganimdek:
- null (v = null)
- aniqlanmagan (u = aniqlanmagan)

Bu nulldagi falsafiy o‘zgaruvchiga hech narsa tayinlanmaganligini, aniqlanmagan esa o‘zgaruvchiga bo‘sh belgi qo‘yilganligini bildiradi. Bu holatda "hech narsa" va "bo'shliq" o'rtasidagi farq nima - bo'sh vaqtingizda o'ylang. Biz buni hozir qilmaymiz.

Dasturda mavjud bo'lgan oltinchi tur (ob'ekt):
-Ob'ekt(Object konstruktori bilan adashtirmaslik kerak, biz hozir faqat mavhum turlar haqida gapiramiz!) JavaScript-da obyektlarni ifodalovchi yagona tur.
Ob'ekt - bu kalit-qiymat juftliklari to'plami sifatida ifodalangan ma'lumotlar tuzilmasi (ularning butun to'plami). Qiymat ma'lumotlar turlarining har qanday bo'lishi mumkin - keyin u ob'ektning mulki yoki hatto funksiya bo'ladi - keyin u ob'ektning usuli bo'ladi.

Primitivlar bilan ishlashning son-sanoqsiz usullari mavjud. Ularni o'zgaruvchilarga literallar yoki konstruktorlar orqali tayinlash mumkinligidan boshlab va ibtidoiylarni o'zgaruvchilarda umuman e'lon qilib bo'lmaydi, ular bilan bevosita ishlash. Xuddi shu primitivlar global o'zgaruvchilarda va mahalliy o'zgaruvchilarda bo'lishi mumkin.

Mana bir nechta misollar:

Var v1; // aniqlanmagan (bo'sh) mahalliy o'zgaruvchi var v2 = "2"; // string mahalliy literal o'zgaruvchi var v3 = new String (2); // konstruktor orqali e'lon qilingan mahalliy o'zgaruvchi qatori. String v4 = String (2) tipidagi yangi ob'ektni yaratadi; // konstruktor orqali chaqiriladigan satr global o'zgaruvchisi. O'zgaruvchan oynani yaratadi.v4 "2" .length; // satr o'zgaruvchiga aylanmaydi, lekin u allaqachon Ob'ekt 34..toString () sifatida ishlatilishi mumkin; // raqam o'zgaruvchiga aylanmaydi, lekin u allaqachon ob'ekt sifatida ishlatilishi mumkin 12. toString (); // raqam o'zgaruvchiga aylanmaydi, lekin u allaqachon ob'ekt sifatida ishlatilishi mumkin (22) .toString (); // raqam o'zgaruvchiga aylanmaydi, lekin u allaqachon ob'ekt sifatida ishlatilishi mumkin

Oxirgi 4 ta buyruqda ibtidoiy ob'ekt bilan qanday chalkashib ketganini aniq ko'rishingiz mumkin - axir, biz usulni nuqta orqali chaqiramiz - xuddi ob'ekt kabi. Haqiqatan ham bu ibtidoiylar ob'ektlarga o'xshaydi.

Masalan, o'zgaruvchining turini tekshirganimizda noto'g'ri tushuncha yanada kuchayadi

Var v = null; typeof v;

Va biz javob sifatida "ob'ekt" ni olamiz.

Va agar biz yozsak:
var v = null; v Object instance;

Keyin mening boshimda tartibsizlik paydo bo'ladi, chunki oxirgi qatorning natijasi "yolg'on" bo'ladi. Ya'ni, v o'zgaruvchisi ob'ekt turiga tegishli, lekin Ob'ekt turidan meros bo'lib qolmagan. Nima bo'ldi?!

Birinchidan, typeof null bilan hiyla-nayrangni tushuntiraman. Ushbu operator ob'ekt turini qaytaradi. Va haqiqat shundaki, typeof operatori qattiq kodlangan jadvaldan olingan satr qiymatini qaytaradi, u erda yoziladi: "for null, return" obyekti "". instanceof operatori - biror narsa ko'rsatilgan ma'lumotlar turiga tegishli yoki yo'qligini tekshiradi. Buni qanday qilishini keyingi maqolada aytaman, lekin sizni ishontirib aytamanki, bu holda u to'g'ri ishlagan, ibtidoiy null hech qanday tarzda Ob'ekt turidan meros bo'lib qolmaydi - uning o'zi, ibtidoiy rivojlanishning eng past bosqichidir. .

Yaxshi, biz typeof va instanceof bilan tushundik, lekin usullar ibtidoiylar uchun chaqiriladi - xuddi ob'ektlar to'g'ri bo'lgani kabi! Qanday qilib bu ob'ekt bo'lmasa?

Gap shundaki. O'rash funktsiyalari (konstruktorlar) kabi narsa bor (va ikkinchi maqolada yana tozalanadi). Ular barcha ibtidoiylar (Raqam (), Mantiqiy (), String ()) va boshqalar uchun mavjud. Ularning mohiyati ibtidoiydan ob'ekt yaratishdan iborat bo'lib, bu turdagi ibtidoiy bilan ishlash uchun yordamchi usullarga ega bo'ladi.
Masalan, o'zgaruvchini quyidagicha yaratish mumkin:

Var num = yangi raqam (23.456);

Bunday holda, biz ibtidoiy 23.456 dan ob'ektni olamiz.
Raqam turi uchun Number () konstruktorida toPrecision () yordamchi usuli mavjud - u raqam uchun muhim raqamlar sonini aniqlaydi. Misol uchun, agar muhim raqamlar soni 23.456 ga o'rnatilgan bo'lsa, biz 23.45 raqamini olamiz.
Va bu erda biz ibtidoiyga ob'ekt sifatida murojaat qilishga harakat qilamiz:

(23.456). toPrecision (4);

Tarjimon yangi raqamni (23.456) chaqirish orqali ibtidoiyni ob'ektga vaqtincha o'rab oladi va keyin bu ob'ektning hozir mavjud bo'lgan toPrecision () usulini chaqiradi. Shunday qilib, ko'pchilik JSdagi hamma narsani ob'ekt deb adashadi.

Nima bo'layotganini chalg'ituvchi va noto'g'ri tushunishning yana bir misoli ham bor. Mana kod:

Var str = 'str'; str.test = "sinov"; // xato bo'lmaydi, dastur ishlashda davom etadi, lekin console.log (str.test); // aniqlanmagan

Agar biz avvalgidek str ob'ekt deb faraz qilsak, nega u yangi xususiyat testini eslamaganiga hayron bo'lardik. Lekin endi bilamizki, ibtidoiyni ob'ekt sifatida nazarda tutganda, u String tipidagi ob'ektga vaqtincha o'raladi. Ammo operatsiya tugagandan so'ng, bu o'rash yo'qoladi va u bilan yangi mulk sinovi. Mana, sehr yo'q.

Darhaqiqat, oldinga qarab, ibtidoiy ob'ektga o'ralgan holda, butun meros zanjiri quriladi (bu haqda keyinroq gaplashamiz), lekin aslida shunday "matryoshka" chiqadi:

Ob'ekt (Raqam (<примитив>)). JSdagi har qanday ob'ektning ota-onasi u yoki bu tarzda Ob'ekt bo'ladi. Ob'ektdagi xususiyatga qo'ng'iroq qilganingizda, qidiruv ob'ektlardan birida ushbu xususiyatni topmaguncha yoki aniqlanmagan holda qaytarmaguncha yoki siz usulni qidirayotgan bo'lsangiz, u istisno qiladi. Shunday qilib, ibtidoiy mavjud Ob'ekt ob'ektining xususiyatlariga ham ega. Prototipli meros qanday ishlashi va uning nozik tomonlari haqida ikkinchi maqolada gaplashamiz.

Men chiqarmoqchi bo'lgan ikkinchi maqolaning intrigasi uchun men konstruktor funktsiyalari bilan bog'liq yana bir narsa haqida gapiraman - bu turdagi konvertatsiya. JS kuchli terilgan til emas. Bu shuni anglatadiki, o'zgaruvchini e'lon qilish paytida biz uning qanday turi ekanligini ko'rsatishga majbur emasmiz, bundan tashqari, dasturning ishlashi davomida ushbu o'zgaruvchiga istalgan mutlaq turdagi ma'lumotlarni kiritish mumkin. Shuningdek, biz, masalan, matematik operatsiyalarda satr o'zgaruvchilari yoki aksincha, birlashtirish operatsiyalarida raqamlardan foydalanishimiz mumkin. Misol:

Var str = "abc"; str + 1; // "abc1"

Bu erda - 1 tipidagi ibtidoiy satr primitiviga aylantiriladi. Ob'ektlarda bu xususiyat toString () usuliga qo'ng'iroq qilish orqali mavjud bo'lib, raqam turidagi ob'ektlarda raqam tipidagi primitivni qaytaradigan valueOf () usuli mavjud. Ammo biz faqat ob'ektlarning usullari bo'lishi mumkinligini aytdik. Demak, ibtidoiyni bir turdan ikkinchi turga o'tkazish jarayonida ob'ektga o'rash ham bormi? Sizni ishontirib aytamanki, yo'q. Bu usul konstruktor funksiyasi tarjimon tomonidan new operatorisiz chaqirilganda bevosita chaqiriladi. Qanday sehrli operator yangi va konstruktor funksiyasi unsiz chaqirilganda nima sodir bo'ladi va bunday konstruktor funksiyasi nima, biz keyingi maqolada gaplashamiz. Hozircha, mening so'zimni qabul qiling - tip konvertatsiyasi darhol sodir bo'ladi - ibtidoiydan ibtidoiyga.

Hozircha, albatta, javoblardan ko'ra ko'proq savollar bor, ammo ishoning, ikkinchi maqolani o'qib chiqqandan keyin hamma narsa yanada oshkora bo'ladi. Bu erda men, asosan, qiziqtirdim va bir qator savollarni ko'tardim - ta'bir joiz bo'lsa, ongni hayajonga soldi. Ammo shunga qaramay, ushbu maqoladan nimanidir o'rganish mumkin:
1. "JSda hamma narsa ob'yektdir" degan an'anaviy donolikka qaramasdan, dasturchi uchun mavjud bo'lgan 6 ma'lumot turidan 5 tasi primitiv va faqat bittasi ob'ekt turini ifodalashini aniqladik.
2. Ob'ektlar haqida biz bu kalit-qiymat juftliklarini o'z ichiga olgan ma'lumotlar strukturasi ekanligini bilib oldik. Qachon qiymat ma'lumotlar turlaridan har qanday bo'lishi mumkin (va bu ob'ektning xususiyati bo'ladi) yoki funktsiya (va bu ob'ektning usuli bo'ladi).
3. Lekin ibtidoiylar predmet emas. Garchi siz ular bilan ob'ekt bilan ishlashingiz mumkin bo'lsa ham (va bu ibtidoiy ob'ekt degan noto'g'ri fikrni keltirib chiqaradi), lekin ...
4. O‘zgaruvchilar oddiy (harfiy) usulda ham (var a = ‘str’) yoki konstruktor funksiyasi (o‘ram) orqali e’lon qilinishi mumkin (var a = new String (“str’)). Ikkinchi holda, biz endi primitivni emas, balki String () o'rash funktsiyasi tomonidan yaratilgan ob'ektni olamiz. (qanday sehrli operator yangi va konstruktor funksiyasi nima ekanligini keyinroq bilib olamiz).
5. Biz ibtidoiy (yangi String (‘str’)) ustiga oʻram yaratish orqali u bilan obʼyekt sifatida ishlash mumkinligini bilib oldik. Aynan shu o'ramni tarjimon ibtidoiy bilan ob'ekt bilan ishlashga harakat qilganimizda yaratadi, lekin operatsiya tugagandan so'ng u yo'q qilinadi (shuning uchun ibtidoiy biz tayinlagan xususiyatni hech qachon eslay olmaydi. it a.test = 'test' - test xususiyati o'ram bilan yo'qoladi).
6. Ob'ektlarda toString () usuli borligini bilib oldik, u ob'ektning satrli tasvirini qaytaradi (valueOf () raqami uchun u raqamli qiymatni qaytaradi).
7. Tushundikki, birlashma yoki matematik amallarni bajarayotganda, ibtidoiylar o'z turini kerakliga qayta belgilashi mumkin. Buning uchun ular o'z turlarining o'rash funksiyalaridan foydalanadilar, lekin yangi operatorsiz (str = String (str)) (Farqi nimada va u qanday ishlaydi, keling, batafsilroq gaplashamiz)
8. Nihoyat, typeof qattiq kodlangan jadvaldan qiymatlarni olishini bilib oldik (bu yerda typeof null // obyektiga asoslangan boshqa noto‘g‘ri tushuncha kelib chiqadi).

Dasturlash tillarining barchasida o'rnatilgan ma'lumotlar tuzilmalari mavjud, ammo ular ko'pincha bir tildan boshqasiga farq qiladi. Ushbu maqola JavaScript-da mavjud bo'lgan o'rnatilgan ma'lumotlar tuzilmalari va ular qanday xususiyatlarga ega ekanligini ro'yxatga olishga harakat qiladi; bu boshqa ma'lumotlar tuzilmalarini yaratish uchun ishlatilishi mumkin. Iloji bo'lsa, boshqa tillar bilan taqqoslash amalga oshiriladi.

Dinamik yozish

JavaScript bu a erkin terilgan yoki a dinamik til. JavaScript-dagi o'zgaruvchilar biron bir qiymat turi bilan bevosita bog'liq emas va har qanday o'zgaruvchiga barcha turdagi qiymatlar tayinlanishi (va qayta tayinlanishi) mumkin:

foo = 42 bo'lsin; // foo endi raqam foo = "bar"; // foo endi foo stringi = true; // foo endi mantiqiy hisoblanadi

Ma'lumotlar turlari

Eng so'nggi ECMAScript standarti sakkizta ma'lumot turini belgilaydi:

  • Etti turdagi ma'lumotlar:

Primitiv qiymatlar

Ob'ektlardan tashqari barcha turlar o'zgarmas qiymatlarni belgilaydi (o'zgartirish mumkin bo'lmagan qiymatlar). Masalan, C dan farqli o'laroq, strings o'zgarmasdir. Biz ushbu turdagi qiymatlarni "ibtidoiy qiymatlar" deb ataymiz.

Boolean turi

Mantiqiy mantiqiy ob'ektni ifodalaydi va ikkita qiymatga ega bo'lishi mumkin: true va false. Batafsil ma'lumot uchun Boolean va Boolean-ga qarang.

Null turi

Xususiyatlari

JavaScript-da ob'ektlarni xususiyatlar to'plami sifatida ko'rish mumkin. Ob'ektning literal sintaksisi bilan cheklangan xususiyatlar to'plami ishga tushiriladi; keyin xususiyatlarni qo'shish va olib tashlash mumkin. Mulk qiymatlari har qanday turdagi qiymatlar bo'lishi mumkin, shu jumladan murakkab ma'lumotlar tuzilmalarini yaratishga imkon beradigan boshqa ob'ektlar. Xususiyatlar asosiy qiymatlar yordamida aniqlanadi. Kalit qiymat String yoki Symbol qiymatidir.

Muayyan atributlarga ega bo'lgan ob'ekt xususiyatlarining ikki turi mavjud: ma'lumotlar xususiyati va yordamchi xususiyat.

Ma'lumotlar mulki

Kalitni qiymat bilan bog'laydi va quyidagi atributlarga ega:

Ma'lumotlar xususiyatining atributlari
Xususiyat Turi Tavsif Standart qiymat
[] Har qanday JavaScript turi Mulkga kirish huquqi orqali olingan qiymat. aniqlanmagan
[] Mantiqiy Agar noto'g'ri bo'lsa, "s []" xususiyatini o'zgartirib bo'lmaydi. yolg'on
[] Mantiqiy uchun ... tsikllarda. Shuningdek qarang: Mulklarni sanab o'tish va egalik qilish yolg'on
[] Mantiqiy Agar noto'g'ri bo'lsa, xususiyatni "o'chirib bo'lmaydi, uni aksessuar xususiyatiga o'zgartirib bo'lmaydi" va [] va [] dan boshqa atributlarni o'zgartirib bo'lmaydi. yolg'on
Eskirgan atributlar (ECMAScript 3 dan boshlab, ECMAScript 5 da qayta nomlangan)
Xususiyat Turi Tavsif
Faqat o'qish Mantiqiy ES5 [] atributining teskari holati.
DontEnum Mantiqiy ES5 [] atributining teskari holati.
O'chirmang Mantiqiy ES5 [] atributining teskari holati.

Aksessuar xususiyati

Qiymatni olish yoki saqlash uchun kalitni bir yoki ikkita yordamchi funksiyalar (olish va sozlash) bilan bog‘laydi va quyidagi atributlarga ega:

Aksessuar xususiyatining atributlari
Xususiyat Turi Tavsif Standart qiymat
[] Funktsiya obyekti yoki aniqlanmagan Funktsiya bo'sh argumentlar ro'yxati bilan chaqiriladi va har safar qiymatga kirish ruxsati bajarilganda xususiyat qiymatini oladi. Shuningdek qarang. aniqlanmagan
[] Funktsiya obyekti yoki aniqlanmagan Funktsiya tayinlangan qiymatni o'z ichiga olgan argument bilan chaqiriladi va belgilangan xususiyatni o'zgartirishga urinilganda bajariladi. Shuningdek qarang. aniqlanmagan
[] Mantiqiy Agar rost boʻlsa, xususiyat for ... davrlarida sanab oʻtiladi. yolg'on
[] Mantiqiy Agar noto'g'ri bo'lsa, xususiyatni "o'chirib bo'lmaydi va uni ma'lumotlar xususiyatiga o'zgartirib bo'lmaydi". yolg'on

Eslatma: Atribut odatda JavaScript dvigatelida ishlatiladi, shuning uchun siz unga "to'g'ridan-to'g'ri kira olmaysiz (Object.defineProperty () haqida ko'proq qarang). Shuning uchun atribut bitta o'rniga ikkita kvadrat qavs ichiga qo'yiladi.

"Oddiy" ob'ektlar va funktsiyalar

JavaScript ob'ekti - bu kalitlar va qiymatlar o'rtasidagi xaritalash. Kalitlar satrlar (yoki Symbol s) va qiymatlar har qanday bo'lishi mumkin. Bu ob'ektlarni xashmaplar uchun tabiiy moslashtiradi.

Funktsiyalar qo'shimcha qo'ng'iroq qilish imkoniyatiga ega oddiy ob'ektlardir.

Sanalar

Sanalarni ko'rsatishda eng yaxshi tanlov JavaScript-da o'rnatilgan Sana yordam dasturidan foydalanishdir.

Indekslangan to'plamlar: massivlar va terilgan massivlar

Massivlar oddiy ob'ektlar bo'lib, ular uchun butun sonli kalitli xususiyatlar va "length" xususiyati o'rtasida ma'lum munosabat mavjud. Bundan tashqari, massivlar Array.prototype dan meros oladi, bu ularga massivlarni boshqarish uchun bir nechta qulay usullarni taqdim etadi. Masalan, indexOf (massivdagi qiymatni qidirish) yoki push (massivga element qo'shish) va boshqalar. Bu massivlarni ro'yxatlar yoki to'plamlarni ifodalash uchun mukammal nomzod qiladi.

Yozilgan massivlar ECMAScript 2015 bilan JavaScript uchun yangi va asosiy ikkilik maʼlumotlar buferining massivga oʻxshash koʻrinishini taqdim etadi. Quyidagi jadval C ma'lumotlarining ekvivalent turlarini topishga yordam beradi:

TypedArray obyektlari

Turi Qiymat diapazoni Baytlarda o'lcham Tavsif Web IDL turi Ekvivalent C turi
Int8Array -128 dan 127 gacha 1 8 bitli ikki "s to'ldiruvchi imzoli butun son bayt int8_t
Uint8Array 0 dan 255 gacha 1 8 bitli belgisiz butun son oktet uint8_t
Uint8ClampedArray 0 dan 255 gacha 1 8-bitli belgisiz butun son (qisqich) oktet uint8_t
Int16Array -32768 dan 32767 gacha 2 16 bitli ikki "s to'ldiruvchi imzoli butun son qisqa int16_t
Uint16Array 0 dan 65535 gacha 2 16 bitli belgisiz butun son imzosiz qisqa uint16_t
Int32Array -2147483648 dan 2147483647 gacha 4 32-bitli ikki "s toʻldiruvchi imzoli butun son uzoq int32_t
Uint32Array 0 dan 4294967295 gacha 4 32-bitli belgisiz butun son imzosiz uzoq uint32_t
Float32Array 1,2x10 -38 dan 3,4x10 38 gacha 4 32-bitli IEEE suzuvchi nuqta raqami (7 ta muhim raqam, masalan, 1.1234567) cheklanmagan suzish suzmoq
Float64Array 5,0x10 -324 dan 1,8x10 308 gacha 8 64-bitli IEEE suzuvchi nuqta raqami (16 ta muhim raqam, masalan, 1,123 ... 15) cheklanmagan juftlik ikki barobar
BigInt64Array -2 63 dan 2 63 -1 gacha 8 64-bitli ikki "s toʻldiruvchi imzoli butun son bigint int64_t (uzoq imzolangan)
BigUint64Array 0 dan 2 gacha 64 -1 8 64 bitli belgisiz butun son bigint uint64_t (imzosiz uzoq)

Kalit to'plamlari: Xaritalar, to'plamlar, zaif xaritalar, zaif to'plamlar

Ushbu ma'lumotlar tuzilmalari ob'ekt havolalarini kalit sifatida qabul qiladi va ECMAScript Edition 6 da kiritilgan. Set va WeakSet ob'ektlar to'plamini ifodalaydi, Map va WeakMap esa ob'ektga qiymatni bog'laydi. Xaritalar va zaif xaritalar o'rtasidagi farq shundaki, birinchisida ob'ekt tugmachalarini sanab o'tish mumkin. Bu oxirgi holatda axlat yig'ishni optimallashtirish imkonini beradi.

Xaritalar va toʻplamlarni sof ECMAScript 5 da qoʻllash mumkin. Biroq, obʼyektlarni taqqoslab boʻlmagani uchun (masalan, “kamroq” maʼnosida), qidirish unumdorligi, albatta, chiziqli boʻlishi mumkin. Ularning mahalliy ilovalari (jumladan, WeakMaps) doimiy vaqt oralig'ida taxminan logarifmik bo'lgan qidiruv ko'rsatkichlariga ega bo'lishi mumkin.

Odatda, ma'lumotlarni DOM tuguniga bog'lash uchun to'g'ridan-to'g'ri ob'ektga xususiyatlarni o'rnatish yoki data-* atributlaridan foydalanish mumkin. Buning salbiy tomoni shundaki, ma'lumotlar bir xil kontekstda ishlaydigan har qanday skript uchun mavjud. Xaritalar va zaif xaritalar ob'ektga ma'lumotlarni shaxsiy bog'lashni osonlashtiradi.

Strukturaviy ma'lumotlar: JSON

JSON (JavaScript Object Notation) - bu JavaScript-dan olingan, ammo ko'plab dasturlash tillari tomonidan qo'llaniladigan engil ma'lumotlar almashinuvi formati. JSON universal ma'lumotlar tuzilmalarini quradi. Batafsil ma'lumot uchun JSON va JSON-ga qarang.

Standart kutubxonada ko'proq ob'ektlar

JavaScript-da o'rnatilgan ob'ektlarning standart kutubxonasi mavjud. Iltimos, ko'proq ob'ektlar haqida ma'lumot olish uchun havolani ko'rib chiqing.

typeof operatori yordamida turlarni aniqlash

Typeof operatori o'zgaruvchining turini topishga yordam beradi. Batafsil ma'lumot va chekka holatlar uchun o'qing.

Texnik xususiyatlari

Spetsifikatsiya Holat Izoh
ECMAScript 1-nashr (ECMA-262) Standart Dastlabki ta'rif.
ECMAScript 5.1 (ECMA-262)
Ushbu spetsifikatsiyadagi "Turlar" ta'rifi.
Standart
ECMAScript 2015 (6-nashr, ECMA-262)
Standart Qo'shilgan belgi.
ECMAScript oxirgi loyihasi (ECMA-262)
Ushbu spetsifikatsiyadagi "ECMAScript ma'lumotlar turlari va qiymatlari" ta'rifi.
Qoralama