Quali funzioni / metodi / proprietà / operatori JavaScript nativi possono restituire null? non definito? [chiuso]

1

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 restituisce 99.99 % 10 . (Non credo sia vero, poiché sembra che match non restituisca mai exec , ma non ne sono sicuro.)

  • Mentre gli operatori aritmetici potrebbero restituire test , non restituiranno mai null o undefined . (È vero?)

  • Nessuna funzione da cui normalmente ti aspetteresti che un booleano restituisca sempre test o null . (È 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.

    
posta Andrew Willems 10.11.2016 - 03:14
fonte

1 risposta

1

Alla fine puoi farlo analizzando la specifica della lingua ECMAScript che fornisce convenientemente il implementazione dei metodi nativi.

Ad esempio, Object.defineProperty(O, P, Attributes) è documentato come in questo modo:

  1. If Type(O) is not Object, throw a TypeError exception.
  2. Let key be ? ToPropertyKey(P).
  3. Let desc be ? ToPropertyDescriptor(Attributes).
  4. Perform ? DefinePropertyOrThrow(O, key, desc).
  5. Return O.

Qui, semplicemente analizzando l'elenco, puoi determinare che:

  • Il metodo restituisce effettivamente qualcosa, perché uno degli elementi della lista corrisponde al modello Return .*\. .

  • Il metodo restituisce il parametro O , perché O è tra gli argomenti del metodo.

Allo stesso modo, Array.prototype.find molto convenientemente ti dice che a volte, il metodo:

  1. Return[s] undefined.

La difficoltà è che anche questo semplice esempio non è facile da eseguire programmaticamente. Suppongo che mentre ECMAScript sia molto coerente nelle descrizioni dei metodi, l'elevato numero di possibili forme di questi metodi rende piuttosto complicato l'analisi della documentazione. Ad esempio, Array.prototype.join restituisce R , ma R non è un argomento: invece, è un valore che viene assegnato attraverso le istruzioni come:

  1. If element0 is undefined or null, let R be the empty String; otherwise, let R be ? ToString(element0).

A meno che non ci sia una grammatica BNF effettiva che è stata usata per scrivere le specifiche, l'analisi di tali affermazioni sarebbe difficile da impossibile.

Il lato positivo, tuttavia, è che se riesci a creare tale parser, includerà i "casi limite, incluse le funzioni usate in modo improprio" di cui stavi parlando.

My use case that inspired my question was coding a "maybe" monad that would need to deal with null or undefined coming from any source, and I was just interested in creating a few different demo functions that would do so.

A mio modesto parere, creare l'elenco di tutti i metodi JavaScript solo per avere "alcune funzioni demo diverse" è eccessivo. Perché non limitarti con uno o più metodi e usarli come demo?

Ancora usando la specifica, un esempio di un metodo che restituisce undefined è Array.prototype.find già elencato sopra; per null , un esempio potrebbe essere Date.prototype.toJSON .

    
risposta data 10.11.2016 - 13:25
fonte

Leggi altre domande sui tag