Pregunta

Siempre me he preguntado por qué Javascript tiene el objeto Math global en lugar de dar a los números sus propios métodos. ¿Hay una buena razón para ello?

¿También hay inconvenientes (aparte de la eficiencia) de hacer algo como esto ?:

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

Solo para aclarar, entiendo que las constantes como p necesitan un lugar y funciones que se aplican en más de un número como min / max. La pregunta se refería principalmente a los métodos que solo afectan a un solo número, como round, abs, sins, pow, etc.

¿Fue útil?

Solución

El motivo del objeto Math es simple: " porque Java lo hace " ;. No es la mejor de las razones, pero aquí estamos. Creo que las cosas tenían más sentido en ese entonces, antes de que Douglas Crockford comenzara su campaña para suprimir la mitad del lenguaje *. Originalmente, se le permitió " permitido ", o se suponía que hiciera cosas como esta:

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

El inconveniente de extender Number.prototype es que alguien más podría hacer lo mismo. O peor, por ejemplo, defina Number.prototype.round como una función de redondeo simétrica .

Si está buscando maneras de facilitarle la vida, ¿por qué detenerse allí? ¿Por qué no incluir simplemente las funciones Math como funciones globales?

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

Esto colocará todas las funciones matemáticas en el ámbito global, permitiéndole efectivamente dejar de escribir " Matemáticas. " Pregúntese: ¿Hay alguna diferencia real entre ampliar Number y extender window con estas funciones?

* Antes de llamarme: el comentario de Crockford no debe tomarse demasiado en serio. Estoy de acuerdo con él en que with es muy peligroso en un entorno global implícito.

Otros consejos

No hay inconveniente en extender Number.prototype que no sea confundir a otras personas. ¿Cuál es el punto de? ¿Qué es mejor al usar value.round () en lugar de Math.round (value) ?

Hay varias buenas razones para el objeto Math :

  1. También funciona para los no números: Math.round (" 5 ") funciona mientras que value.round () no funcionará cuando el valor sea un cadena (por ejemplo, el valor de un cuadro de texto)
  2. Algunos miembros del objeto Math no pertenecen a un " primario " valor numérico, como Math.min () o Math.max () . ¿O quieres usarlo como a.max (b) ?
  3. Otros miembros son globales y no pertenecen a un número especializado. Los ejemplos son constantes como Math.PI o la función Math.random () .

Intenta hacer 123.round();

Su consola de JavaScript arrojará unos cientos de errores a sus ojos: P, nah ...

Puedes hacer:

Number.prototype.x luego: (123) .x (); pero nunca 123.x ();

Creo que las matemáticas son más que un conjunto de métodos numéricos. Su uso es más amplio. Digamos que usar NumberVariable.PI puede ser confuso. Lo mismo con la generación de números aleatorios.

También creo que extender el número está bien, porque es parte de la naturaleza JS. Tal vez alguien me corrija si me equivoco aquí.

Creo que llamarlo de esta manera también funciona, ya que las funciones prototipo de Number funcionan igual que las funciones prototipo de cualquier otro objeto:

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

Por lo tanto, si la conversación sobre si es una buena idea o no, puedes hacerlo bien.

Puedes hacer 123.x () pero el intérprete de js está roto (ya que no interpreta el punto como un envío de mensajes)

Extrañamente, puedes usar 123 .x () (con un espacio entre el número y el punto) en su lugar, y funcionará.

123..también funciona, pero eso es porque efectivamente has hecho un decimal y luego enviándolo a él

  

(typeof 123.) === 'number') // true

Prueba:

  

Number.prototype.times = function (other) {return this * other}; 3 veces (5);

en la consola.

Mi opinión sobre esto es que si realiza las comprobaciones adecuadas para no sobrescribir la funcionalidad nativa, nombre con comprensión de los estándares de nomenclatura nativos y hace que su código sea más legible y manejable, entonces haga que su código sea cómodo y conveniente.

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

Para usar esto, debido a la naturaleza de javascript, creo que la mejor manera de hacerlo es mediante:

  • Ajustar el número en una variable en lugar de un simple valor estático (en la mayoría de los casos)
    • nNum.round ();
  • Envolviendo el valor estático simple entre paréntesis:
    • (123) .round ();
  • Llamar usando notación de corchete
    • 123 [" round "]. call ();

Puedes hacer esto

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top