Ma'lumot turlari — string, number, boolean, null, undefined, symbol, bigint
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