Ma'lumot turlari — string, number, boolean, null, undefined, symbol, bigint

~20 daq · JavaScript · Kirish va Asoslar

Muammodan boshlaylik

console.log(1 + "2");   // "12" — raqam emas!
console.log(null + 1);  // 1
console.log(undefined + 1); // NaN

Bu natijalar kutilmagan ko'rinadi. Lekin JavaScript uchun mantiqiy — chunki har bir qiymatning turi bor, va turlar qanday "qo'shilishi" qoidalari bor.

JavaScript da ma'lumot turini bilmasdan kod yozish — ko'r-ko'rona yurish. Qayerda qoqilishingizni bilmaysiz.


Primitive va Reference turlar

JavaScript da barcha turlar ikki guruhga bo'linadi.

Primitive — oddiy qiymatlar. Xotirada to'g'ridan-to'g'ri saqlanadi. O'zgaruvchiga nusxa ko'chiriladi.

Reference — murakkab qiymatlar (ob'ekt, massiv, funksiya). Xotirada manzil saqlanadi — qiymatning o'zi emas.

Hayotiy o'xshatma: primitive — qog'ozga yozilgan telefon raqam. Kimgadir bersangiz — nusxa oladi, siz ham saqlab qolasiz. Reference — uy kaliti. Kimgadir bersangiz — ikkalingiz ham bir xil uyga kirasiz. Biri o'zgartirsa — ikkalasi ko'radi.

Bugun faqat primitive turlarni ko'ramiz. JavaScript da 7 ta primitive tur bor.


1. String — matn

Matnli ma'lumot. Qo'shtirnoq, bitta tirnoq yoki backtick bilan yoziladi.

const name = "Ali";          // qo'shtirnoq
const city = 'Toshkent';     // bitta tirnoq
const greeting = `Salom, ${name}!`; // template literal — backtick

Template literal — backtick (\``) bilan yoziladi. Ichiga ${}` orqali o'zgaruvchi qo'yish mumkin. Ko'p qatorli matn ham yozish mumkin:

const message = `Hurmatli ${name},
Sizning buyurtmangiz qabul qilindi.
Narx: ${price} so'm`;

Qo'shtirnoq va bitta tirnoq o'rtasida farq yo'q — faqat ichida xuddi shu tirnoq ishlatilsa, boshqasini tanlash kerak:

const a = "It's a good day";  // ichida ' bor — " ishlatildi
const b = 'He said "hello"';  // ichida " bor — ' ishlatildi

2. Number — raqam

JavaScript da butun son va kasr son — bitta tur. Boshqa tillardagi int, float, double yo'q.

const age = 25;        // butun son
const price = 19.99;   // kasr son
const negative = -10;  // manfiy

Maxsus qiymatlar

console.log(1 / 0);        // Infinity
console.log(-1 / 0);       // -Infinity
console.log("abc" * 2);    // NaN — Not a Number

NaN — "raqam emas" degani, lekin o'zi number turiga kiradi. Bu JavaScript ning g'alati tomonlaridan biri.

typeof NaN; // "number" — ha, raqam emas, lekin turi number
NaN === NaN; // false — NaN hech narsaga teng emas, o'ziga ham!

NaN ni tekshirish uchun isNaN() yoki Number.isNaN() ishlatiladi:

isNaN("abc");        // true
Number.isNaN("abc"); // false — faqat haqiqiy NaN ni tekshiradi
Number.isNaN(NaN);   // true

Number chegarasi

JavaScript raqamlari 64-bit floating point (IEEE 754). Bu degani juda katta yoki juda aniq raqamlarda xato bo'lishi mumkin:

console.log(0.1 + 0.2); // 0.30000000000000004 — 0.3 emas!

Pul hisob-kitoblarida bu muammo. Yechim: toFixed() yoki raqamlarni sentlarda saqlash (100 so'm o'rniga 10000 tiyin).


3. Boolean — mantiqiy qiymat

Faqat ikki qiymat: true yoki false.

const isLoggedIn = true;
const hasPermission = false;

Taqqoslash operatsiyalari boolean qaytaradi:

5 > 3;      // true
10 === 10;  // true
"a" === "b"; // false

Truthy va Falsy

JavaScript da har qanday qiymat shartda true yoki false sifatida baholanadi.

Falsy qiymatlar — shartda false hisoblanadi:

false, 0, "", null, undefined, NaN

Qolgan hamma narsa — truthy:

if ("") console.log("ishlaydi");   // ishlamaydi — "" falsy
if ("0") console.log("ishlaydi");  // ishlaydi — "0" truthy (bo'sh emas)
if (0) console.log("ishlaydi");    // ishlamaydi — 0 falsy
if ([]) console.log("ishlaydi");   // ishlaydi — bo'sh massiv truthy!

Bo'sh massiv [] va bo'sh ob'ekt {} — truthy. Bu ko'pchilikni chalg'itadi.


4. null — ataylab bo'sh

null — "qiymat yo'q" degan ma'noni ataylab belgilash. Dasturchi o'zi qo'yadi.

let selectedUser = null; // hali hech kim tanlanmagan

Hayotiy o'xshatma: anketa to'ldiryapsiz. "Turmush o'rtog'i" maydoni — siz bo'sh qoldirasiz, ya'ni null. Bu "ma'lumot yo'q" emas — "bu odam uylanmagan" degan aniq ma'no.

typeof null; // "object" — bu JavaScript ning mashhur xatosi
             // null aslida primitive, lekin typeof "object" qaytaradi

5. undefined — aniqlanmagan

undefined — qiymat hali berilmagan. JavaScript o'zi qo'yadi.

let x;
console.log(x); // undefined — e'lon qilindi, lekin qiymat berilmadi

function greet(name) {
  console.log(name); // undefined — argument berilmadi
}
greet();

null va undefined farqi

null === undefined;  // false — tur ham, qiymat ham boshqa
null == undefined;   // true — "loose" taqqoslashda teng hisoblanadi

Qoida: null — dasturchi ataylab qo'yadi ("qiymat yo'q"). undefined — JavaScript o'zi qo'yadi ("hali berilmagan"). Kodda undefined ni ataylab tayinlamang — buning uchun null ishlatiladi.


6. Symbol — noyob identifikator

Symbol — har doim noyob qiymat. Ikki Symbol hech qachon teng bo'lmaydi.

const id1 = Symbol("id");
const id2 = Symbol("id");
console.log(id1 === id2); // false — bir xil tavsif, lekin boshqa Symbol

Nima uchun kerak? Ob'ektga "yashirin" kalit qo'shish uchun — boshqa kod tasodifan ustiga yozmasin.

const SECRET = Symbol("secret");
const user = {
  name: "Ali",
  [SECRET]: "maxfiy ma'lumot"
};

console.log(user.name);     // "Ali"
console.log(user[SECRET]);  // "maxfiy ma'lumot"
console.log(Object.keys(user)); // ["name"] — SECRET ko'rinmaydi

Kundalik kodda Symbol kam ishlatiladi — ko'proq kutubxona va framework yaratishda kerak bo'ladi.


7. BigInt — juda katta raqamlar

Number ning maksimal xavfsiz qiymati: 2^53 - 1 = 9007199254740991. Undan katta raqamlarda aniqlik yo'qoladi.

console.log(9007199254740991 + 1); // 9007199254740992 — to'g'ri
console.log(9007199254740991 + 2); // 9007199254740992 — xato! 9007199254740993 bo'lishi kerak

BigInt — cheksiz katta butun sonlar uchun. Raqam oxiriga n qo'yiladi:

const big = 9007199254740991n + 2n;
console.log(big); // 9007199254740993n — to'g'ri!

BigInt va Number ni aralashtirib bo'lmaydi:

1n + 1; // ❌ TypeError
1n + BigInt(1); // ✅ 2n

Kriptografiya, moliyaviy tizimlar, blockchain — katta sonlar kerak bo'lgan joylarda ishlatiladi.


typeof operatori

O'zgaruvchi turini bilish uchun typeof ishlatiladi:

typeof "salom"    // "string"
typeof 42         // "number"
typeof true       // "boolean"
typeof undefined  // "undefined"
typeof null       // "object" ← xato, lekin shunday
typeof Symbol()   // "symbol"
typeof 42n        // "bigint"
typeof {}         // "object"
typeof []         // "object" ← massiv ham object
typeof function(){} // "function"

Tez-tez uchraydigan xatolar

null ni tekshirmasdan ishlatish:

const user = null;
console.log(user.name); // ❌ TypeError: Cannot read properties of null

Avval tekshirish kerak:

if (user !== null) {
  console.log(user.name);
}
// yoki
console.log(user?.name); // optional chaining — null bo'lsa undefined qaytaradi

NaN ni === bilan tekshirish:

const result = parseInt("abc");
if (result === NaN) { // ❌ hech qachon true bo'lmaydi
  console.log("raqam emas");
}

if (Number.isNaN(result)) { // ✅ to'g'ri usul
  console.log("raqam emas");
}

typeof null === "object" ga ishonish:

function isObject(val) {
  return typeof val === "object"; // ❌ null ham "object" qaytaradi
}

function isObject(val) {
  return typeof val === "object" && val !== null; // ✅ to'g'ri
}

Xulosa

JavaScript da 7 ta primitive tur: string, number, boolean, null, undefined, symbol, bigint.

null — dasturchi ataylab qo'yadi. undefined — JavaScript o'zi qo'yadi.

NaN — raqam emas, lekin typeof NaN === "number". Tekshirish uchun Number.isNaN().

typeof null === "object" — JavaScript ning tarixiy xatosi. null tekshirishda === null ishlatiladi.


Keyingi dars

4-dars: Operatorlar — arifmetik, taqqoslash, mantiqiy, bitwise