Dərs 14 Orta səviyyə

JavaScript-də obyektlər, kolleksiyalar və bərabərlik

Obyektləri, Map və Set kolleksiyalarını və mürəkkəb bərabərlik alqoritmlərini öyrənin

Nələri öyrənəcəksiniz

  • Obyekt yaratmaq, xassələrə daxil olmaq və onları dəyişdirməyi başa düşəcəksiniz
  • Obyektləri iterasiya etmək üçün müxtəlif metodlardan istifadə etməyi öyrənəcəksiniz
  • Map və Set kolleksiyalarının əsaslarını və nə zaman istifadə edəcəyinizi biləcəksiniz
  • Reference və value bərabərliyi arasındaki fərqi anlayacaqsınız
  • Object.is() və kolleksiyalarda bərabərlik alqorimlərini tətbiq edə biləcəksiniz

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.

javascript
// 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.

javascript
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ış: 25
Nə zaman bracket notasiya istifadə etməliBracket notasiya xassə adı boşluq və ya xüsusi simvollar ehtiva etdikdə, dinamik olaraq hesablandıqda və ya dəyişəndə saxlandıqda vacibdir.

Xassə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.

javascript
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.

javascript
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.

javascript
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.

javascript
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ı
Diqqətli olunfor...in yalnız obyektin öz xassələrini deyil, həm də miras alınmış xassələri iterasiya edir. Bu haqda növbəti bölmələrdə detallı şəkildə danışacağıq. Yalnız obyektin öz xassələrini yoxlamaq üçün hasOwnProperty() istifadə edin.

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.

javascript
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.

javascript
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ış: 275

Object.entries()

Object.entries() obyektin öz [key, value] cütlərinin massivini qaytarır. Bu metod destrukturizasiya ilə iterasiya üçün çox faydalıdır.

javascript
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.

javascript
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.

javascript
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ı' }
Dayaz kopyaSpread operatoru obyektin dayaz kopyasını yaradır. Əgər obyekt iç-içə obyektlər ehtiva edirsə, onlar referans olaraq kopyalanır, dəyər olaraq yox.

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.

javascript
// 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ış: 26
Vacib fərqObyekti başqa dəyişənə təyin etdikdə, yeni obyekt yaranmır. Hər iki dəyişən eyni obyektə işarə edir. Birindən dəyişiklik etdikdə, digəri də təsirlənir.

Təyin davranışı

Obyekti təyin etdikdə referansın necə işlədiyinə baxaq.

javascript
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.

javascript
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'
Vacib qeydDəyişənə yeni obyekt təyin etmək (məsələn, admin = {...}) referansı dəyişdirir və artıq o dəyişən orijinal obyektə işarə etmir. Lakin əvvəldən referans edən digər dəyişənlər hələ də köhnə obyektə işarə edir.

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.

javascript
// 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ış: 2

Map 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.

javascript
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.

javascript
// 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ış: 2

Set əməliyyatları

Setləri birləşdirmək, kəsişdirmək və fərq tapmaq üçün massiv metodları ilə birləşdirə bilərsiniz.

javascript
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.

javascript
// 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)
Vacib konsepsiyaİki obyekt eyni xassələrə və dəyərlərə malik olsa belə, fərqli obyekt nümunələridirsə, === ilə bərabər olmazlar. Onlar yalnız eyni obyektə referans etdikdə bərabərdirlər.

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.

javascript
// 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ış: false

Object.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
javascript
// 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.

javascript
// 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ərdir
SameValueZeroSameValueZero === kimi işləyir, lakin NaN-ı özü ilə bərabər sayır. Ona görə də Set və Map-də NaN açar və ya dəyər kimi istifadə oluna bilər və düzgün işləyir.

08 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.

javascript
// 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.

javascript
// 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.

javascript
// 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ə

Obyektlər key-value cütlərini saxlayır və dot və ya bracket notasiya ilə daxil oluna bilər
Obyektlər referans tipləridir - təyin etdikdə referans kopyalanır, obyektin özü yox
Object.keys(), Object.values() və Object.entries() obyektləri iterasiya etmək üçün müxtəlif yollar təqdim edir
Spread operatoru (...) dayaz kopya yaradır - iç-içə obyektlər referans olaraq kopyalanır
Map istənilən tip açarlara icazə verir və açar sırasını qoruyur, Set isə unikal dəyərləri saxlayır
Object.is(), SameValueZero və === müxtəlif bərabərlik alqoritmləridir (+0/-0 və NaN üçün fərqli)

Təklifiniz var, səhv və ya xəta tapdınız? Zəhmət olmasa bizimlə əlaqə saxlayın.