Perché typeof null “object”?


242

Sto leggendo il capitolo 4 "Javascript professionale per sviluppatori Web" e mi dice che i cinque tipi di primitive sono: indefinito, null, booleano, numero e stringa.

Se nullè una primitiva, perché typeof(null)ritorna "object"?

Ciò non significherebbe che nullviene passato per riferimento (suppongo che qui tutti gli oggetti vengano passati per riferimento), quindi non lo rende una primitiva?


50
Risposta: Perché le specifiche lo dicono. Questo è generalmente considerato un errore.
SLaks,

5
Nota, typeof è un operatore, non una funzione (e in effetti puoi omettere le parentesi attorno a ciò che viene dopo), quindi non ha senso parlare di passaggio qui per riferimento. Il libro "JavaScript: le parti buone" menziona in realtà il fatto che typeof null === "oggetto" nella sezione A.6 dell'appendice A intitolata "Parti terribili".
John Sonderson,

5
Penso che vorrei leggere "Parti
orribili

1
errore enorme, insondabile! :)
Alexander Mills,

2
Quindi cosa dovremmo usare al posto di typeof per verificare il tipo di valore che detiene una variabile? Mi piacerebbe sapere cosa si trova tra (booleano, stringa, numero, matrice, oggetto, funzione, simbolo, null, non definito, NaN)
Costa

Risposte:


219

Dalla pagina MDN sul comportamento typeofdell'operatore :

null

// Questo vale dall'inizio di JavaScript
typeof null === 'oggetto';

Nella prima implementazione di JavaScript, i valori JavaScript erano rappresentati come tag di tipo e valore. Il tag di tipo per gli oggetti era 0. nullera rappresentato come puntatore NULL (0x00 nella maggior parte delle piattaforme). Di conseguenza, null aveva 0 come tag di tipo, quindi il typeofvalore restituito "oggetto" . ( riferimento )

È stata proposta una correzione per ECMAScript (tramite opt-in), ma è stata respinta . Sarebbe risultato typeof null === 'null'.


138
È un peccato che questo cambiamento non abbia almeno trasformato in modalità rigorosa ...
Ingo Bürk,

La gente ha approfittato della stranezza, e molti codici là fuori dovranno essere cambiati se questo non è stato respinto, immagino
Cold Cerberus

Ha più senso per le poche persone viventi che vogliono che questo cambi il loro codice, che il resto degli sviluppatori per il resto del tempo debba impararlo. Solo perché una persona non esiste ancora, non significa necessariamente che non contano, significa solo che sono indifesi.
Seph Reed,

non ha senso il motivo per cui le persone lo userebbero comunque come controllo null Non ha senso intuitivo, quindi perché dovrebbero usarlo? Ora la modifica non può essere aggiunta a causa di una codifica errata.
Emobe,

69

Se nullè una primitiva, perché typeof(null)ritorna "object"?

Perché le specifiche lo dicono .

11.4.3 L' typeofoperatore

La produzione UnaryExpression : typeof UnaryExpression viene valutata come segue:

  1. Lascia che val sia il risultato della valutazione di UnaryExpression .
  2. Se Tipo ( val ) è Riferimento , quindi
       a. Se IsUnresolvableReference ( val ) è true , restituisce " undefined".
       b. Lascia che val sia GetValue ( val ).
  3. Restituisce una stringa determinata dal tipo ( val ) secondo la tabella 20.

inserisci qui la descrizione dell'immagine


@peter typeofnon ti dice nulla sull'opportunità o meno di chiamare metodi su qualcosa.
Matt Ball,

2
Per quanto ne so, puoi chiamare metodi su qualsiasi cosa diversa da nulle undefined.
Matt Ball,

4
@peter non puoi chiamare metodi su una primitiva stringa, ma per fortuna le primitive stringa (e primitive numeriche e primitive booleane) sono implicitamente e automaticamente "auto-boxate" in involucri String, Number e Boolean quando usi una delle primitive con una proprietà operatore di riferimento ( .o [ ]).
Punta appuntita

28

Come è stato sottolineato, le specifiche lo dicono. Ma poiché l'implementazione di JavaScript precede la stesura della specifica ECMAScript e la specifica è stata attenta a non correggere i difetti dell'implementazione iniziale, c'è ancora una domanda legittima sul perché sia ​​stato fatto in questo modo in primo luogo. Douglas Crockford lo chiama errore . Kiro Risk pensa che in qualche modo abbia senso :

Il ragionamento alla base di questo è che null, al contrario di undefined, era (ed è tuttora) spesso usato dove appaiono gli oggetti. In altre parole, nullviene spesso utilizzato per indicare un riferimento vuoto a un oggetto. Quando Brendan Eich ha creato JavaScript, ha seguito lo stesso paradigma e ha senso (probabilmente) restituire "oggetto". Infatti, le specifiche ECMAScript definisce nullcome il valore di base che rappresenta l'intenzionale assenza di qualsiasi valore oggetto (ECMA-262, 11.4.11).


3
Dal momento che non riesco a trovare il video, lo posterò solo per persone curiose e senza alcun riferimento: Crockford ha spiegato come un valore zero sulla risoluzione del tipo di null puntava all'elemento zero indicizzato nella matrice dei tipi, quindi questo era un chiaro sviluppo di bug che i ragazzi di Microsoft hanno propagato accidentalmente durante la decompilazione e la ricompilazione di JS per il loro browser
Áxel Costas Pena,

6

Dal libro YDKJS

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


1
non fidarti di tutto ciò che è scritto in un libro. Adoro quel libro, tuttavia, non posso considerarlo un bug perché le specifiche ECMA per JavaScript dichiarano che il tipo di null deve essere un oggetto.
andreasonny83,

4

Se nullè una primitiva, 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


1
In nessun punto del tuo riferimento si afferma che si tratta di un bug.
user2867288,

1
E da nessuna parte nelle specifiche dice che typeof dovrebbe restituire altro che "non definito", "oggetto", "booleano", "numero", "stringa", "funzione" e "simbolo" (ECMAScript 2015)
Brad Kent,

1

In JavaScript null è "niente". Dovrebbe essere qualcosa che non esiste. Sfortunatamente, in JavaScript, il tipo di dati null è un oggetto. Puoi considerarlo un bug in JavaScript che typeof null è un oggetto. Dovrebbe essere nullo.


0

In JavaScript, typeof null è 'object', il che suggerisce erroneamente che null è un oggetto. Questo è un bug che sfortunatamente non può essere risolto, perché spezzerebbe il codice esistente.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.