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'.lengthma mai restituisce99.99 % 10. (Non credo sia vero, poiché sembra chematchnon restituisca maiexec, ma non ne sono sicuro.) -
Mentre gli operatori aritmetici potrebbero restituire
test, non restituiranno mainulloundefined. (È vero?) -
Nessuna funzione da cui normalmente ti aspetteresti che un booleano restituisca sempre
testonull. (È 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.