2015-07-28 5 views
5

Se ho una variabile non dichiarata e utilizzo typeof mi dice che è undefined. Ma se poi lo controllo usando if (qweasdasd === undefined) lancia un'eccezione.Utilizzare typeof vs === per verificare che la variabile non dichiarata produca un risultato diverso

Non capisco questo comportamento, perché se il primo dice undefined, quindi il secondo controllo dovrebbe valutare a if (undefined === undefined), perché genera un'eccezione ReferenceError?

+0

non può riprodurre: http://jsfiddle.net/y1xhw9un/ – Jamiec

+0

@Jamiec - in grado di riprodurre: http: // jsfiddle.net/y1xhw9un/1/ – Quentin

+0

@Quentin - ahh, questo * non dichiarato *, quando non è definito, quindi funziona http://jsfiddle.net/y1xhw9un/2/ – Jamiec

risposta

7

typeof si presenta come una chiamata di funzione, ma non lo è, è un operatore. Gli operatori sono autorizzati a violare le regole. typeof(qweasdasd) non presuppone l'esistenza di qweasdasd; se esiste o no e che cos'è è ciò che esiste typeof da scoprire. Tuttavia, quando si prova qweasdasd === undefined, si utilizza qweasdasd come valore e JS si lamenta quando si utilizza una variabile a cui non è stato assegnato un valore.

+0

Ma non è una bugia dire che 'qweasdasd' è un' indefinito'? Perché poi nella mia mente il controllo 'if' è perfettamente valido e dovrebbe valutare a 'if (undefined === undefined)'. – damluar

+1

JavaScript è un po 'confuso qui (e non è l'unico posto, non farmi iniziare con la follia di 'sort'). Come ho detto, essere indefinito e avere il valore 'indefinito' sono due cose diverse, una situazione sfortunata esacerbata dal fatto che' typeof (qweasdasd) 'e' typeof (indefinito) 'producono entrambi lo stesso risultato. – Amadan

+0

A volte devi solo rinunciare a capire la logica di javascript. – damluar

1

Cercando di leggere il valore di una variabile non dichiarata (che è necessario fare prima di poter confrontare tale valore con il valore di undefined) genera un'eccezione ReferenceError.

L'applicazione dell'operatore typeof a una variabile non dichiarata non.

+0

Perché 'typeof' si comporta diversamente da, ad esempio,' + '(ad es.' + Foo -> boom! ')? –

0

Si dispone di una variabile non definita, ma non di un valore dell'oggetto non definito.

console.log(variable) // undefined 
console.log(typeof variable) // "undefined" 
console.log(variable === undefined) // Reference error 
variable = undefined ; 
console.log(variable === undefined) // true 
0

Cercando di accedere variabile non definita in Javascript dà ReferenceError. typeof funziona perché non accede al valore variabile. Controlla il suo tipo.

typeof non richiede variabile definita. Il suo parametro dovrebbe essere un'espressione che rappresenta l'oggetto o la primitiva di cui deve essere restituito il tipo.

0

typeof è un operatore che restituisce una stringa che indica il tipo di operando non valutato. Non importa se l'operando non valutato non è definito o no. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof

>>> if (a !== 'undefined'); 
Exception: ReferenceError: Can't find variable: a 
>>> if (typeof a !== undefined); 
undefined 
>>> if (typeof a !== void 0); 
undefined 
+0

'typeof (parseInt)': '" function "'. Ma 'typeof (typeof)': 'SyntaxError'. 'typeof' è * non una funzione *; se * fosse * una funzione, darebbe 'ReferenceError' proprio come fa' parseInt (qweasdasd) '. – Amadan

+0

Sì, hai ragione, ho modificato la mia risposta. –

1

Penso di avere una spiegazione molto semplice per questo - perché le specifiche dicono così:

  • typeof operator non dovrebbe generare l'eccezione ReferenceError se la variabile non è definita
  1. If Type(val) is Reference, then
    a. If IsUnresolvableReference(val) is true, return "undefined" .
  • === operator è supposto per generare l'eccezione ReferenceError se l'operando (s) si riferiscono a variabili indefinite
  1. Let lval be GetValue(lref).

[And inside the definition of GetValue we have]

  1. Let base be the result of calling GetBase(V).
  2. If IsUnresolvableReference(V), throw a ReferenceError exception.