2016-01-04 12 views
35

Sto roteando in ES2015 + il lusso con pochi progetti in questo momento e mi chiedo se posso sbarazzarmi della crutch tanto odiata per controllare undefined nel nuovo paese delle meraviglie.ES2015/2016 way of 'typeof varName ===' undefined`?

Esiste già un modo più breve ma ancora esatto per typeof varName === 'undefined' in ES2015 +?

Ovviamente potrei usare default parameters ma questo sembra anche un compito non necessario.

function coolFn(a = null){ 
    if (a===null) console.log("no a supplied"); 
} 
+3

Cosa intendi con "migliore"? – Pointy

+4

Perché utilizzare un tipo di controllo in primo luogo? 'if (a === undefined)' – epascarello

+0

@Pointy Intendo dire più breve per scrivere ma copre ancora tutti i casi. – Hedge

risposta

44

Basta controllare per varName === undefined.

Nei browser precedenti era possibile assegnare un valore alternativo alla variabile globale undefined causando il fallimento di tale test, ma in ES2015 + questo è ora impossibile.

Nota che non è possibile distinguere esplicitamente il passaggio da undefined come parametro per escludere del tutto il parametro se non guardando arguments.length.

+0

Come potrei perdere quello! Sì, è già abbastanza buono :) Non ho bisogno di distinguere tra i due casi che hai menzionato. – Hedge

+4

Dato che ES5 non è possibile modificare la proprietà globale 'indefinita'. Ma puoi comunque oscurarlo con una variabile locale. – Oriol

+0

@Oriol è vero, ma se lo fai hai solo te stesso da incolpare. Ciò che non puoi fare ora è "iniettare" un valore diverso di "indefinito" nella portata globale. – Alnitak

18

L'unico caso in cui è utile typeof varName === 'undefined' è quando non si sa se è stata dichiarata la variabile varName.

E IMO se non si sa se le variabili sono dichiarate, il codice ha seri problemi.

In altri casi si hanno opzioni migliori:

  • varName === void 0

    Questo consente di rilevare se varName non è definito.

    void è un operatore che riceve un argomento (è possibile utilizzare qualsiasi cosa invece di 0) e restituisce un valore non definito.

  • varName === undefined

    Questo dovrebbe rilevare se varName non è definito.

    Tuttavia, tenere presente che lo undefined globale potrebbe essere stato sovrascritto (prima di ES5) o ombreggiato con un altro valore. Pertanto preferisco void, che è anche più breve.

  • varName == null

    Ciò rileva se varName è definito o è nullo.

  • !varName

    Ciò rileva se è varName falsy (undefined, null, 0, stringa vuota, NaN, false).

+0

'void 0' è bello, ma un po 'strano sintassi poiché' void' ha a malapena qualsiasi altro uso in JS (se esiste?) E non esprime abbastanza l'intento desiderato. – Alnitak

+0

Se vuoi più corto, '[] [0]' è più corto di 'void 0'. –

+0

@TravisJ A meno che uno script pazzo non abbia fatto 'Array.prototype [0] = someThing';) – Oriol