Domanda

Mi sono sempre chiesto perché Javascript abbia l'oggetto Math globale invece di dare ai numeri i propri metodi. C'è una buona ragione per questo?

Ci sono anche degli svantaggi (oltre all'efficienza) nel fare qualcosa del genere ?:

Number.prototype.round = function(){
    return Math.round(this);
};

Giusto per chiarire, capisco che costanti come & # 960; hanno bisogno di un posto e di funzioni che vengono applicate su più di un numero come min / max. La domanda riguardava principalmente i metodi che hanno effetto solo su un singolo numero come round, abs, sin, pow, ecc.

È stato utile?

Soluzione

Il motivo per l'oggetto Math è semplice: " perché Java lo fa " ;. Non è il migliore dei motivi, ma eccoci qui. Immagino che le cose avessero più senso allora, prima che Douglas Crockford iniziasse la sua campagna per sopprimere metà della lingua *. Inizialmente eri autorizzato a fare cose del genere:

with (Math) {
  var n = min( round(a) * round(b), sqrt(c) );
  var result = exp( n + d );
}

Lo svantaggio di estendere Number.prototype è che qualcun altro potrebbe fare la stessa cosa. O peggio, ad esempio, definire Number.prototype.round come una funzione di arrotondamento simmetrica .

Se stai cercando modi per semplificarti la vita, perché fermarsi qui? Perché non includere semplicemente le funzioni Math come funzioni globali?

var m = 'abs acos asin atan atan2 ceil cos exp floor log max min ' +
        'pow random round sin sqrt tan PI').split(' ');
for (var i=0,l=m.length; i<l; i++) {
  window[ m[i] ] = Math[ m[i] ];
}

In questo modo tutte le funzioni matematiche verranno rilasciate nell'ambito globale, consentendoti effettivamente di smettere di digitare " Math. " Chiediti: c'è qualche vera differenza tra l'estensione di Number e l'estensione di window con queste funzioni?

* Prima che tu mi dia fuoco: il commento di Crockford non deve essere preso troppo sul serio. Sono d'accordo con lui sul fatto che con sia molto pericoloso in un ambiente globale implicito.

Altri suggerimenti

Non c'è alcun inconveniente nell'estensione di Number.prototype oltre a confondere altre persone. Qual e il punto? Cosa c'è di meglio nell'uso di value.round () invece di Math.round (value) ?

Esistono diversi buoni motivi per l'oggetto Math :

  1. Funziona anche per i non numeri: Math.round (" 5 ") funziona mentre value.round () non funzionerà quando value è un stringa (ad esempio, il valore di una casella di testo)
  2. Alcuni membri dell'oggetto Math non appartengono a un " primary " valore numerico, come Math.min () o Math.max () . Oppure vuoi usarlo come a.max (b) ?
  3. Gli altri membri sono globali e non appartengono a un numero specializzato. Esempi sono costanti come Math.PI o la funzione Math.random () .

Prova a fare 123.round();

La tua console javascript genererà alcune centinaia di errori: P, nah ...

Puoi fare:

Number.prototype.x quindi: (123) .x (); ma mai 123.x ();

Penso che la matematica sia più che un insieme di metodi numerici. È un utilizzo più ampio. Supponiamo che l'utilizzo di NumberVariable.PI possa creare confusione. Lo stesso vale per la generazione di numeri casuali.

Inoltre penso che l'estensione del numero sia OK, perché fa parte della natura di JS. Forse qualcuno mi correggerà se sbaglio qui.

Credo che anche chiamarlo in questo modo funzioni, dal momento che le funzioni prototipo di Number funzionano esattamente come tutte le altre funzioni prototipo di Object:

5.5["round"]();
//should return 6

Quindi, la conversazione sul fatto che sia una buona idea o meno a parte, puoi farlo bene.

Puoi fare 123.x () ma l'interprete per js è rotto (in quanto non interpreta il punto come un messaggio di invio)

Stranamente, puoi usare 123 .x () (con uno spazio tra il numero e il punto), e funzionerà.

123..anche funziona, ma è perché hai effettivamente fatto un decimale e poi lo hai inviato

  

(tipo di 123.) === 'numero') // vero

Prova:

  

Number.prototype.times = function (altro) {restituisce questo * altro}; 3 .times (5);

nella console.

La mia opinione su questo è che se si eseguono i controlli corretti per non sovrascrivere la funzionalità nativa, nominare con comprensione degli standard di denominazione nativi e rendere il codice più leggibile e gestibile, quindi renderlo comodo e conveniente.

if (Number.prototype.round == null)
    Number.prototype.round = function() { return Math.round(this); }

AS per l'utilizzo di questo, a causa della natura di javascript, credo che il modo migliore per farlo sia:

  • Avvolgimento del numero in una variabile anziché in un semplice valore statico (il più delle volte il caso)
    • nNum.round ();
  • Avvolgimento del semplice valore statico tra parentesi:
    • (123) .round ();
  • Chiamata usando la notazione parentesi quadra
    • 123 [" tutto "] chiamata ();.

Puoi farlo

Number.prototype.round = function() {
    return Math.round(this.valueOf());
};

https://www.w3schools.com/jsref/jsref_prototype_num.asp

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top