IslomDevIslomDev
Booster
Imtihon
Booster
Imtihon
  • Angular Intervyu Tayyorgarlik
  • πŸ“‡ Yodlash kartochkalari
  • πŸ“ Test bazasi (379)
  • JavaScript / TypeScript

    • JavaScript / TypeScript
    • Asoslar (JavaScript)
    • Asinxronlik
    • Prototip va OOP
    • TypeScript
    • Performance
  • Algoritmlash

    • Algoritmlash
    • Murakkablik tahlili
    • Ma'lumot tuzilmalari
    • Qidiruv va Saralash
    • Algoritmik paradigmalar
    • Amaliy masalalar
  • Angular β€” Boshlang'ich

    • Angular β€” Boshlang'ich
    • Component
    • Template
    • Change Detection
    • Advanced Component
  • Angular β€” Service va DI

    • Angular β€” Service va DI
    • Service asoslari
    • HTTP
    • Hierarchical DI
    • Advanced DI
    • State management (service)
  • Angular β€” Versiyalar

    • Angular β€” Versiyalar
    • Angular 12–13
    • Angular 14
    • Angular 15
    • Angular 16
    • Angular 17
    • Angular 18+
  • Angular β€” Directive

    • Angular β€” Directive
    • Built-in Directives
    • Custom Attribute Directive
    • Custom Structural Directive
    • Advanced
  • Angular β€” RxJS

    • Angular β€” RxJS
    • Observable asoslari
    • Asosiy operatorlar
    • Higher-order operatorlar
    • Combination operatorlar
    • Subject turlari
    • Xato va xotira
    • Advanced
  • Angular β€” Pipe

    • Angular β€” Pipe
    • Built-in Pipes
    • Custom Pipe
    • Performance
  • Angular β€” Forms

    • Angular β€” Forms
    • Template-driven Forms
    • Reactive Forms
    • Validators
    • Advanced
  • Angular β€” NgModule

    • Angular β€” NgModule
    • NgModule asoslari
    • Module arxitekturasi
    • Lazy Loading
    • Standalone vs NgModule
  • Angular β€” Sintaksis va Clean Code

    • Angular β€” Sintaksis va Clean Code
    • Template sintaksisi
    • Angular 17+ yangi sintaksis
    • Komponent arxitekturasi
    • Performance pattern'lar
    • SOLID va Clean Code
    • Testing

Yodlash kartochkalari

Imtihon oldi takrori. Faqat yodlanadigan faktlar β€” mulohaza bilan chiqarib olsa bo'ladigan qismlar bu yerda yo'q.

Boshidagi bo'limda raqam bor: shu savolga necha marta noto'g'ri javob berilgan. Vaqt kam bo'lsa faqat o'sha bo'limni o'qing.

  • 🎯 Test paytida β€” xatti-harakat
  • ⚠️ Eng xavfli faktlar
  • JavaScript asoslari
  • Reference semantikasi
    • Obyekt hech qachon o'z-o'zidan nusxalanmaydi
    • Spread β€” sayoz nusxa
    • Mutatsiya qiladigan metodlar
  • JS g'alatiliklari
    • Obyekt kalitlari tartibi
    • NaN o'zi bilan teng emas
    • Map va obyekt kalitlari
    • reduce β€” boshlang'ich qiymatsiz
    • Iteratsiya paytida massivni o'zgartirish
    • Binary search β€” ikkita klassik bug
  • Event Loop
  • Promise va async
  • TypeScript
  • Algoritmlash
    • Big O ni koddan o'qish
    • Amallar murakkabligi
    • Saralash
    • Space complexity
    • Rekursiya va memoization
    • Ma'lumot tuzilmalari
    • Uchta amaliy naqsh
  • Lifecycle hook'lar
  • Change Detection
  • Directive
  • Pipe
  • Forms
  • RxJS
    • Marble alifbosi
    • To'rt higher-order operator
    • Subject turlari
    • Memory leak
  • Service va DI
  • NgModule
  • Sintaksis va performance
  • Versiyalar

🎯 Test paytida β€” xatti-harakat

Bu uchtasi bilim emas, odat. Sessiyalarda eng ko'p ball shu yerda yo'qolgan.

2Γ— Β· Savolni oxirigacha o'qing "noto'g'ri", "emas", "bundan tashqari", "faqat" β€” bu so'zlarni ajratib o'qing. Ikki marta bilgan savolda shoshib xato qilingan. Yozma testda eng arzon yo'qotish.

3Γ— Β· Yangi qoidani haddan oshirib qo'llamang Qoida o'rgangandan keyin darhol so'rang: "bu qoida qayerda ISHLAMAYDI?" Misollar: CD darsidan keyin (click) ni ham "yangilanmaydi" dedi Β· Renderer2 darsidan keyin @HostBinding ni ham "ishlamaydi" dedi Β· yashirin tsikl darsidan keyin Set.has ni ham "O(nΒ²)" dedi.

Javob shakli to'liq bo'lsin Big O javobida faqat shu 6 tasidan biri bo'ladi: O(1) Β· O(log n) Β· O(n) Β· O(n log n) Β· O(nΒ²) Β· O(2ⁿ). O(2n) yoki O(nΒ²+n) β€” tugallanmagan javob.


⚠️ Eng xavfli faktlar

