javascript - De ce typeof null este „object”?
Citesc „JavaScript Profesional pentru Dezvoltatori Web” Capitolul 4 și spune că cele cinci tipuri de primitive sunt: undefined, null, boolean, number și string.
Dacă null este un primitiv, de ce typeof(null) returnează "object"?
Nu ar însemna asta că null este transmis prin referință (presupun aici că toate obiectele sunt transmise prin referință), deci nu ar fi un tip primitiv?
Răspuns #1
De pe pagina MDN despre comportamentul operatorului typeof:
null// This stands since the beginning of JavaScript typeof null === 'object';În prima implementare a JavaScript, valorile JavaScript erau reprezentate ca un tag de tip și o valoare. Tag-ul de tip pentru obiecte era 0.
nullera reprezentat ca pointerul NULL (0x00 pe majoritatea platformelor). Prin urmare, null avea 0 ca tag de tip, de aici și valoarea de întoarceretypeof„object”. (referință)A fost propusă o soluție pentru ECMAScript (prin opțiune), dar a fost respinsă. Aceasta ar fi avut ca rezultat
typeof null === 'null'.
Răspunsul #2
Dacă
nulleste un primitiv, de cetypeof(null)returnează"object"?
Pentru că specificația spune așa.
11.4.3 Operatorul
typeofProducția UnaryExpression :
typeofUnaryExpression este evaluată după cum urmează:
- Fie val rezultatul evaluării UnaryExpression.
- Dacă Type(val) este Referință, atunci
a. Dacă IsUnresolvableReference(val) este true, returnează „undefined”.
b. Fie val egal cu GetValue(val).- Returnează un șir determinat de Type(val) conform Tabelului 20.
Răspunsul #3
După cum s-a subliniat, specificația spune asta. Dar, deoarece implementarea JavaScript a precedat scrierea specificației ECMAScript, și specificația a fost atentă să nu corecteze defectele implementării inițiale, există încă o întrebare legitimă despre de ce a fost făcută în acest mod de la început. Douglas Crockford o numește o greșeală. Kiro Risk crede că oarecum are sens:
Raționamentul din spatele acestui lucru este că
null, în contrast cuundefined, era (și încă este) adesea folosit acolo unde apar obiecte. Cu alte cuvinte,nulleste adesea folosit pentru a semnifica o referință goală către un obiect. Când Brendan Eich a creat JavaScript, el a urmat același paradigma, și avea sens (probabil) să returneze „object”. De fapt, specificația ECMAScript defineștenullca valoarea primitivă care reprezintă absența intenționată a oricărei valori de obiect (ECMA-262, 11.4.11).
Răspunsul #4
null
// Acest lucru există încă de la începutul JavaScript\ntypeof null === 'object';
Răspuns scurt:
Aceasta este o eroare din prima versiune a ECMAScript, pe care, din păcate, nu o poate fi reparată deoarece ar strica codul existent.
Explicație:
Cu toate acestea, există de fapt o explicație logică pentru motivul pentru care null este un obiect în JavaScript.
În versiunea inițială a JavaScript, valorile erau stocate în unități de 32 de biți care constau dintr-un mic tag de tip (1-3 biți) și datele reale ale valorii. Tag-urile de tip erau stocate în biții inferiori ai unităților. Existau cinci dintre ele:
000: object. The data is a reference to an object.
1: int. The data is a 31 bit signed integer.
010: double. The data is a reference to a double floating point number.
100: string. The data is a reference to a string.
110: boolean. The data is a boolean.
Pentru toate obiectele, valorile biților de tip erau 000. null a fost considerat a fi o valoare specială în JavaScript încă din prima sa versiune. null era o reprezentare a pointerului null. Cu toate acestea, nu existau pointeri în JavaScript ca în C. Așadar, null pur și simplu însemna nimic sau gol și era reprezentat de toți 0-ii. Așadar, toți cei 32 de biți ai săi erau 0. Deci ori de câte ori interpretul JavaScript citește null, consideră primii 3 biți ca tip „object”. De aceea typeof null returnează „object”.
Resursă: https://2ality.com/2013/10/typeof-null.html#:~:text=În%20JavaScript%2C%20typeof%20null%20este,it%20would%20break%20existing%20code.
Notă:
A fost propusă o corecție pentru ECMAScript (printr-o opțiune de activare), dar a fost respinsă. Ar fi rezultat în
typeof null === 'null'.
Răspunsul #5
Din cartea YDKJS
Aceasta este o eroare veche în JS, dar una care probabil nu va fi niciodată reparată. Prea mult cod de pe Web depinde de această eroare și, prin urmare, repararea ei ar cauza mult mai multe erori!

