perché è typeof null “object”?

Sto leggendo il capitolo 4 “Professional Javascript for Web Developers” e mi dice che i cinque tipi di primitive sono: undefined, null, boolean, number e string.

Se null è un primitivo, perché typeof(null) restituisce "object" ?

Non significherebbe che null è passato per riferimento (sto assumendo qui tutti gli oggetti sono passati per riferimento), quindi rendendolo NON un primitivo?

Nella prima implementazione di JavaScript, i valori JavaScript sono stati rappresentati come tag di tipo e un valore, con il tag type per gli oggetti pari a 0 e null stato rappresentato come il puntatore NULL ( 0x00 sulla maggior parte delle piattaforms). Di conseguenza, null aveva 0 come tag di tipo, quindi il tipo falso di valore di ritorno ( riferimento ).

  typeof null === 'object'; // This stands since the beginning of JavaScript 

Una “correzione” è stata proposta per ECMAScript (tramite un opt-in). Sarebbe risultato in:

 typeof null === 'null' 

… ma questa modifica è stata rifiutata , a causa di problemi con il codice che utilizzava questo “quirk” specifico per verificare la null .

Se null è un primitivo, perché typeof(null) restituisce "object" ?

Perché le specifiche dicono così .

11.4.3 La tipologia di operatore

La produzione UnaryExpression : typeof UnaryExpression viene valutata come segue:

  1. Sia val il risultato della valutazione di UnaryExpression .
  2. Se Type ( val ) è Reference , quindi
    un. Se IsUnresolvableReference ( val ) è true , restituisce ” undefined “.
    b. Sia val essere GetValue ( val ).
  3. Restituisce una stringa determinata per Tipo ( val ) in base alla Tabella 20.

inserisci la descrizione dell'immagine qui

Come è stato sottolineato, lo spec dice così. Ma dal momento che l’implementazione di JavaScript precede la scrittura delle specifiche ECMAScript e la specifica è stata attenta a non correggere errori dell’implementazione iniziale, c’è ancora una domanda legittima sul perché è stato fatto in questo modo in primo luogo. Douglas Crockford lo chiama un errore . Kiro Risk pensa che abbia un senso in qualche modo :

Il ragionamento alla base di questo è che null , in contrasto con undefined , era (ed è ancora) spesso usato dove appaiono gli oggetti. In altre parole, null viene spesso utilizzato per indicare un riferimento vuoto a un object. Quando Brendan Eich ha creato JavaScript, ha seguito lo stesso paradigma e aveva senso (probabilmente) restituire “object”. In effetti, la specifica ECMAScript definisce null come il valore primitivo che rappresenta l’assenza intenzionale di qualsiasi valore object (ECMA-262, 11.4.11).

Se null è un primitivo, perché typeof(null) restituisce ” object “?

in breve: è un bug in ECMAScript e il tipo dovrebbe essere null

riferimento: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/null

Dal libro YDKJS

Questo è un bug di vecchia data in JS, ma probabilmente non verrà risolto. Troppo codice sul web si basa sul bug e quindi il suo fissaggio causerebbe molti più bug!