5Γ— Β· Strukturaviy direktivaga nima inject qilinadi?TemplateRef (nima chiziladi) + ViewContainerRef (qayerga chiziladi). ElementRef emas β€” <ng-template> DOM'da element emas, u <!--container--> izohi.

3Γ— Β· this qachon yo'qoladi? Chap tomonda nuqta bormi? c.inc() β†’ this = c. inc() β†’ this = undefined (klass tanasi doim strict). Yechim: arrow property yoki .bind(c).

3Γ— Β· "Allaqachon bormi?" tekshiruvi DOM'ga element qo'shadigan har joyda mavjudlik tekshiruvi + ngOnDestroy tozalash. hasView = tooltipEl = badgeEl β€” bitta naqsh, uch xil nom.

2Γ— Β· Cross-field validator qayerga?FormGroup darajasiga: fb.group({...}, { validators: fn }). Control'da bo'lsa password o'zgarganda qayta ishlamaydi. Xato guruhda: form.hasError('mismatch').

2Γ— Β· catchError qayerda turadi?Ichki oqim ichida β€” switchMap(x => api.get(x).pipe(catchError(...))). Tashqarida bo'lsa bitta xato butun oqimni o'ldiradi. catchError reanimator emas, o'rinbosar.

2Γ— Β· WeakMap kaliti nega faqat obyekt? Zaif havola faqat GC yig'a oladigan narsaga ma'noli. Primitivning identikligi/umri yo'q. Map = kuchli havola β†’ leak. WeakMap = obyekt o'lsa yozuv ham o'ladi. Aylanib bo'lmaydi (size yo'q).

2Γ— Β· async ichidan Promise qaytarishreturn Promise.resolve(1) = +2 ortiqcha tick. To'g'ri: return 1 yoki return await p (bu yana try/catch da xatoni ushlaydi).

2Γ— Β· Type predicate x is T olib tashlansaNarrowing yo'qoladi β€” if bloki ichida x hali ham unknown. TS funksiya ichiga qaramaydi; x is string β€” kompilyatorga berilgan va'da.


JavaScript asoslari

this β€” yagona qoida: this funksiya qanday chaqirilishiga bog'liq, qayerda yozilishiga emas. Arrow funksiyada esa this lexical β€” yozilgan joydan olinadi va bind bilan o'zgarmaydi.

SavolJavob
hasOwnProperty vs inhasOwnProperty β€” faqat o'z xossalari. in β€” butun prototip zanjiri. Prototipdagi metod uchun false
call / apply / bindcall β€” argumentlar alohida Β· apply β€” massiv bilan Β· bind β€” chaqirmaydi, yangi funksiya qaytaradi
Object.create(null)Prototipsiz obyekt β€” toString, hasOwnProperty yo'q
var / let / constvar β€” funksiya scope, hoisting β†’ undefined. let/const β€” block scope, TDZ. const referenceni muzlatadi
Closure memory leakClosure tashqi o'zgaruvchiga havolani ushlaydi β†’ GC yig'a olmaydi
Map vs WeakMapKuchli vs zaif havola. WeakMap kaliti β€” faqat obyekt (ES2023 dan Symbol ham)
Web WorkerOg'ir hisobni alohida oqimda. Asosiy cheklov: DOM YO'Q β€” document/window/localStorage mavjud emas. Ma'lumot nusxalanadi
class Counter {
  count = 0;
  increment() { this.count++; }
}
const c = new Counter();
c.increment();              // βœ… nuqta bor β†’ this = c

const inc = c.increment;
inc();                      // ❌ TypeError β€” this = undefined

// Yechim:
class Counter2 { increment = () => { this.count++; } }   // arrow property
const bound = c.increment.bind(c);                        // bind

Reference semantikasi

Eng ko'p ball yo'qotilgan mavzu. Kod natijasini bashorat qilish savollarining yarmi shu haqda.

Primitivlar (number, string, boolean, null, undefined) β€” qiymat bo'yicha. Obyekt, massiv, funksiya β€” reference (manzil) bo'yicha.

Obyekt hech qachon o'z-o'zidan nusxalanmaydi

const o = {};
const arr = [o, o, o];        // uchtasi ham BIR XIL obyekt
function f(obj) { obj.x = 1 } // funksiyaga ham reference ketadi
KodNatijaNega
{id:1} === {id:1}falseIkki xil manzil
new Set([{id:1},{id:1}]).size2Set manzilni solishtiradi
new Array(2).fill({})Bitta obyekt ulashiladifill argumentni bir marta hisoblaydi
Array.from({length:2}, () => ({}))Ikkita alohida obyektFunksiya har safar chaqiriladi
new Array(3).fill(0)     // βœ… primitiv β€” xavfsiz
new Array(3).fill([])    // ❌ bitta massiv ulashiladi
Array.from({length:3}, () => [])   // βœ… har safar yangi

Spread β€” sayoz nusxa

const a = { x: 1, nested: { y: 2 } };
const b = { ...a };
b.x = 50;          // βœ… a.x = 1  β€” 1-daraja ajratilgan
b.nested.y = 99;   // ❌ a.nested.y = 99 β€” ichkari ULASHILGAN

Chuqur nusxa: structuredClone(a) βœ… Β· JSON.parse(JSON.stringify(a)) ⚠️ (Date, Map, undefined yo'qoladi)

Mutatsiya qiladigan metodlar

sort Β· reverse Β· splice Β· push Β· pop Β· shift Β· unshift Β· fill
function getTop3(arr) {
  return arr.sort((a,b) => b-a).slice(0,3);   // ❌ asl massivni BUZADI
  return [...arr].sort((a,b) => b-a).slice(0,3);   // βœ…
  return arr.toSorted((a,b) => b-a).slice(0,3);    // βœ… ES2023
}

Nazorat savoli: funksiya kirish argumentini o'zgartirdimi? Chaqiruvchi buni kutmaydi.


JS g'alatiliklari

Bular mulohaza bilan chiqmaydi β€” yodlanadi.

Obyekt kalitlari tartibi

Ikki guruh, alohida qoida: butun songa o'xshash kalitlar β†’ ↑ o'sish tartibida, boshiga. Qolgan satr kalitlar β†’ qo'shilish tartibida, keyin.

Object.keys({ z:1, a:2, m:3 })            // ['z','a','m']  ← saralanmadi
Object.keys({ z:1, 10:'a', y:2, 2:'b' })  // ['2','10','z','y']
//                                             ↑ saralandi  ↑ yozilgan tartibda

'-1' va '1.5' β€” butun son emas, satr guruhida qoladi. Tartib muhim bo'lsa β†’ Map ishlating, u qo'shilish tartibini buzmaydi.

NaN o'zi bilan teng emas

NaN === NaN      // false      ← IEEE 754 standarti, hamma tilda shunday
NaN <= NaN       // false      ← hattoki bu ham

Sabab: NaN β€” qiymat emas, "qiymat yo'q" belgisi. 0/0 va Math.sqrt(-1) ikkalasi ham NaN, lekin ular bir xil narsa emas.

MetodSolishtirishNaN bilan
arr.indexOf(NaN)===❌ -1
arr.includes(NaN)SameValueZeroβœ… true
Number.isNaN(x)β€”βœ… to'g'ri yo'l

indexOf eski (===), includes yangi (NaN ni biladi).

Map va obyekt kalitlari

const m = new Map(); m.set(1, 'son');
m.get('1');    // undefined  ← Map tipni SAQLAYDI: 1 β‰  '1'

const o = {}; o[1] = 'son';
o['1'];        // 'son'      ← obyekt kalitni SATRGA aylantiradi

reduce β€” boshlang'ich qiymatsiz

[].reduce((a,b) => a+b);       // ❌ TypeError: Reduce of empty array with no initial value
[].reduce((a,b) => a+b, 0);    // βœ… 0
[5].reduce((a,b) => a+b);      // βœ… 5 β€” callback umuman chaqirilmaydi

reduce da har doim boshlang'ich qiymat bering. Bu real prod bug'i.

Iteratsiya paytida massivni o'zgartirish

arr.forEach((x, i) => { if (x % 2 === 0) arr.splice(i, 1); });
// ❌ indekslar suriladi β†’ ba'zi elementlar O'TKAZIB YUBORILADI

To'g'ri: arr = arr.filter(x => x % 2 !== 0) yoki teskari yo'nalishda yurish.

Binary search β€” ikkita klassik bug

while (lo < hi)     // ❌ lo === hi holati tekshirilmaydi β†’ oxirgi element topilmaydi
while (lo <= hi)    // βœ…

if (arr[mid] < x) lo = mid;       // ❌ CHEKSIZ SIKL
if (arr[mid] < x) lo = mid + 1;   // βœ…

Event Loop

Ikki qoida

  1. Sinxron kod to'liq tugaydi β†’ keyin navbat ochiladi. () => ichidagi kod hech qachon birinchi yarimda bo'lmaydi.
  2. Microtask navbati butunlay bo'shatiladi β†’ keyin bitta macrotask olinadi.
🟒 MicrotaskπŸ”΅ Macrotask
.then / .catch / .finallysetTimeout / setInterval
await dan keyingi kodDOM eventlar (click, input)
queueMicrotask()fetch / XHR javobi
MutationObserverpostMessage, I/O
  • Micro va macro asl farqi β€” Macro = YANGI ish (tashqi dunyodan). Micro = boshlangan ishning DUMI. Shuning uchun micro to'liq bo'shatiladi.
  • requestAnimationFrame β€” ikkalasi ham emas, render fazasida. ResizeObserver, IntersectionObserver ham shu yerda.
  • Navbat ichida prioritet yo'q β€” .then va queueMicrotask bir xil navbatda, sof FIFO.
console.log('A');
queueMicrotask(() => console.log('B'));
Promise.resolve().then(() => console.log('C'));
setTimeout(() => console.log('D'), 0);
console.log('E');

// A E B C D
// Usul: navbat callback'larini o'chirib tashlang β†’ qolgani javobning boshi

Promise va async

MetodXatti-harakat
Promise.allHammasi βœ… bo'lsa massiv. Bittasi ❌ β†’ darhol reject
Promise.allSettledHammasi tugaguncha kutadi, har biri status bilan
Promise.raceBirinchi tugagan (reject ham bo'lishi mumkin)
Promise.anyBirinchi fulfilled. Hammasi ❌ β†’ AggregateError
  • Promise bekor qilinmaydi. Promise.all reject bo'lsa qolganlar ishlashda davom etadi, natijasi tashlanadi. Bekor qilish: AbortController yoki RxJS takeUntil/switchMap.
  • Observable vs Promise β€” Promise: 1 qiymat, eager, bekor qilinmaydi, har doim asinxron. Observable: ko'p qiymat, lazy, unsubscribe bor, sinxron ham bo'la oladi (of).
  • await = yashiringan .then(). Undan keyingi qatorlar β€” microtask.

TypeScript

Utility typeVazifa
Partial<T>Hamma maydon ixtiyoriy
Required<T>Hamma maydon majburiy
Readonly<T>Hamma maydon readonly
Pick<T,K>Tanlash
Omit<T,K>Olib tashlash (Pick teskarisi)
Record<K,V>Noldan kalit→qiymat tipi
ReturnType<F>Funksiya qaytaradigan tip
NonNullable<T>null/undefined olib tashlanadi
// Mapped type β€” barcha utility'lar shu naqshda
type Partial<T>  = { [K in keyof T]?: T[K] };
type Readonly<T> = { readonly [K in keyof T]: T[K] };
type Required<T> = { [K in keyof T]-?: T[K] };   // -? = modifikatorni OLIB TASHLA

keyof T        // kalitlar birlashmasi: 'id' | 'name'
[K in keyof T] // har kalit bo'ylab aylanish
T[K]           // indexed access β€” o'sha kalitning tipi
  • unknown vs any β€” any = "menga ishon" (tekshiruv o'chadi). unknown = "avval isbotla".
  • strictNullChecks β€” null taqiqlanmaydi, u endi har tipga sig'maydi. string | null oshkora yozilishi kerak. strict β€” bu to'plam.
  • Nega interfeys DI token bo'la olmaydi? Interfeys kompilyatsiyadan keyin yo'qoladi. Shuning uchun abstract class yoki InjectionToken.
  • Distributive conditional β€” NonNull<string|null|number> β†’ string | number.
  • Template literal type β€” `on${Capitalize<T>}` Β· EventName<'click'|'focus'> β†’ 'onClick' | 'onFocus'.
  • Dekoratorlar β€” klassga metadata biriktiruvchi funksiyalar, runtime'da saqlanadi.

Algoritmlash

Big O ni koddan o'qish

1. Tsikllarni sanang β€” ichma-ich ko'paytiriladi, yonma-yon qo'shiladi (keyin kattasi qoladi). 2. Yashirin tsikllarni toping β€” includes, indexOf, find, filter β€” ular O(n). 3. Yarimlash bormi β€” har qadamda hajm ikkiga bo'linsa β†’ log n. 4. Doimiylar tashlanadi β€” O(4n + 10) β†’ O(n) Β· O(nΒ² + n) β†’ O(nΒ²).

for (...) { for (...) {...} }              // O(nΒ²)  β€” ichma-ich
for (...) {...}  for (...) {...}           // O(n)   β€” yonma-yon
for (const x of arr) { arr.includes(y) }   // O(nΒ²)  β€” YASHIRIN tsikl
for (const x of arr) { set.has(y) }        // O(n)   β€” hash, tsikl YO'Q
while (n > 1) { n = n / 2 }                // O(log n)

O(n log n) belgisi: kodda sort() bormi, yoki mid = (lo+hi)/2 kabi yarimlash bormi? Ikkalasi yo'q bo'lsa β€” javob O(n log n) bo'lmaydi.

Big On=1000 daMisol
O(1)1arr[5], map.get()
O(log n)~10Binary search
O(n)1 000Bitta tsikl, indexOf
O(n log n)~10 000Har qanday saralash
O(nΒ²)1 000 000Ichma-ich tsikl
O(2ⁿ)∞Memoizatsiyasiz fib

Amallar murakkabligi

❌ O(n) β€” qidiradiβœ… O(1) β€” hisoblab topadi
arr.includes(x)set.has(x) / set.add(x)
arr.indexOf(x)map.get(k) / map.set(k,v)
arr.find/filter/some/every/maparr[i] (indeks bo'yicha)
arr.unshift(x) / arr.shift()arr.push(x) / arr.pop()
arr.splice(i, 1)map.size (Object.keys esa O(n))

Massivda oxir arzon, bosh qimmat. push/pop β†’ O(1) Β· unshift/shift β†’ O(n), chunki hamma element suriladi.

Saralash

sort() HAR DOIM O(n log n) β€” "usulga bog'liq" emas. Taqqoslashga asoslangan saralash bundan tez bo'la olmaydi. Array.prototype.sort() faktlari: asl massivni o'zgartiradi Β· barqaror (stable) Β· sukut bo'yicha elementlarni satrga aylantiradi Β· o'sha massivning o'zini qaytaradi (yangi emas).

[10, 9, 100, 1].sort();               // [1, 10, 100, 9]  ← satr sifatida!
[10, 9, 100, 1].sort((a,b) => a-b);   // [1, 9, 10, 100]  βœ…
const b = a.sort();  a === b;         // true β€” nusxa emas
[...a].sort()  yoki  a.toSorted()     // nusxa kerak bo'lsa

Eng kichigini topish uchun sort() kerak emas β€” Math.min(...arr) O(n), saralash esa O(n log n).

Merge SortQuick Sort
O'rtachaO(n log n)O(n log n)
Eng yomonO(n log n) βœ…O(nΒ²) ❌
XotiraO(n)O(log n) βœ…
Barqarorβœ…βŒ

Quick Sort qachon O(nΒ²)? Pivot doim eng katta/kichik bo'lganda β€” masalan allaqachon saralangan massivda birinchi element pivot qilinsa.

Space complexity

Nazorat savoli: "Men yangi narsa yaratdimmi, u n bilan birga o'sadimi?" Kirish massivi hisoblanmaydi β€” faqat siz yaratgan narsa.

let sum = 0;                    // O(1)  β€” bitta o'zgaruvchi
const s = new Set(); s.add(x);  // O(n)  β€” n tagacha element SAQLANADI
arr.map(x => x*2)               // O(n)  β€” yangi massiv
arr.sort()                      // O(1)  β€” joyida saralaydi
rekursiya, chuqurlik n          // O(n)  β€” call stack'da n ta freym

Rekursiya va memoization

function fact(n) {
  if (n <= 1) return 1;      // β‘  BASE CASE β€” bo'lmasa: RangeError, stack overflow
  return n * fact(n - 1);    // β‘‘ muammoni KICHRAYTIRIB o'ziga murojaat
}
VaqtXotira
fib memoizatsiyasizO(2ⁿ)O(n)
fib + memoizationO(n)O(n)

Memoization savdosi: xotirani berib, vaqtni sotib olasiz. O(2ⁿ) β†’ O(n). Memoization β€” rekursiv, call stack ishlatadi ⚠️ Β· Tabulation (tsikl) β€” ishlatmaydi βœ…

Ma'lumot tuzilmalari

TuzilmaQoidaMisol
StackLIFO β€” oxirgi kirgan birinchi chiqadiUndo, call stack, brauzer "orqaga"
QueueFIFO β€” birinchi kirgan birinchi chiqadiChop etish navbati, Event Loop navbatlari
Linked ListBoshiga qo'shish O(1), indeks bo'yicha o'qish O(n)Massivda teskarisi
BSTChapda kichik, o'ngda katta. Qidiruv O(log n)Muvozanatsiz bo'lsa O(n)
GraphAdjacency list β€” O(V+E) xotira, amalda shu ishlatiladiMatrix β€” O(VΒ²)

BST + in-order traversal = SARALANGAN ketma-ketlik. (chap β†’ tugun β†’ o'ng)

BFS vs DFS β€” ikkalasi ham O(V+E): BFS β†’ Queue, qavat-qavat, eng qisqa yo'l (og'irliksiz graf) DFS β†’ Stack yoki rekursiya, shoxni oxirigacha, yo'l bor-yo'qligi / sikl topish

Uchta amaliy naqsh

BelgisiNaqshMurakkablik
Massiv saralanmagan, juftlik qidirilmoqdaHash Map β€” target - x ni map'dan qidirO(n) vaqt, O(n) xotira
Massiv saralangan, juftlik qidirilmoqdaTwo Pointers β€” ikki tomondan yurO(n) vaqt, O(1) xotira
"Ketma-ket k ta", "eng uzun qism"Sliding Window β€” bittasini qo'sh, bittasini ayirO(n)

Optimallashtirish natijani o'zgartirmasligi kerak. Tezlashtirgandan keyin har doim so'rang: "eski kod nima qaytarardi, meniki nima qaytaryapti?" Testda klassik tuzoq: "bu ikki kod bir xil natija beradimi?" β†’ ko'pincha yo'q.

// Dublikatlarni TOPISH β€” ikkita Set kerak
function findDuplicates(arr) {
  const seen = new Set(), dups = new Set();
  for (const x of arr) {
    if (seen.has(x)) dups.add(x);   // ikkinchi marta ko'rdim
    else seen.add(x);
  }
  return [...dups];
}
// [...new Set(arr)] β€” bu dublikatni TOPMAYDI, OLIB TASHLAYDI. Boshqa masala!

Lifecycle hook'lar

constructor()            // @Input hali BO'SH (undefined)
  ↓
ngOnChanges()            // @Input o'rnatildi (faqat @Input bo'lsa)
  ↓
ngOnInit()               // bir marta β€” init logikasi
  ↓
ngDoCheck()              // har CD siklida
  ↓
ngAfterContentInit()     // <ng-content> proyeksiya qilindi
ngAfterContentChecked()
  ↓
ngAfterViewInit()        // @ViewChild endi mavjud
ngAfterViewChecked()
  ↓
ngOnDestroy()            // unsubscribe shu yerda
  • Nega ngOnChanges ngOnInit dan oldin? ngOnInit ga kirganda @Input tayyor bo'lishi kerak β€” ularni aynan ngOnChanges o'rnatadi.
  • ExpressionChangedAfterItHasBeenCheckedError β€” dev rejimda CD ikki marta tekshiradi. Yechim: setTimeout Β· Promise.then Β· cdr.detectChanges(). Prod'da xato chiqmaydi β€” DOM eski qiymatda qotadi.

Change Detection

Ikki bosqichli model [1] CD sikli ishga tushdimi? β†’ buni zone hal qiladi. [2] Sikl ichida komponent tekshirildimi? β†’ buni strategiya + "iflos" belgi hal qiladi. Deyarli barcha CD bug'lari β€” shu ikkidan bittasi ishlamagani.

βœ… OnPush β€” faqat shu 4 tasi❌ Ro'yxatda yo'q β†’ yangilanmaydi
Yangi @Input referenceMassiv mutatsiyasi (push)
Template'dagi event ((click))Qo'lda .subscribe()
async pipe yangi qiymatsetTimeout ichida property
cdr.markForCheck()Obyekt property'sini o'zgartirish
MetodYo'nalishQachon
markForCheck()⬆ ildizgacha belgilaydiKeyingi siklda
detectChanges()⬇ shu komponent + bolalariHozir, sinxron
detach()CD dan uzadiVirtual scroll, 60fps grafik
  • Nega markForCheck ildizgacha? CD daraxt bo'ylab yuqoridan pastga yuradi; toza OnPush ota-ona butun shoxni kesib o'tadi.
  • Nega async pipe OnPush bilan ishlaydi? Ichida markForCheck() yozilgan. Sizning .subscribe() ingizda yo'q. Unsubscribe ham AsyncPipe ning ngOnDestroy ida.
  • runOutsideAngular β€” DOM yangilanmaydi. Qaytish: ngZone.run(...).
  • Nechta tick? 3 ta Promise = 1 ta tick. 3 ta setTimeout = 3 ta tick.
  • Zoneless β€” "kuzatuv" emas, "xabar berish". 4 manba: signal Β· async pipe Β· template event Β· markForCheck. Migratsiyaning 1-qadami: butun ilovani OnPush ga o'tkazish.

Directive

Chegara: @HostBinding β†’ host element, deklarativ. Renderer2 β†’ boshqa har qanday element. Savol "deklarativmi?" emas β€” avvalo "qaysi element?"

FaktJavob
Selector turlari'app-user' β†’ element Β· '[app-user]' β†’ atribut
@Input selektor bilan bir xil nomattr="x" (satr) va [attr]="x" (ifoda) β€” ikkalasi ham ishlaydi
@HostListener tozalashAvtomatik β€” removeEventListener kerak emas
exportAs#t β†’ DOM element Β· #t="tooltip" β†’ direktiva instansiyasi
hostDirectives (v15+)Host elementga direktiva biriktirish β€” meros o'rniga kompozitsiya
[class.x] vs [ngClass][class.x] β€” native binding, tezroq, import kerak emas. ngClass β€” klass nomi ham dinamik bo'lganda
* yulduzchaSintaktik shakar β†’ <ng-template>. Bir elementda 2 ta strukturaviy direktiva bo'lmaydi
Renderer2 nega kerakSSR / Web Worker xavfsiz + XSS himoyasi (createText, innerHTML emas)
window:mousemove xavfiHar harakatda butun ilova CD si β†’ runOutsideAngular
@Directive({ selector: '[appUnless]', standalone: true })
export class UnlessDirective {
  private tpl = inject(TemplateRef<any>);        // NIMA chiziladi
  private vcr = inject(ViewContainerRef);         // QAYERGA chiziladi
  private hasView = false;                        // "allaqachon bormi?"

  @Input() set appUnless(cond: boolean) {
    if (!cond && !this.hasView) {
      this.vcr.createEmbeddedView(this.tpl); this.hasView = true;
    } else if (cond && this.hasView) {
      this.vcr.clear(); this.hasView = false;
    }
  }
}

Pipe

  • Pure pipe qachon ishlaydi? Input reference o'zgarganda. Argumentlar ham kuzatiladi. arr.push() β†’ reference o'zgarmadi β†’ ishlamaydi.
  • Nega async pipe impure? Observable qachon qiymat chiqarishini pipe bilmaydi.
  • Impure pipe xavfi β€” har CD siklida, har element uchun. 5000 qator = 5000 chaqiruv/sikl.
  • keyvalue pipe β€” kalitlarni alifbo bo'yicha saralaydi. Tartib uchun: keepOrder = () => 0 (class property sifatida!).
  • Ikkita | async = ikkita subscription = cold observable'da 2 ta HTTP. Yechim: *ngIf="x$ | async as x" yoki shareReplay(1).
  • Getter vs pure pipe vs computed() β€” Getter: har CD, kesh yo'q, hech qachon. Pure pipe: umumiy transformatsiya. computed(): komponentga xos hisob.

Forms

Ikki mustaqil o'q: touched = blur bo'ldimi Β· dirty = qiymat o'zgardimi. Bayroqlar yopishqoq β€” bir marta true bo'lsa qaytmaydi. Angular "hozir fokusda" holatini umuman kuzatmaydi.

Holattoucheddirty
Hech narsa qilinmaganfalsefalse
Kirdi–chiqdi, yozmaditruefalse
Yozdi va chiqditruetrue
patchValue() kod orqalifalsetrue
  • Validator null qaytarsa β€” muvaffaqiyatli, xato yo'q. Xato bo'lsa obyekt: { forbidden: true }.
  • disabled vs readonly β€” disabled form.value ga tushmaydi va validatsiyadan chiqadi. To'liq qiymat: getRawValue(). readonly β€” HTML atributi, qiymat qoladi.
  • FormControl holat obyektida faqat 2 kalit: value va disabled. readOnly: true jimgina e'tiborsiz qoldiriladi.
  • (ngSubmit) vs (submit) β€” ngSubmit preventDefault() ni o'zi chaqiradi. Native (submit) da sahifa qayta yuklanadi.
  • updateOn: 'blur' β€” valueChanges va validatsiya har harfda emas, maydondan chiqqanda.
  • Async validator β€” Observable/Promise qaytaradi, ishlayotganda control PENDING.
  • Custom form control β€” ControlValueAccessor, 4 metod: writeValue Β· registerOnChange Β· registerOnTouched Β· setDisabledState.

RxJS

Oqim modeli: har qiymat quvurni yolg'iz o'zi oxirigacha o'tadi, keyin keyingisi kiradi. Operatorlar massiv metodlari emas. Ustundan emas, qatordan o'qing.

of(1,2,3).pipe(tap, filter(x=>x>1), map(x=>x*10)).subscribe(...)

1 β†’ tap βœ“ β†’ filter βœ— βœ‚οΈ
2 β†’ tap βœ“ β†’ filter βœ“ β†’ map(20) β†’ sub βœ“
3 β†’ tap βœ“ β†’ filter βœ“ β†’ map(30) β†’ sub βœ“

// tap 1 Β· tap 2 Β· sub 20 Β· tap 3 Β· sub 30

Marble alifbosi

BelgiMa'nosiMumkinmi?
-vaqt o'tmoqda--a--b--| βœ…
aqiymat (next)--a--b--# βœ…
|COMPLETE β€” o'lim--a--b--- βœ… tugamaydi
#ERROR β€” o'lim--a--#--b-- ❌
(ab)bir vaqtda--a--|--b-- ❌

Filtrlangan qiymat belgi qoldirmaydi β€” o'rnida oddiy -.

To'rt higher-order operator

OperatorYangi qiymat kelgandaFe'lHolat
switchMapEskisini bekor qiladialmashtirQidiruv, autocomplete
mergeMapParallel ketadiqo'shFayl yuklash
concatMapNavbatga qo'yadiulaChat, tartib muhim
exhaustMapYangisini rad etaditugat (ekzoz)Login, ikki marta bosish

Senior qoidasi: switchMap β€” faqat O'QISH (GET) uchun. YOZISH (POST/PUT/DELETE) da hech qachon switchMap ishlatmang β€” u yarim yo'lda saqlashni uzadi. O'rniga exhaustMap yoki concatMap.

Subject turlari

SubjectKech qo'shilgan subscriber nima oladi
SubjectHech narsa
BehaviorSubjectJoriy qiymat. Boshlang'ich qiymat majburiy Β· .value bor Β· state uchun
ReplaySubject(n)Oxirgi n ta. Boshlang'ich qiymat yo'q Β· complete() dan keyin ham beradi
AsyncSubjectFaqat oxirgisi, faqat complete da

Memory leak

πŸ”΄ Sizib chiqadi🟒 Sizib chiqmaydi
interval / timerhttp.get() β€” complete bo'ladi
fromEvent(window, ...)take(n) / first()
Service'dagi Subjectasync pipe
shareReplay(1) refCountsiztakeUntilDestroyed()
  • debounceTime vs throttleTime β€” debounce = sabr ("tugadimi?") β†’ qidiruv. throttle = ritm ("vaqt keldimi?") β†’ scroll, resize. Uzluksiz scroll'da debounce hech narsa chiqarmaydi.
  • shareReplay(1) xavfi β€” sukut bo'yicha refCount: false. Cheksiz oqim uchun: shareReplay({ bufferSize: 1, refCount: true }).
  • forkJoin vs combineLatest β€” forkJoin: hammasi complete bo'lganda 1 marta. combineLatest: istalgan biri o'zgarganda har safar.
  • takeUntil β€” har doim oxirgi operator. Boshida bo'lsa ichki oqim uzilmaydi.
  • takeUntilDestroyed() β€” v16+, injection context kerak. ngOnInit da: takeUntilDestroyed(inject(DestroyRef)).
  • catchError returnsiz β†’ TypeError: You provided 'undefined' where a stream was expected. Variantlar: of([]) Β· throwError(() => err) Β· EMPTY.
  • retry qachon mantiqsiz? 4xx (401/403/404) β€” mijoz xatosi. Faqat 5xx va tarmoq xatolarida. Backoff: retry({ count: 3, delay: (e,i) => timer(i*1000) }).
  • switchMap bekor qilganda serverda? XHR.abort() ulanishni yopadi, lekin server ishni tugatishi mumkin. POST uchun β†’ idempotency key.

Service va DI

ProviderVazifa
useClassBoshqa klass bilan almashtirish (mock, platform)
useValueTayyor qiymat (config, konstanta)
useFactoryShart asosida hisoblab yaratish (deps bilan)
useExistingMavjud provider'ga taxallus
multi: trueBitta token ostida massiv yig'iladi (HTTP_INTERCEPTORS)
providedInNima
'root'Ilova bo'ylab 1 ta. Tree-shakable
'platform'Bir sahifadagi bir nechta Angular ilova uchun umumiy
'any'Har lazy modulga alohida instansiya
  • Komponentda providers: [X] β€” providedIn: 'root' qat'iy qonun emas, standart qiymat. 3 ta komponent = 3 ta instansiya. Klassik bug: providers: [AuthService].
  • inject() qayerda ishlaydi? βœ… field initializer Β· constructor Β· useFactory Β· funksional guard/interceptor. ❌ ngOnInit va metodlar β†’ NG0203.
  • @SkipSelf + @Optional β€” "o'zimni o'tkazib yubor, yuqoridan qidir" + "topilmasa null qaytar". CoreModule ikki marta import qilinishining oldini oladi.
  • req.clone() β€” HttpRequest immutable. Retry va bir nechta interceptor uchun.
  • Funksional interceptor (v15+) β€” provideHttpClient(withInterceptors([authInterceptor])), tur HttpInterceptorFn.
  • APP_INITIALIZER β€” ilova bootstrap bo'lishidan oldin. Promise/Observable qaytarsa Angular kutadi.

NgModule

KalitMa'nosiNima tushadi
declarations"Menda yashaydi"Component, Directive, Pipe
imports"Boshqadan olaman"Faqat modullar
exports"Boshqalarga beraman"Component, Directive, Pipe, modullar
providersServiceInjectable'lar
  • Standalone'da farq β€” standalone komponentda imports ga komponent ham tushadi.
  • forRoot vs forChild β€” forRoot Router provider'larini ham ro'yxatdan o'tkazadi. Ikki marta β†’ Router buziladi.
  • Lazy modul providers β€” lazy modul o'z child injector'ini yaratadi, alohida instansiya.
  • importProvidersFrom β€” eski NgModule provider'larini standalone'ga olib o'tuvchi ko'prik. Imkon bo'lsa provideX() afzal.
  • loadChildren vs loadComponent β€” NgModule vs bitta standalone komponent (v14+).
  • Barrel export (index.ts) xavfi β€” tree-shaking buzilishi + circular dependency.

Sintaksis va performance

@defer triggerlari β€” boshqasi YO'QQachon
on idleSukut bo'yicha β€” brauzer bo'sh bo'lganda
on viewportEkranga kirganda (IntersectionObserver)
on interactionclick yoki keydown
on hovermouseover yoki focusin
on immediateRender tugagach darhol
on timer(500ms)Vaqt o'tgach
when isReadyShart rost bo'lganda
on scrollMavjud emas
  • @placeholder β€” yuklash boshlanmaguncha. @loading β€” yuklash paytida. @error β€” xatoda.
  • @defer sharti β€” ichidagi komponent standalone bo'lishi va o'sha template'da boshqa joyda ishlatilmasligi kerak.
  • track $index xavfi β€” ro'yxat o'rtasiga element qo'shilsa indekslar suriladi β†’ noto'g'ri DOM qayta ishlatiladi.
  • tracksiz β€” Angular barcha DOM elementni yo'q qilib qayta yaratadi (fokus, scroll, animatsiya yo'qoladi).
  • @if/@for β€” ng-template ga aylanmaydi, kompilyator to'g'ridan-to'g'ri o'giradi. CommonModule kerak emas.
  • $any() β€” template tip tekshiruvini o'sha ifoda uchun o'chiradi.
  • #ref uch xil ma'no β€” #a element'da β†’ DOM element Β· #b komponentda β†’ komponent instansiyasi Β· #c="x" β†’ exportAs.
  • Smart vs Dumb β€” Dumb service inject qilmaydi.
  • Virtual scroll vs pagination β€” skanerlaydimi β†’ virtual scroll. Qidiradimi β†’ pagination.

OnPush + async pipe β€” nega juftlik: async pipe har emisiyada markForCheck() chaqiradi β€” u OnPush ning 4 triggeridan biri. OnPush = "meni keraksiz tekshirma" Β· async pipe = "kerak bo'lganda men aytaman". Yolg'iz OnPush β€” buzuq ekran.


Versiyalar

VersiyaNima keldi
12–13Ivy default (View Engine o'chdi) β€” kichikroq bundle
14Standalone Β· Typed Reactive Forms Β· bootstrapApplication() Β· inject()
15hostDirectives Β· funksional guard/resolver Β· provideRouter, provideHttpClient
16Signals (preview) Β· @Input({ required: true }) Β· takeUntilDestroyed() Β· hydration
17@if/@for/@switch Β· @defer Β· Signals stable Β· input()/output()/model()
18+Zoneless Β· viewChild() signal query Β· signal-based component (RFC)

Signals β€” oltin qoida Signaldan signal chiqaryapsizmi β†’ computed(). Angular'dan tashqariga chiqyapsizmi β†’ effect(). effect ichida .set() β†’ NG0600: Writes to signals are not allowed in a reactive context. effect uchun to'g'ri ishlar: localStorage, log, analitika, 3-tomon kutubxona.

  • computed() β€” lazy (faqat o'qilganda) + memoized (keshlanadi).
  • input() / output() / model() β€” faqat o'qish signal Β· hodisa (EventEmitter o'rniga) Β· ikki tomonlama [(value)].
  • viewChild() signal query β€” ngAfterViewInit kutish shart emas.
  • toSignal() β€” injection context kerak. Boshlang'ich qiymatsiz β†’ undefined. Context o'lganda o'zi unsubscribe qiladi.
  • Signal nega zone.js ni keraksiz qiladi? zone.js: "nimadir bo'ldi, nimaligini bilmayman β†’ hammasini tekshir". Signal: "men o'zgardim, meni kim o'qiganini bilaman β†’ faqat o'shalarni yangila".
  • "Deprecated" β€” "ishlamaydi" emas. Angular deprecated narsani ~2 major versiya ushlab turadi.
  • Migratsiya β€” ng update bilan bittadan versiya oshirish (15β†’16β†’17β†’18).
Prev
Angular Intervyu Tayyorgarlik
Next
πŸ“ Test bazasi (379)