JavaScript'da qanday ma'lumot turlari mavjud?

JuniorJavaScript #javascript #basics

Savol

JavaScript'da qanday ma'lumot turlari mavjud, primitivlar obyektlardan nimasi bilan farq qiladi va nega typeof null 'object' qaytaradi?

Qisqa javob

JavaScript'da yettita primitiv tur bor — string, number, boolean, null, undefined, symbol, bigint — va bitta murakkab tur, object (unga massivlar, funksiyalar, sanalar va h.k. kiradi). Primitivlar o'zgarmas va qiymat bo'yicha saqlanadi, obyektlar esa havola (reference) bo'yicha saqlanadi. typeof null === 'object' — bu dvigatelning tarixiy xatosi, mantiqiy xatti-harakat emas.

Batafsil javob

Primitivlar o'zlashtirish va taqqoslashda nusxalanadi: har bir o'zgaruvchi qiymatning o'zining mustaqil nusxasini saqlaydi.

  • string — satrlar, o'zgarmas (har qanday "o'zgartirish" yangi satr yaratadi).
  • number — suzuvchi nuqtali sonlar (IEEE 754), shu jumladan NaN va Infinity.
  • boolean — true/false.
  • null — qiymatning ataylab yo'qligi, aniq belgilanadi.
  • undefined — o'zgaruvchi e'lon qilingan, lekin qiymat berilmagan.
  • symbol (ES6) — noyob, o'zgarmas identifikator, ko'pincha obyektning "yashirin" kaliti sifatida ishlatiladi.
  • bigint (ES2020) — Number.MAX_SAFE_INTEGER chegarasidan tashqaridagi qiymatlar uchun ixtiyoriy aniqlikdagi sonlar.

Obyektlar — yagona murakkab tur. O'zgaruvchi obyektning o'zini emas, balki xotira sohasiga (heap) havolani saqlaydi, shuning uchun o'zgaruvchi nusxalanganda mazmun emas, havola nusxalanadi. Massivlar, funksiyalar, Map, Set, Date — bularning barchasi qopqoq ostida obyektlar.

Taqqoslash uchun muhim farq: primitivlar qiymat bo'yicha solishtiriladi (1 === 1 → true), obyektlar esa havola bo'yicha ({} === {} → false, mazmuni bir xil bo'lsa ham).

typeof null === 'object' haqida: JS'ning birinchi versiyasida har bir qiymat tur-teg + qiymat sifatida ifodalangan. 000 tegi obyektni bildirgan, null esa nol ko'rsatkich (0x00) sifatida kodlangan, shuning uchun xuddi shu tegni olgan. Bu spetsifikatsiyadagi tan olingan xato bo'lib, orqaga moslik nuqtai nazaridan tuzatilmagan — vebdagi juda ko'p kod allaqachon shunday xatti-harakatga bog'liq bo'lgan.

Yana bir amaliy tafsilot — typeof function(){} 'function' qaytaradi, garchi funksiyalar texnik jihatdan obyektlar bo'lsa-da; bu qulaylik uchun qo'shilgan yagona istisno.

Misol

// Primitivlar qiymat bo'yicha nusxalanadi
let a = 10
let b = a
b = 20
console.log(a, b) // 10 20 — mustaqil nusxalar

// Obyektlar havola bo'yicha saqlanadi
const obj1 = { count: 1 }
const obj2 = obj1
obj2.count = 2
console.log(obj1.count) // 2 — bu xotiradagi bitta obyekt

// Turli turlar uchun typeof
console.log(typeof 'hi')        // "string"
console.log(typeof 42)          // "number"
console.log(typeof true)        // "boolean"
console.log(typeof undefined)   // "undefined"
console.log(typeof Symbol())    // "symbol"
console.log(typeof 10n)         // "bigint"
console.log(typeof {})          // "object"
console.log(typeof [])          // "object" — massiv ham obyekt
console.log(typeof null)        // "object" — tarixiy xato!
console.log(typeof function(){}) // "function" — alohida holat

// null'ga ishonchli tekshirish
const value = null
console.log(value === null) // true

Qo'shimcha savollar

  • NaN va -0 misolida === orqali taqqoslash Object.is() dan nimasi bilan farq qiladi?
  • O'zgaruvchining aynan massiv ekanligini, oddiy obyekt emasligini qanday tekshirish mumkin (Array.isArray)?
  • Primitivlarning boxing'i nima va satr obyekt bo'lmasa-da, nega satrlarda metodlar bor?