Sto scrivendo del codice che deve gestire molti potenziali valori JavaScript, compresi i cosiddetti non valori. Mi sto rendendo conto che sarebbe molto utile sapere se esistono alcune regole generali su quali funzioni JavaScript native possono restituire null
e che possono restituire undefined
. Quindi questa domanda.
Ovviamente, a qualsiasi variabile può essere assegnato null
o undefined
quindi sono non si parla di codice personalizzato incluso il codice dalle librerie. Mi riferisco solo alle funzioni native JavaScript (incluso in ES6 / ES2015). Inoltre, quando mi riferisco a "funzioni" intendo quello in senso generico in cui mi riferisco a
- funzioni globali , ad es. %codice%
- metodi di oggetti built-in , ad es. %codice%
- metodi prototipo , ad es. %codice%
- proprietà prototipo , ad es. %codice%
- operatori (ad esempio aritmetico, bit a bit, ecc.), ad es. %codice%
I seguenti sono alcuni esempi del tipo di regole che potrei sperare. Non sostengo che nessuno di loro sia corretto o meno. Sto solo mostrando cosa intendo per categorie:
-
Tutte le funzioni di corrispondenza regex (ad esempio
parseFloat("99.99")
,Math.floor(99.99)
,'$99.99'.match('$')
) può restituisce'$99.99'.length
ma mai restituisce99.99 % 10
. (Non credo sia vero, poiché sembra chematch
non restituisca maiexec
, ma non ne sono sicuro.) -
Mentre gli operatori aritmetici potrebbero restituire
test
, non restituiranno mainull
oundefined
. (È vero?) -
Nessuna funzione da cui normalmente ti aspetteresti che un booleano restituisca sempre
test
onull
. (È vero?) -
Qualsiasi valore di ritorno che significa "il set vuoto" (ad esempio "nessuna corrispondenza regolare è stata trovata", "nessun elemento documento con quell'id è stato trovato") si manifesterà sempre come
NaN
. (È vero?)
Sono particolarmente interessato ai casi limite, incluse le funzioni utilizzate impropriamente , ad es. con un parametro non sensoriale. Ad esempio, null
può restituire undefined
(ad esempio null
) ma undefined
potrebbe non restituire mai null
(ad esempio String.prototype.match
restituisce null
, non 'abc'.match(Object)
).
Se qualcuno potesse aggiungere il nuovo tag "indefinito" a questa domanda, sarebbe utile. Non ho abbastanza punti reputazione su "Ingegneria del software" per farlo.