我一直想知道为什么 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 之间有什么真正的区别吗?

*在你激怒我之前:Crockford的评论不应该被认真对待。我同意他的观点, with 在隐含的全球环境中非常危险。

其他提示

除了混淆其他人之外,扩展 Number.prototype 没有任何缺点。重点是什么?使用 value.round()代替 Math.round(value)更好?

Math 对象有几个很好的理由:

  1. 它也适用于非数字: Math.round(&quot; 5&quot;)有效,而 value.round()在值为a时无效字符串(例如,文本框的值)
  2. Math对象的某些成员不属于“primary”对象。数字值,如 Math.min() Math.max()。或者你想使用它像 a.max(b)
  3. 其他成员是全球性的,不属于专门的数字。示例是常量,如 Math.PI 或函数 Math.random()

尝试 123.round();

你的javascript控制台会给你的眼睛抛出几百个错误:P,nah ......

你可以这样做:

Number.prototype.x 然后:(123).x(); 但从不 123.x();

我认为Math不仅仅是Number方法的集合。它的用途更广泛。比方说,使用NumberVariable.PI可能会令人困惑。与随机数生成相同。

另外我认为扩展数字是可以的,因为它是JS性质的一部分。如果我在这里错了,也许会有人纠正我。

我相信这样调用也可以,因为Number的原型函数就像其他Object的原型函数一样工作:

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

所以,关于它是否是一个好主意的谈话,你可以做得很好。

您可以执行123.x()但js的解释器已损坏(因为它不会将点解释为消息调度)

奇怪的是,你可以使用123 .x()(在数字和点之间留一个空格)代替它,它会起作用。

123 ..也可以,但那是因为你有效地制作了小数,然后发送给它

  

(typeof 123.)==='number')// 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).round();
  • 使用方括号表示法调用
    • 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