Вопрос

Мне всегда было интересно, почему в Javascript есть глобальный объект Math вместо того, чтобы присваивать числам собственные методы.Есть ли для этого веская причина?

Также есть ли какие-либо недостатки (кроме эффективности) у такого действия?:

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

Просто чтобы внести ясность: я понимаю, что где-то нужны константы, такие как π, и функции, которые применяются более чем к одному числу, например мин/макс.В основном вопрос касался методов, которые влияют только на одно число, например round, abs, sin, pow и т. д.

Это было полезно?

Решение

Причина использования объекта Math проста: " потому что Java это делает " ;. Не самая лучшая причина, но мы здесь. Я думаю, что тогда было больше смысла, прежде чем Дуглас Крокфорд начал свою кампанию по подавлению половины языка *. Первоначально вы были «разрешены» или имели в виду делать такие вещи:

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

Недостатком расширения Number.prototype является то, что кто-то другой может сделать то же самое. Или еще хуже, например, определить Number.prototype.round как симметричную функцию округления.

Если вы ищете способы облегчить свою жизнь, зачем останавливаться на достигнутом? Почему бы просто не включить функции Math в качестве глобальных функций?

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

Это приведет к тому, что все математические функции переместятся в глобальную область действия, что фактически позволит вам прекратить вводить "Math." Задайте себе вопрос: есть ли реальная разница между расширением Number и расширением window с помощью этих функций?

* Перед тем, как вы меня разозлите: комментарий Крокфорда не следует воспринимать слишком серьезно. Я согласен с ним, что с очень опасен в неявной глобальной среде.

Другие советы

В расширении Number.prototype нет недостатка, кроме как запутать других людей. В чем смысл? Что лучше использовать value.round () вместо Math.round (value) ?

Для объекта Math есть несколько веских причин:

<Ол>
  • Это работает и для нечисловых чисел: Math.round (" 5 ") работает, тогда как value.round () не будет работать, если значение является строка (например, значение текстового поля)
  • Некоторые члены объекта Math не относятся к " первичному " числовое значение, например Math.min () или Math.max () . Или вы хотите использовать его как a.max (b) ?
  • Другие участники являются глобальными и не принадлежат к специализированному номеру. Примерами являются константы, такие как Math.PI или функция Math.random () .
  • Попробуйте выполнить 123.round ();

    Ваша консоль javascript вызовет у вас несколько сотен ошибок: P, нет ...

    Вы можете сделать:

    Number.prototype.x затем: (123) .x (); , но никогда 123.x ();

    Я думаю, что Math - это больше, чем набор методов Number. Это использование шире. Скажем, использование NumberVariable.PI может сбить с толку. То же самое с генерацией случайных чисел.

    Также я думаю, что расширение числа - это нормально, потому что это часть природы JS. Может быть, кто-то исправит меня, если я здесь не прав.

    Я считаю, что вызов этого способа также работает, поскольку функции-прототипы Number работают так же, как и все функции-прототипы других объектов:

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

    Итак, разговор о том, хорошая это идея или нет, в стороне, вы можете сделать это нормально.

    Вы можете использовать 123.x(), но интерпретатор js не работает (поскольку он не интерпретирует точку как отправку сообщения)

    Как ни странно, вместо этого вы можете использовать 123 .x() (с пробелом между числом и точкой), и это будет работать.

    123..тоже работает, но это потому, что вы фактически создали десятичную дробь, а затем отправили ее

    (typeof 123.) === 'число') // true

    Пытаться:

    Number.prototype.times = function(other) { return this * Other };3 .раз(5);

    в консоли.

    Я считаю, что если вы проводите надлежащие проверки, чтобы не перезаписывать встроенные функции, имена с пониманием собственных стандартов именования, и это делает ваш код более читабельным и управляемым, тогда сделайте свой код комфортным и удобным.

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

    Что касается использования этого, из-за природы javascript я считаю, что лучший способ сделать это:

    • Обертывание числа в переменную вместо простого статического значения (чаще всего это так)
      • nNum.round();
    • Заключение простого статического значения в круглые скобки:
      • (123).раунд();
    • Вызов с использованием квадратных скобок
      • 123["раунд"].call();

    Вы можете сделать это

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

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top