Օբյեկտներ (Objects)

"Օբյեկտները JavaScript-ի հիմնական կառուցվածքային միավորներն են:"

Ի տարբերություն պրիմիտիվների, օբյեկտները պահում են հավաքածուներ: Դրանք կարող ենք պատկերացնել որպես պահարաններ, որտեղ ամեն դարակ ունի իր անունը (key) և պարունակությունը (value):

Ստեղծում

let user = {
  name: "John",
  age: 30
};

Գործողություններ

  • Ավելացում: user.isAdmin = true;
  • Հեռացում: delete user.age;
  • Trailing comma: Վերջին ստորակետը թույլատրելի է:

🔒 Const-ի պարադոքսը

Շատերը կարծում են, որ եթե օբյեկտը հայտարարված է const-ով, այն չի կարող փոփոխվել։ Իրականում const-ը պաշտպանում է հղումը (հասցեն), այլ ոչ թե բովանդակությունը։

❌ Արգելված է: Փոփոխականին նոր հասցե վերագրելը (user = { ... })
✅ Թույլատրված է: Գոյություն ունեցող հասցեի ներսում դարակների պարունակությունը փոխելը (user.name = "New Name")

Dot Notation (.)

Ամենատարածված ձևն է: Օգտագործվում է, երբ բանալին պարզ տեքստ է:

console.log(user.name);

Square Brackets ([])

Օգտագործվում է բարդ բանալիների կամ դինամիկ փոփոխականների դեպքում:

console.log(user["likes birds"]);
"in" օպերատոր: Ստուգում է արդյոք բանալին գոյություն ունի օբյեկտում:
"name" in user; // true

for..in ցիկլը հատուկ նախատեսված է օբյեկտի բոլոր ստեղծված բանալիների վրայով անցնելու համար։

Հատկությունների շրջանցում

for (let key in user) {
  console.log(key, user[key]);
}

🔢 Հերթականության կանոնը (The "Integer" Rule)

Եթե բանալիները կարող են փոխակերպվել ամբողջ թվի, ապա դրանք կդասավորվեն աճման կարգով։

flowchart LR Start([Loop Starts]) e1@--> Key{Next Key?} Key e2@-->|Integer Key| Sort[Sorted Ascending] Key e3@-->|String Key| Order[Creation Order] Sort e4@--> Execute[Execute Code] Order e5@--> Execute Execute e6@--> Key Key -->|No more keys| End([End Loop]) e1@{ animate: true } e2@{ animate: true } e3@{ animate: true } e4@{ animate: true } e5@{ animate: true } e6@{ animate: true } style Sort fill:#ffc500,stroke:#ffc500,color:#000 style Order fill:#61afef,stroke:#61afef,color:#000

Օրինակ

let codes = {
  "49": "Germany",
  "41": "Switzerland",
  "1": "USA"
};

for (let key in codes) {
  console.log(key); // 1, 41, 49
}

Ինչո՞ւ է սա կարևոր

1, 41 և 49-ը ամբողջ թվեր են և տեսակավորվում են։

💡 Մասնագիտական հուշում

  • զանգվածներ: Խուսափեք for..in-ից զանգվածների դեպքում:
  • Հերթականության պահպանում: Եթե ուզում եք, որ թվերը չտեսակավորվեն, ավելացրեք + նշանը:
  • Prototype Chain: for..in-ը տեսնում է նաև ժառանգված հատկությունները:

Օբյեկտի ամենակարևոր տարբերությունը պրիմիտիվներից այն է, որ դրանք պահվում և պատճենվում են ըստ հղման:

graph LR subgraph Stack varA["let a = {name: 'JS'}"] varB["let b = a"] end subgraph Heap obj["Object {name: 'JS'}"] end varA e1@--> obj varB e2@--> obj e1@{ animate: true } e2@{ animate: true } style obj fill:#f7df1e,stroke:#f7df1e,color:#000 style Stack fill:none,stroke:#fff,stroke-dasharray: 5 5 style Heap fill:none,stroke:#fff,stroke-dasharray: 5 5

Հիշեք

Երբ պատճենում եք օբյեկտը, դուք պատճենում եք միայն նրա հասցեն հիշողության մեջ:

⚖️ Համեմատում (Comparison Logic)

{} == {} միշտ false է: JS-ը համեմատում է հասցեները, ոչ թե պարունակությունը:

♻️ Garbage Collection (Աղբահանություն)

Եթե օբյեկտին տանող բոլոր հղումները ջնջվում են, այն դառնում է "Unreachable":

👯 Ինչպես իրականում պատճենել (Cloning)

Մեթոդ Տեսակ Երբ օգտագործել
{...obj} Shallow Copy Երբ օբյեկտը պարզ է (չունի ներդրված օբյեկտներ)
structuredClone(obj) Deep Copy Ժամանակակից ստանդարտ՝ ամբողջական պատճենի համար

⚠️ Գործնական զգուշացում (Side Effects)

«Երբ դուք օբյեկտը փոխանցում եք ֆունկցիային որպես արգումենտ, դուք փոխանցում եք հղումը։ Սա կարող է բերել Side Effects»։