Che cosa significa esattamente indefinito in JavaScript? Perché è lì? Che usi ha? Come potrebbe essere utile?

11

In JavaScript, abbiamo qualcosa chiamato indefinito . Ho detto qualcosa, perché davvero non so se si tratta di una classe base, o di una variabile incorporata, o di una parola chiave o di qualsiasi altra cosa. So solo che è lì.

Per vederlo in azione, puoi semplicemente scrivere:

undefined;
typeof undefined;

Qualcuno può spiegarmi perché questa cosa è stata inserita in JavaScript? Abbiamo null valore in questa lingua, quindi non dovrebbe essere qualcosa come null . In altre lingue, quando non conosciamo il valore di una proprietà o di una variabile, lo impostiamo semplicemente su null. Qui possiamo fare la stessa cosa

Come possiamo usare questa cosa in JavaScript?

    
posta Saeed Neamati 15.08.2011 - 08:22
fonte

4 risposte

13

Ci sono DUE cose che devi capire riguardo a undefined ...

  • il tipo undefined che può avere solo un valore .
  • la variabile undefined

Ora leggi attentamente quanto segue ...

  • Ci sono così tanti valori di tipo number (10, 10.01, 1e1). Ma può esserci solo un valore di tipo undefined , e quel valore è memorizzato nella variabile% codice%. Quel valore non ha rappresentazione letterale - ad esempio, valori numerici undefined , 1 , 100 sono tutti letterali di tipo numero, ma il valore memorizzato in la variabile 1e-1 non ha un formato letterale.

  • undefined è una variabile, solo una variabile normale, che JavaScript dichiara e assegna a esso il valore di tipo undefined nell'ambito globale. Quindi puoi fare tutto quanto segue ...

  typeof undefined;                       // "undefined"

  undefined = 100;
  typeof undefined;                       // "number"

  undefined = void 0;
  typeof undefined;                       // "undefined"

  window.undefined === undefined;         // true
  window.undefined === void 0;            // true
  
  • se non vuoi usare la variabile undefined , puoi generare il valore di tipo undefined con l'espressione undefined - il cui unico scopo è restituire un valore di tipo void 0 .

...can anyone please explain to me why this thing has been inserted into JavaScript...

NO. Proprio come nessuno può spiegare perché le variabili non dichiarate vadano a livello globale anziché locale. Devi solo allenarti a elegante usarlo invece di cercare di trovare giustificazioni per la sua esistenza.

...we have null value...

Sebbene undefined possa fare cose che fa null , è più o meno correlato a undefined piuttosto che a scalari. Infatti, JavaScript considera objects stesso un oggetto - null restituisce "oggetto".

A mio parere, la linea di fondo è NON provare a ragionare gli scopi assoluti di typeof null e undefined - e usarli nel tuo codice in modo intelligente, in modo che il tuo codice sia leggibile, mantenibile e riusabile.

    
risposta data 15.08.2011 - 09:21
fonte
6

Ci scusiamo per rispondere a una domanda precedente, ma la ragione per cui hai bisogno sia indefinito che nullo è semplice: in un linguaggio di tipizzazione basato su prototipo devi assolutamente distinguere tra "questo oggetto non definisce un valore per X "e" questo oggetto dice che X è nulla / null / vuoto ".

Senza questa capacità non c'è modo di percorrere la catena del prototipo e quindi l'ereditarietà non può funzionare; devi essere in grado di determinare che obj.someProp non è definito in modo da poter esaminare obj.prototype.someProp e in seguito fino alla ricerca di un valore. Se obj.someProp ha restituito null, non ci sarebbe stato modo di sapere se fosse veramente nullo o semplicemente "guarda il mio prototipo". L'unico modo per aggirare questo è iniettare un po 'di magia kludgy dietro le quinte che rompe la tua capacità di confondere le catene del prototipo e fare vari altri pezzi di magia nera JS.

Come gran parte di Javascript, l'idea di indefinito e nullo sembra inizialmente stupida e stupida, quindi assolutamente brillante in seguito (quindi di nuovo stupida e stupida ma con una spiegazione ragionevole).

Una lingua come C # non verrà compilata se si accede a una proprietà che non esiste e altre lingue dinamiche generano eccezioni in fase di esecuzione quando si tocca una proprietà che non esiste, ovvero è necessario utilizzare costrutti speciali da verificare loro. Le classi Plus indicano che quando un oggetto è istanziato conosci già la sua catena di ereditarietà e tutte le proprietà che ha - in JS posso modificare un prototipo 15 passi sulla catena e quelle modifiche appariranno su oggetti esistenti.

    
risposta data 31.01.2012 - 01:52
fonte
3

C'è una variabile globale undefined , che è impostata sul valore non definito. Le persone malvagie possono impostarlo su qualcos'altro, quindi è probabilmente meglio non fidarsi di esso.

  • Il valore non definito è il valore di ritorno di una funzione che non restituisce un valore.
  • Il valore non definito è il valore di una variabile che non è stata assegnata.
  • Il valore non definito è il valore di un parametro che non è stato passato.
  • Il valore non definito è il valore di una proprietà che non è stata assegnata.
  • 'undefined' è il tipo di una variabile non dichiarata. ( typeof undeclaredVariable == 'undefined' . tentare di leggere il valore di una variabile sottesa ti farà guadagnare ReferenceError .)

null è leggermente rotto, perché typeof null == 'object' . Non so perché abbiamo undefined e null , probabilmente un incidente storico.

    
risposta data 16.08.2011 - 22:18
fonte
2

Bene, undefined è un valore sentinella ottenuto valutando qualcosa che è non definito in contrapposizione a null , che è il valore esattamente definito per rappresentare niente .

var o = { };
> undefined
o
> Object {}
o.foo
> undefined
function f() {}
> undefined
function r() { return null; }
> undefined
f()
> undefined
r()
> null

Quindi, ad esempio, il valore di ritorno di una funzione, che non definisce un valore di ritorno, è indefinito. Il valore di una proprietà non definita su un oggetto non è definito. Il valore di ritorno di un'istruzione, che non è un'espressione, è indefinito (anche se non vedrai che ciò accada se non nella console).
Tieni presente che puoi creare una funzione, che restituisce esplicitamente undefined e puoi definire esplicitamente una proprietà con il valore di undefined su un oggetto, perché in Alla fine è un valore valido. Lo faresti per comunicare esplicitamente, che qualcosa è non definito .

Potresti pensare alla relazione tra undefined e null come quella tra NaN e 0 .

    
risposta data 15.08.2011 - 10:04
fonte

Leggi altre domande sui tag