Frage

Ich habe mich immer gefragt, warum Sie Javascript um das globale Math-Objekt hat stattdessen Zahlen ihre eigenen Methoden zu geben. Gibt es einen guten Grund dafür?

Auch gibt es irgendwelche Nachteile (außer Effizienz), so etwas zu tun:

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

Just klar zu machen, ich verstehe, dass Konstanten wie π irgendwo und Funktionen benötigt, die auf mehr als eine Nummer wie min / max angewandt werden. Die Frage war vor allem Methoden über die nur eine einzige Nummer Wirkung wie rund, abs, Sünde, pow, etc.

War es hilfreich?

Lösung

Der Grund für das Math Objekt ist einfach: „weil Java tut es“. Nicht das Beste aus Gründen, aber hier sind wir. Ich denke, die Dinge mehr Sinn damals gemacht, bevor Douglas Crockford seine Kampagne gestartet * die Hälfte der Sprache zu unterdrücken. Ursprünglich waren „erlaubt“ Sie oder gemeint, solche Dinge zu tun:

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

Der Nachteil Number.prototype ausgebaut ist, dass jemand anderes könnte das gleiche tun. Oder noch schlimmer, zum Beispiel definiert Number.prototype.round als symmetrisch Rundungsfunktion.

Wenn Sie nach Möglichkeiten suchen, um Ihr Leben leichter zu machen, warum hier aufhören? Warum nicht einfach Math Funktionen wie globale Funktionen umfassen?

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] ];
}

Damit werden alle mathematischen Funktionen in den globalen Bereich fallen, effektiv so dass Sie die Eingabe beenden „Math.“ Fragen Sie sich: Gibt es einen Unterschied zwischen Number erstreckt und sich window mit diesen Funktionen

* Bevor Sie mir Flamme: Der Crockford Kommentar soll nicht zu ernst genommen werden. Ich stimme ihm zu, dass with in einer impliziten globalen Umwelt sehr gefährlich ist.

Andere Tipps

Es gibt keinen Nachteil bei der Ausweitung Number.prototype anders als andere Menschen verwirrend. Was ist der Punkt? Was besser ist value.round() statt Math.round(value) in Verwendung?

Es gibt mehrere gute Gründe für die Math Objekt:

  1. Es funktioniert für Nicht-Zahlen, auch: Math.round("5") arbeitet während value.round() wird nicht funktionieren, wenn der Wert ein String (beispielsweise der Wert einer Textbox) ist
  2. Einige Mitglieder des Math-Objekts gehören nicht zu einem „primären“ Zahlenwert, wie Math.min() oder Math.max(). Oder haben Sie es wie a.max(b) verwenden?
  3. Weitere Mitglieder sind global und gehören nicht in eine Spezialnummer. Beispiele sind Konstanten wie Math.PI oder die Funktion Math.random().

Versuchen Sie 123.round(); tun

Ihre Javascript-Konsole wird ein paar hundert von Fehlern in den Augen werfen: P, nah ...

Sie können tun:

Number.prototype.x dann: (123).x(); aber nie 123.x();

Ich denke, Math mehr als Satz Nummer Methoden ist. Es ist Nutzung breiter. Sprich, NumberVariable.PI verwendet, kann verwirrend sein. Das Gleiche gilt für Zufallszahlen Generation.

Auch ich denke, erstreckt Nummer in Ordnung ist, weil es das Teil von JS Natur. Vielleicht mich jemand korrigieren, wenn ich hier falsch bin.

ich es auf diese Weise glauben Aufruf als gut funktioniert, da Anzahl der Prototyp Funktionen arbeiten wie jedes andere Objekt Prototyp Funktionen tun:

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

Also, das Gespräch darüber, ob es eine gute Idee ist oder nicht beiseite, können Sie diese in Ordnung tun.

Sie können tun 123.x (), aber der Dolmetscher für js gebrochen

(da sie nicht den Punkt als Botschaftsabsendung interpretiert)

Seltsam, können Sie 123 .x () (mit einem Zwischenraum zwischen der Zahl und dem Punkt) statt, und es wird funktionieren.

123..also aber das funktioniert, weil Sie effektiv eine Dezimalzahl gemacht haben und dann, um es Dispatching

  

(typeof 123) === 'Zahl') // true

Versuchen:

  

Number.prototype.times = function (andere) {return dieses * andere}; 3 .times (5);

in der Konsole.

auf diesem Meine Ansicht ist, dass, wenn Sie die richtigen Kontrollen tun als nicht systemeigenen Funktionen zu überschreiben, den Namen mit dem Verständnis von nativen Benennungsstandards und es macht den Code besser lesbar und überschaubar, dann Ihren Code komfortabel und bequem machen.

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

Da dies für die Nutzung, die aufgrund der Art von JavaScript, glaube ich, der beste Weg, dies zu tun ist durch:

  • Wrapping die Zahl in einer Variablen anstelle eines einfachen statischen Wert (meist der Fall ist)
    • nNum.round ();
  • , um den einfachen statischen Wert in Klammern Verpackung:
    • (123) .round ();
  • eckige Klammer-Notation Aufruf mit
      .
    • 123 [ "rund"] call ();

Sie können dies tun,

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

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top