01 Obyekt literalları
Obyektlər JavaScript-də ən fundamental məlumat strukturudur. Onlar key-value cütlərini saxlamağa imkan verir və kompleks məlumatları təşkil etmək üçün istifadə olunur.
Obyekt yaratmaq
Obyekt yaratmağın ən sadə yolu obyekt literal sintaksisindən istifadə etməkdir. Fiqurlu mötərizələr {} içərisində key-value cütləri yazırsınız.
// Obyekt literal
let user = {
name: 'Aysel',
age: 25,
city: 'Bakı'
};
console.log(user); // Çıxış: { name: 'Aysel', age: 25, city: 'Bakı' }
// Boş obyekt
let emptyObj = {};
console.log(emptyObj); // Çıxış: {}Xassələrə daxil olmaq
Obyekt xassələrinə daxil olmaq üçün iki üsul var: dot notasiya və bracket notasiya.
let user = {
name: 'Aysel',
age: 25,
'favorite color': 'blue'
};
// Dot notasiya
console.log(user.name); // Çıxış: 'Aysel'
console.log(user.age); // Çıxış: 25
// Bracket notasiya (boşluqlu açarlar üçün)
console.log(user['name']); // Çıxış: 'Aysel'
console.log(user['favorite color']); // Çıxış: 'blue'
// Dəyişənlə dinamik daxilolma
let prop = 'age';
console.log(user[prop]); // Çıxış: 25Xassələri əlavə etmək, dəyişdirmək və silmək
Obyektlər dəyişəndir, bu o deməkdir ki, yaradıldıqdan sonra xassələri əlavə edə, dəyişdirə və ya silə bilərsiniz.
let user = {
name: 'Aysel',
age: 25
};
// Xassə əlavə etmək
user.city = 'Bakı';
user['country'] = 'Azərbaycan';
console.log(user);
// Çıxış: { name: 'Aysel', age: 25, city: 'Bakı', country: 'Azərbaycan' }
// Xassəni dəyişdirmək
user.age = 26;
console.log(user.age); // Çıxış: 26
// Xassəni silmək
delete user.country;
console.log(user); // Çıxış: { name: 'Aysel', age: 26, city: 'Bakı' }Obyektlərdə metodlar
Obyektlər funksiyaları xassə kimi saxlaya bilər. Bu cür funksiyalara metodlar deyilir və obyektin davranışını təyin edirlər.
let calculator = {
value: 0,
add: function(num) {
this.value += num;
return this.value;
},
// Qısa metod sintaksisi (ES6)
subtract(num) {
this.value -= num;
return this.value;
},
reset() {
this.value = 0;
return this.value;
}
};
console.log(calculator.add(10)); // Çıxış: 10
console.log(calculator.add(5)); // Çıxış: 15
console.log(calculator.subtract(3)); // Çıxış: 12
console.log(calculator.reset()); // Çıxış: 0İç-içə obyektlər
Obyektlər digər obyektləri xassə kimi saxlaya bilər, bu da kompleks, iyerarxik məlumat strukturları yaratmağa imkan verir.
let student = {
name: 'Nigar',
age: 20,
address: {
city: 'Gəncə',
street: 'Cavadxan küçəsi',
zipCode: 'AZ2000'
},
grades: {
math: 95,
physics: 88,
chemistry: 92
}
};
// İç-içə xassələrə daxil olmaq
console.log(student.address.city); // Çıxış: 'Gəncə'
console.log(student.grades.math); // Çıxış: 95
// İç-içə xassəni dəyişdirmək
student.address.city = 'Sumqayıt';
console.log(student.address.city); // Çıxış: 'Sumqayıt'02 Obyekt iterasiyası
JavaScript obyekt xassələri üzərində iterasiya etmək üçün bir neçə metod təqdim edir. Hər metodun öz istifadə halı və davranışı var.
for...in döngüsü
for...in döngüsü obyektin bütün xassələri üzərində iterasiya edir, o cümlədən prototype chain-dəki xassələr.
let user = {
name: 'Aysel',
age: 25,
city: 'Bakı'
};
// Açarlar üzərində iterasiya
for (let key in user) {
console.log(key + ': ' + user[key]);
}
// Çıxış:
// name: Aysel
// age: 25
// city: BakıObject.keys()
Object.keys() obyektin öz xassə adlarının massivini qaytarır. Bu metod iterasiya üçün for...in-dən daha təhlükəsizdir.
let user = {
name: 'Aysel',
age: 25,
city: 'Bakı'
};
let keys = Object.keys(user);
console.log(keys); // Çıxış: ['name', 'age', 'city']
// Massiv metodları ilə iterasiya
keys.forEach(key => {
console.log(key + ': ' + user[key]);
});Object.values()
Object.values() obyektin öz xassə dəyərlərinin massivini qaytarır.
let user = {
name: 'Aysel',
age: 25,
city: 'Bakı'
};
let values = Object.values(user);
console.log(values); // Çıxış: ['Aysel', 25, 'Bakı']
// Dəyərləri cəmləmək
let scores = { math: 95, physics: 88, chemistry: 92 };
let total = Object.values(scores).reduce((sum, score) => sum + score, 0);
console.log(total); // Çıxış: 275Object.entries()
Object.entries() obyektin öz [key, value] cütlərinin massivini qaytarır. Bu metod destrukturizasiya ilə iterasiya üçün çox faydalıdır.
let user = {
name: 'Aysel',
age: 25,
city: 'Bakı'
};
let entries = Object.entries(user);
console.log(entries);
// Çıxış: [['name', 'Aysel'], ['age', 25], ['city', 'Bakı']]
// Key-value cütləri üzərində iterasiya
for (let [key, value] of Object.entries(user)) {
console.log(`${key}: ${value}`);
}03 Obyekt destrukturizasiyası və spread
Müasir JavaScript obyektlərlə işləməyi asanlaşdıran güclü sintaksis xüsusiyyətləri təqdim edir.
Obyekt destrukturizasiyası
Destrukturizasiya obyekt xassələrini dəyişənlərə çıxarmağın qısa yoludur. Bu, kodunuzu daha oxunaqlı və qısa edir.
let user = {
name: 'Aysel',
age: 25,
city: 'Bakı'
};
// Əsas destrukturizasiya
let { name, age, city } = user;
console.log(name); // Çıxış: 'Aysel'
console.log(age); // Çıxış: 25
// Destrukturizasiya zamanı adını dəyişdirmək
let { name: userName, age: userAge } = user;
console.log(userName); // Çıxış: 'Aysel'
// Əvvəlcədən təyin olunan (default) dəyərlərlə
let { name: n, country = 'Azərbaycan' } = user;
console.log(country); // Çıxış: 'Azərbaycan'Spread operatoru
Spread operatoru (...) obyektin xassələrini digər obyektə referans etmədən köçürməyə imkan verir. Bu, obyektləri kopyalamaq və birləşdirmək üçün çox faydalıdır.
let user = {
name: 'Aysel',
age: 25
};
// Obyekti kopyalamaq
let userCopy = { ...user };
console.log(userCopy); // Çıxış: { name: 'Aysel', age: 25 }
// Obyektləri birləşdirmək
let address = { city: 'Bakı', country: 'Azərbaycan' };
let fullUser = { ...user, ...address };
console.log(fullUser);
// Çıxış: { name: 'Aysel', age: 25, city: 'Bakı', country: 'Azərbaycan' }
// Xassələri əvəz etmək
let updatedUser = { ...user, age: 26, city: 'Gəncə' };
console.log(updatedUser); // Çıxış: { name: 'Aysel', age: 26, city: 'Gəncə' }
console.log(user); // Çıxış: { name: 'Aysel', age: 25, city: 'Bakı' }04 Obyekt referansları
JavaScript-də obyektlər referans tipləridir. Bu o deməkdir ki, obyektə təyin etdiyiniz zaman, siz obyektin özünü deyil, ona referansı kopyalayırsınız. Bunu başa düşmək çox vacibdir.
Referansları nədir?
Primitivlər (rəqəmlər, sətrlər) dəyərə görə kopyalanır, lakin obyektlər referansa görə kopyalanır.
// Primitivlər dəyərə görə kopyalanır
let x = 5;
let y = x; // dəyəri kopyalayır
y = 10;
console.log(x); // Çıxış: 5 (dəyişmədi)
console.log(y); // Çıxış: 10
// Obyektlər referansa görə kopyalanır
let person1 = { name: 'Aysel', age: 25 };
let person2 = person1; // referansı kopyalayır
person2.age = 26;
console.log(person1.age); // Çıxış: 26 (dəyişdi!)
console.log(person2.age); // Çıxış: 26Təyin davranışı
Obyekti təyin etdikdə referansın necə işlədiyinə baxaq.
let original = {
name: 'Elvin',
age: 30
};
// Təyin referansı kopyalayır
let copy = original;
console.log(original === copy); // Çıxış: true (eyni obyekt)
// Kopyalanmış obyekti dəyişdirdikdə orijinal obyekt dəyişir
copy.name = 'Rəşad';
console.log(original.name); // Çıxış: 'Rəşad'
// Hər ikisi eyni obyektə işarə edir
console.log(original); // Çıxış: { name: 'Rəşad', age: 30 }
console.log(copy); // Çıxış: { name: 'Rəşad', age: 30 }Referanslar vasitəsilə dəyişdirmək
Çoxlu dəyişənlər eyni obyektə referans etdikdə, istənilən biri vasitəsilə dəyişiklik hamısına təsir edir.
let user = { name: 'Aysel', age: 25 };
let admin = user;
let viewer = user;
// Üç dəyişən eyni obyektə referans edir
console.log(user === admin); // Çıxış: true
console.log(user === viewer); // Çıxış: true
console.log(admin === viewer); // Çıxış: true
// İstənilən biri vasitəsilə dəyişdirmək hamısına təsir edir
admin.age = 26;
console.log(user.age); // Çıxış: 26
console.log(viewer.age); // Çıxış: 26
// Yeni obyekt təyin etmək referansı dəyişdirir
admin = { name: 'Nigar', age: 28 };
console.log(user.name); // Çıxış: 'Aysel' (dəyişmədi)
console.log(admin.name); // Çıxış: 'Nigar'05 Map kolleksiyası
Map istənilən tip açar saxlaya bilən key-value cütlərinin kolleksiyasıdır. Obyektlərdən fərqli olaraq, Map açarlarının sırasını qoruyur və istənilən dəyər açar ola bilər.
Map yaratmaq və istifadə etmək
Map yeni Map() konstruktoru ilə yaradılır və daxili metodlar ilə idarə olunur.
// Map yaratmaq
let userMap = new Map();
// Cütlər əlavə etmək
userMap.set('name', 'Aysel');
userMap.set('age', 25);
userMap.set('city', 'Bakı');
// Dəyərləri əldə etmək
console.log(userMap.get('name')); // Çıxış: 'Aysel'
console.log(userMap.get('age')); // Çıxış: 25
// Açarın mövcudluğunu yoxlamaq
console.log(userMap.has('city')); // Çıxış: true
// Map ölçüsü
console.log(userMap.size); // Çıxış: 3
// Cüt silmək
userMap.delete('age');
console.log(userMap.size); // Çıxış: 2Map iterasiyası
Map iterasiya üçün bir neçə metod təqdim edir və daxili olaraq iterativ olduğundan for...of döngüsü ilə istifadə oluna bilər.
let map = new Map([
['name', 'Aysel'],
['age', 25],
['city', 'Bakı']
]);
// Açarlar üzərində iterasiya
for (let key of map.keys()) {
console.log(key);
}
// Çıxış: name, age, city
// Dəyərlər üzərində iterasiya
for (let value of map.values()) {
console.log(value);
}
// Çıxış: Aysel, 25, Bakı
// Cütlər üzərində iterasiya
for (let [key, value] of map.entries()) {
console.log(`${key}: ${value}`);
}
// forEach ilə iterasiya
map.forEach((value, key) => {
console.log(`${key} = ${value}`);
});Map və obyekt arasında fərq
- Açar tipləri: Map istənilən tipdə açarlara icazə verir (obyektlər, funksiyalar, primitivlər), obyektlər yalnız sətir və Symbol açarlara icazə verir
- Ölçü: Map-in ölçüsünü .size ilə asanlıqla əldə edə bilərsiniz, obyektdə ölçünü əl ilə hesablamalısınız
- İterasiya: Map birbaşa iterativ olub keys(), values() və entries() metodları təqdim edir
- Performans: Map tez-tez əlavə və silmə əməliyyatları üçün daha yaxşı performans göstərir
06 Set kolleksiyası
Set unikal dəyərlərin kolleksiyasıdır. Hər dəyər Set-də yalnız bir dəfə görünə bilər, bu da onu dublikatları silmək və üzvlüyü yoxlamaq üçün mükəmməl edir.
Set yaratmaq və istifadə etmək
Set yeni Set() konstruktoru ilə yaradılır. İstəyə bağlı olaraq iterativ (məsələn, massiv) ilə başlatmaq olar.
// Set yaratmak
let numbers = new Set();
// Dəyərlər əlavə etmək
numbers.add(1);
numbers.add(2);
numbers.add(3);
numbers.add(2); // dublikat, əlavə olunmayacaq
console.log(numbers); // Çıxış: Set(3) { 1, 2, 3 }
// Dəyərin mövcudluğunu yoxlamaq
console.log(numbers.has(2)); // Çıxış: true
console.log(numbers.has(5)); // Çıxış: false
// Set ölçüsü
console.log(numbers.size); // Çıxış: 3
// Dəyəri silmək
numbers.delete(2);
console.log(numbers.size); // Çıxış: 2Set əməliyyatları
Setləri birləşdirmək, kəsişdirmək və fərq tapmaq üçün massiv metodları ilə birləşdirə bilərsiniz.
let setA = new Set([1, 2, 3, 4]);
let setB = new Set([3, 4, 5, 6]);
// Birləşmə (union)
let union = new Set([...setA, ...setB]);
console.log(union); // Çıxış: Set(6) { 1, 2, 3, 4, 5, 6 }
// Kəsişmə (intersection)
let intersection = new Set([...setA].filter(x => setB.has(x)));
console.log(intersection); // Çıxış: Set(2) { 3, 4 }
// Fərq (difference)
let difference = new Set([...setA].filter(x => !setB.has(x)));
console.log(difference); // Çıxış: Set(2) { 1, 2 }Set istifadə halları
- Massivdən dublikatları silmək
- Üzvlük testləri (dəyərin mövcudluğunu yoxlamaq)
- Set əməliyyatları (birləşmə, kəsişmə, fərq)
07 Mürəkkəb bərabərlik
JavaScript-də bərabərlik primitiv və referans tipləri üçün fərqli işləyir. Bu fərqi başa düşmək obyektlər və kolleksiyalarla işləyərkən çox vacibdir.
Referans və dəyər bərabərliyi
Primitivlər dəyərə görə müqayisə olunur, obyektlər və massivlər isə referansa görə müqayisə olunur.
// Primitivlər dəyərə görə müqayisə olunur
let a = 5;
let b = 5;
console.log(a === b); // Çıxış: true
// Obyektlər referansa görə müqayisə olunur
let obj1 = { name: 'Aysel' };
let obj2 = { name: 'Aysel' };
console.log(obj1 === obj2); // Çıxış: false (fərqli referanslar)
// eyni referans
let obj3 = obj1;
console.log(obj1 === obj3); // Çıxış: true (eyni referans)
// Massivlər də referansa görə müqayisə olunur
let arr1 = [1, 2, 3];
let arr2 = [1, 2, 3];
console.log(arr1 === arr2); // Çıxış: false (fərqli referanslar)Object.is()
Object.is() iki dəyərin eyni olub-olmadığını müəyyən edir. === operatoruna bənzəyir, lakin iki xüsusi halda fərqli davranır.
// Adi strict equality (===)
console.log(+0 === -0); // Çıxış: true
console.log(NaN === NaN); // Çıxış: false
// Object.is() xüsusi halları fərqli idarə edir
console.log(Object.is(+0, -0)); // Çıxış: false
console.log(Object.is(NaN, NaN)); // Çıxış: true
// Normal hallar üçün eyni
console.log(Object.is(5, 5)); // Çıxış: true
console.log(Object.is('test', 'test')); // Çıxış: true
console.log(Object.is({}, {})); // Çıxış: falseObject.is() və === arasında fərqlər
- Object.is(+0, -0) false qaytarır, === isə true qaytarır
- Object.is(NaN, NaN) true qaytarır, === isə false qaytarır
Bərabərlik alqoritmləri
JavaScript üç əsas bərabərlik alqoritmi istifadə edir. Onlar əksər halda eyni işləyir, lakin iki xüsusi hal üçün fərqli nəticələr verir: NaN və +0/-0. Gəlin hər birini başa düşək:
- Strict Equality (===): === operatoru tərəfindən istifadə olunur. +0 və -0-ı eyni sayır, NaN-ı özü ilə bərabər saymır (NaN === NaN -> false)
- SameValue (Object.is()): Object.is() tərəfindən istifadə olunur. +0 və -0-ı fərqli sayır, NaN-ı özü ilə bərabər sayır (Object.is(NaN, NaN) -> true)
- SameValueZero: Map və Set tərəfindən daxili olaraq istifadə olunur. === kimi +0 və -0-ı eyni sayır, lakin Object.is() kimi NaN-ı özü ilə bərabər sayır. Bu, NaN-ı açar və ya dəyər kimi istifadə etməyə imkan verir
// Alqoritmlərin müqayisəsi
// Hal 1: NaN ilə NaN müqayisəsi
console.log(NaN === NaN); // false - Strict Equality (===)
console.log(Object.is(NaN, NaN)); // true - SameValue (Object.is())
// Hal 2: +0 ilə -0 müqayisəsi
console.log(+0 === -0); // true - Strict Equality (===)
console.log(Object.is(+0, -0)); // false - SameValue (Object.is())
// SameValueZero nədir?
// Set və Map NaN-ı eyni hesab edir (=== kimi deyil, Object.is() kimi)
// Ancaq +0 və -0-ı eyni hesab edir (=== kimi, Object.is() kimi deyil)Kolleksiyalarda bərabərlik
Map və Set daxili olaraq dəyərləri müqayisə etmək üçün SameValueZero alqoritmi istifadə edir.
// Set-lər referansa görə müqayisə olunur
let set1 = new Set([1, 2, 3]);
let set2 = new Set([1, 2, 3]);
console.log(set1 === set2); // Çıxış: false (fərqli obyektlər)
// Set-də NaN necə işləyir
let mySet = new Set();
// Birinci NaN əlavə edirik
mySet.add(NaN);
console.log(mySet.size); // Çıxış: 1
// İkinci NaN əlavə etməyə çalışırıq
mySet.add(NaN);
console.log(mySet.size); // Çıxış: 1 (əlavə olunmadı)
// NaN-ı yoxlaya bilərik
console.log(mySet.has(NaN)); // Çıxış: true
// Map-də də eyni şəkildə işləyir
let myMap = new Map();
myMap.set(NaN, 'bu dəyərdir');
console.log(myMap.get(NaN)); // Çıxış: 'bu dəyərdir'
// Niyə işləyir?
// === ilə NaN === NaN -> false
// Ancaq Set və Map SameValueZero istifadə edir
// SameValueZero-da NaN özü ilə bərabərdir08 Praktik nümunələr
Gəlin obyektlər, Map və Set-in real dünya ssenarilərində necə istifadə oluna biləcəyinə baxaq.
Nümunə 1: Map ilə qruplaşdırma
Map obyektləri ümumi xassəyə görə qruplaşdırmaq üçün əladır.
// Tələbələri yaşa görə qruplaşdırmaq
let students = [
{ name: 'Aysel', age: 20 },
{ name: 'Elvin', age: 22 },
{ name: 'Nigar', age: 20 },
{ name: 'Rəşad', age: 22 },
{ name: 'Səbinə', age: 21 }
];
let groupedByAge = new Map();
for (let student of students) {
if (!groupedByAge.has(student.age)) {
groupedByAge.set(student.age, []);
}
groupedByAge.get(student.age).push(student.name);
}
console.log(groupedByAge);
// Çıxış:
// Map(3) {
// 20 => ['Aysel', 'Nigar'],
// 22 => ['Elvin', 'Rəşad'],
// 21 => ['Səbinə']
// }Nümunə 2: Set ilə dublikatları silmək
Set massivdən dublikatları silməyin ən asan yoludur.
// Dublikatları olan massiv
let numbers = [1, 2, 3, 2, 4, 1, 5, 3, 6];
// Set ilə dublikatları silmək
let uniqueNumbers = [...new Set(numbers)];
console.log(uniqueNumbers); // Çıxış: [1, 2, 3, 4, 5, 6]
// Unikal sözlər əldə etmək
let text = 'salam salam dünya dünya javascript';
let words = text.split(' ');
let uniqueWords = [...new Set(words)];
console.log(uniqueWords); // Çıxış: ['salam', 'dünya', 'javascript']Nümunə 3: Mürəkkəb obyekt müqayisəsi
Obyektləri kopyalayarkən dayaz və dərin kopya arasındaki fərqi başa düşmək vacibdir.
// Dayaz kopya problemi
let original = {
name: 'Aysel',
address: { city: 'Bakı' }
};
let copy1 = { ...original };
copy1.address.city = 'Gəncə';
console.log(original.address.city); // Çıxış: 'Gəncə' (orijinal dəyişdirildi!)
// Dərin kopya (JSON metodu)
let copy2 = JSON.parse(JSON.stringify(original));
copy2.address.city = 'Sumqayıt';
console.log(original.address.city); // Çıxış: 'Gəncə' (orijinal dəyişdirilmədi)Xülasə
Təklifiniz var, səhv və ya xəta tapdınız? Zəhmət olmasa bizimlə əlaqə saxlayın.