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
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.
| Savol | Javob |
|---|---|
hasOwnProperty vs in | hasOwnProperty β faqat o'z xossalari. in β butun prototip zanjiri. Prototipdagi metod uchun false |
call / apply / bind | call β argumentlar alohida Β· apply β massiv bilan Β· bind β chaqirmaydi, yangi funksiya qaytaradi |
Object.create(null) | Prototipsiz obyekt β toString, hasOwnProperty yo'q |
var / let / const | var β funksiya scope, hoisting β undefined. let/const β block scope, TDZ. const referenceni muzlatadi |
| Closure memory leak | Closure tashqi o'zgaruvchiga havolani ushlaydi β GC yig'a olmaydi |
Map vs WeakMap | Kuchli vs zaif havola. WeakMap kaliti β faqat obyekt (ES2023 dan Symbol ham) |
| Web Worker | Og'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
| Kod | Natija | Nega |
|---|---|---|
{id:1} === {id:1} | false | Ikki xil manzil |
new Set([{id:1},{id:1}]).size | 2 | Set manzilni solishtiradi |
new Array(2).fill({}) | Bitta obyekt ulashiladi | fill argumentni bir marta hisoblaydi |
Array.from({length:2}, () => ({})) | Ikkita alohida obyekt | Funksiya 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.
| Metod | Solishtirish | NaN bilan |
|---|---|---|
arr.indexOf(NaN) | === | β -1 |
arr.includes(NaN) | SameValueZero | β
true |
Number.isNaN(x) | β | β to'g'ri yo'l |
indexOfeski (===),includesyangi (NaNni 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
reduceda 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
- Sinxron kod to'liq tugaydi β keyin navbat ochiladi.
() =>ichidagi kod hech qachon birinchi yarimda bo'lmaydi. - Microtask navbati butunlay bo'shatiladi β keyin bitta macrotask olinadi.
| π’ Microtask | π΅ Macrotask |
|---|---|
.then / .catch / .finally | setTimeout / setInterval |
await dan keyingi kod | DOM eventlar (click, input) |
queueMicrotask() | fetch / XHR javobi |
MutationObserver | postMessage, 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,IntersectionObserverham shu yerda.- Navbat ichida prioritet yo'q β
.thenvaqueueMicrotaskbir 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
| Metod | Xatti-harakat |
|---|---|
Promise.all | Hammasi β bo'lsa massiv. Bittasi β β darhol reject |
Promise.allSettled | Hammasi tugaguncha kutadi, har biri status bilan |
Promise.race | Birinchi tugagan (reject ham bo'lishi mumkin) |
Promise.any | Birinchi fulfilled. Hammasi β β AggregateError |
- Promise bekor qilinmaydi.
Promise.allreject bo'lsa qolganlar ishlashda davom etadi, natijasi tashlanadi. Bekor qilish:AbortControlleryoki RxJStakeUntil/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 type | Vazifa |
|---|---|
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
unknownvsanyβany= "menga ishon" (tekshiruv o'chadi).unknown= "avval isbotla".strictNullChecksβnulltaqiqlanmaydi, u endi har tipga sig'maydi.string | nulloshkora yozilishi kerak.strictβ bu to'plam.- Nega interfeys DI token bo'la olmaydi? Interfeys kompilyatsiyadan keyin yo'qoladi. Shuning uchun
abstract classyokiInjectionToken. - 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: koddasort()bormi, yokimid = (lo+hi)/2kabi yarimlash bormi? Ikkalasi yo'q bo'lsa β javobO(n log n)bo'lmaydi.
| Big O | n=1000 da | Misol |
|---|---|---|
O(1) | 1 | arr[5], map.get() |
O(log n) | ~10 | Binary search |
O(n) | 1 000 | Bitta tsikl, indexOf |
O(n log n) | ~10 000 | Har qanday saralash |
O(nΒ²) | 1 000 000 | Ichma-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/map | arr[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 Sort | Quick Sort | |
|---|---|---|
| O'rtacha | O(n log n) | O(n log n) |
| Eng yomon | O(n log n) β | O(nΒ²) β |
| Xotira | O(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
}
| Vaqt | Xotira | |
|---|---|---|
fib memoizatsiyasiz | O(2βΏ) | O(n) |
fib + memoization | O(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
| Tuzilma | Qoida | Misol |
|---|---|---|
| Stack | LIFO β oxirgi kirgan birinchi chiqadi | Undo, call stack, brauzer "orqaga" |
| Queue | FIFO β birinchi kirgan birinchi chiqadi | Chop etish navbati, Event Loop navbatlari |
| Linked List | Boshiga qo'shish O(1), indeks bo'yicha o'qish O(n) | Massivda teskarisi |
| BST | Chapda kichik, o'ngda katta. Qidiruv O(log n) | Muvozanatsiz bo'lsa O(n) |
| Graph | Adjacency list β O(V+E) xotira, amalda shu ishlatiladi | Matrix β O(VΒ²) |
BST +
in-ordertraversal = 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
| Belgisi | Naqsh | Murakkablik |
|---|---|---|
| Massiv saralanmagan, juftlik qidirilmoqda | Hash Map β target - x ni map'dan qidir | O(n) vaqt, O(n) xotira |
| Massiv saralangan, juftlik qidirilmoqda | Two Pointers β ikki tomondan yur | O(n) vaqt, O(1) xotira |
| "Ketma-ket k ta", "eng uzun qism" | Sliding Window β bittasini qo'sh, bittasini ayir | O(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
ngOnChangesngOnInitdan oldin?ngOnInitga kirganda@Inputtayyor bo'lishi kerak β ularni aynanngOnChangeso'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 reference | Massiv mutatsiyasi (push) |
Template'dagi event ((click)) | Qo'lda .subscribe() |
async pipe yangi qiymat | setTimeout ichida property |
cdr.markForCheck() | Obyekt property'sini o'zgartirish |
| Metod | Yo'nalish | Qachon |
|---|---|---|
markForCheck() | β¬ ildizgacha belgilaydi | Keyingi siklda |
detectChanges() | β¬ shu komponent + bolalari | Hozir, sinxron |
detach() | CD dan uzadi | Virtual scroll, 60fps grafik |
- Nega
markForCheckildizgacha? CD daraxt bo'ylab yuqoridan pastga yuradi; toza OnPush ota-ona butun shoxni kesib o'tadi. - Nega
asyncpipe OnPush bilan ishlaydi? IchidamarkForCheck()yozilgan. Sizning.subscribe()ingizda yo'q. Unsubscribe hamAsyncPipeningngOnDestroyida. runOutsideAngularβ DOM yangilanmaydi. Qaytish:ngZone.run(...).- Nechta tick? 3 ta
Promise= 1 ta tick. 3 tasetTimeout= 3 ta tick. - Zoneless β "kuzatuv" emas, "xabar berish". 4 manba: signal Β·
asyncpipe Β· 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?"
| Fakt | Javob |
|---|---|
| Selector turlari | 'app-user' β element Β· '[app-user]' β atribut |
@Input selektor bilan bir xil nom | attr="x" (satr) va [attr]="x" (ifoda) β ikkalasi ham ishlaydi |
@HostListener tozalash | Avtomatik β 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 |
* yulduzcha | Sintaktik shakar β <ng-template>. Bir elementda 2 ta strukturaviy direktiva bo'lmaydi |
Renderer2 nega kerak | SSR / Web Worker xavfsiz + XSS himoyasi (createText, innerHTML emas) |
window:mousemove xavfi | Har 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
asyncpipe impure? Observable qachon qiymat chiqarishini pipe bilmaydi. - Impure pipe xavfi β har CD siklida, har element uchun. 5000 qator = 5000 chaqiruv/sikl.
keyvaluepipe β 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"yokishareReplay(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.
| Holat | touched | dirty |
|---|---|---|
| Hech narsa qilinmagan | false | false |
| Kirdiβchiqdi, yozmadi | true | false |
| Yozdi va chiqdi | true | true |
patchValue() kod orqali | false | true |
- Validator
nullqaytarsa β muvaffaqiyatli, xato yo'q. Xato bo'lsa obyekt:{ forbidden: true }. disabledvsreadonlyβdisabledform.valuega tushmaydi va validatsiyadan chiqadi. To'liq qiymat:getRawValue().readonlyβ HTML atributi, qiymat qoladi.FormControlholat obyektida faqat 2 kalit:valuevadisabled.readOnly: truejimgina e'tiborsiz qoldiriladi.(ngSubmit)vs(submit)βngSubmitpreventDefault()ni o'zi chaqiradi. Native(submit)da sahifa qayta yuklanadi.updateOn: 'blur'βvalueChangesva validatsiya har harfda emas, maydondan chiqqanda.- Async validator β
Observable/Promiseqaytaradi, ishlayotganda controlPENDING. - 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
| Belgi | Ma'nosi | Mumkinmi? | |
|---|---|---|---|
- | vaqt o'tmoqda | --a--b--| β
| |
a | qiymat (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
| Operator | Yangi qiymat kelganda | Fe'l | Holat |
|---|---|---|---|
switchMap | Eskisini bekor qiladi | almashtir | Qidiruv, autocomplete |
mergeMap | Parallel ketadi | qo'sh | Fayl yuklash |
concatMap | Navbatga qo'yadi | ula | Chat, tartib muhim |
exhaustMap | Yangisini rad etadi | tugat (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
| Subject | Kech qo'shilgan subscriber nima oladi |
|---|---|
Subject | Hech narsa |
BehaviorSubject | Joriy qiymat. Boshlang'ich qiymat majburiy Β· .value bor Β· state uchun |
ReplaySubject(n) | Oxirgi n ta. Boshlang'ich qiymat yo'q Β· complete() dan keyin ham beradi |
AsyncSubject | Faqat oxirgisi, faqat complete da |
Memory leak
| π΄ Sizib chiqadi | π’ Sizib chiqmaydi |
|---|---|
interval / timer | http.get() β complete bo'ladi |
fromEvent(window, ...) | take(n) / first() |
Service'dagi Subject | async pipe |
shareReplay(1) refCountsiz | takeUntilDestroyed() |
debounceTimevsthrottleTimeβ debounce = sabr ("tugadimi?") β qidiruv. throttle = ritm ("vaqt keldimi?") β scroll, resize. Uzluksiz scroll'dadebouncehech narsa chiqarmaydi.shareReplay(1)xavfi β sukut bo'yicharefCount: false. Cheksiz oqim uchun:shareReplay({ bufferSize: 1, refCount: true }).forkJoinvscombineLatestβ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.ngOnInitda:takeUntilDestroyed(inject(DestroyRef)).catchErrorreturnsiz βTypeError: You provided 'undefined' where a stream was expected. Variantlar:of([])Β·throwError(() => err)Β·EMPTY.retryqachon mantiqsiz? 4xx (401/403/404) β mijoz xatosi. Faqat 5xx va tarmoq xatolarida. Backoff:retry({ count: 3, delay: (e,i) => timer(i*1000) }).switchMapbekor qilganda serverda?XHR.abort()ulanishni yopadi, lekin server ishni tugatishi mumkin. POST uchun β idempotency key.
Service va DI
| Provider | Vazifa |
|---|---|
useClass | Boshqa klass bilan almashtirish (mock, platform) |
useValue | Tayyor qiymat (config, konstanta) |
useFactory | Shart asosida hisoblab yaratish (deps bilan) |
useExisting | Mavjud provider'ga taxallus |
multi: true | Bitta token ostida massiv yig'iladi (HTTP_INTERCEPTORS) |
providedIn | Nima |
|---|---|
'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. βngOnInitva metodlar β NG0203.@SkipSelf+@Optionalβ "o'zimni o'tkazib yubor, yuqoridan qidir" + "topilmasanullqaytar".CoreModuleikki marta import qilinishining oldini oladi.req.clone()βHttpRequestimmutable. Retry va bir nechta interceptor uchun.- Funksional interceptor (v15+) β
provideHttpClient(withInterceptors([authInterceptor])), turHttpInterceptorFn. APP_INITIALIZERβ ilova bootstrap bo'lishidan oldin. Promise/Observable qaytarsa Angular kutadi.
NgModule
| Kalit | Ma'nosi | Nima tushadi |
|---|---|---|
declarations | "Menda yashaydi" | Component, Directive, Pipe |
imports | "Boshqadan olaman" | Faqat modullar |
exports | "Boshqalarga beraman" | Component, Directive, Pipe, modullar |
providers | Service | Injectable'lar |
- Standalone'da farq β standalone komponentda
importsga komponent ham tushadi. forRootvsforChildβforRootRouter 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'lsaprovideX()afzal.loadChildrenvsloadComponentβ NgModule vs bitta standalone komponent (v14+).- Barrel export (
index.ts) xavfi β tree-shaking buzilishi + circular dependency.
Sintaksis va performance
@defer triggerlari β boshqasi YO'Q | Qachon |
|---|---|
on idle | Sukut bo'yicha β brauzer bo'sh bo'lganda |
on viewport | Ekranga kirganda (IntersectionObserver) |
on interaction | click yoki keydown |
on hover | mouseover yoki focusin |
on immediate | Render tugagach darhol |
on timer(500ms) | Vaqt o'tgach |
when isReady | Shart rost bo'lganda |
on scroll | Mavjud emas |
@placeholderβ yuklash boshlanmaguncha.@loadingβ yuklash paytida.@errorβ xatoda.@defersharti β ichidagi komponent standalone bo'lishi va o'sha template'da boshqa joyda ishlatilmasligi kerak.track $indexxavfi β 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-templatega aylanmaydi, kompilyator to'g'ridan-to'g'ri o'giradi.CommonModulekerak emas.$any()β template tip tekshiruvini o'sha ifoda uchun o'chiradi.#refuch xil ma'no β#aelement'da β DOM element Β·#bkomponentda β 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
| Versiya | Nima keldi |
|---|---|
| 12β13 | Ivy default (View Engine o'chdi) β kichikroq bundle |
| 14 | Standalone Β· Typed Reactive Forms Β· bootstrapApplication() Β· inject() |
| 15 | hostDirectives Β· funksional guard/resolver Β· provideRouter, provideHttpClient |
| 16 | Signals (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 (EventEmittero'rniga) Β· ikki tomonlama[(value)].viewChild()signal query βngAfterViewInitkutish shart emas.toSignal()β injection context kerak. Boshlang'ich qiymatsiz βundefined. Context o'lganda o'zi unsubscribe qiladi.- Signal nega
zone.jsni 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 updatebilan bittadan versiya oshirish (15β16β17β18).
