我一直想知道为什么 Javascript 有全局 Math 对象而不是为数字提供自己的方法。有充分的理由吗?
这样做还有什么缺点(除了效率之外)吗?:
Number.prototype.round = function(){
return Math.round(this);
};
澄清一下,我知道像 π 这样的常数需要在某个地方以及应用于多个数字(例如最小值/最大值)的函数。问题主要是关于只影响单个数字的方法,例如 round、abs、sin、pow 等。
最佳答案
Math
对象的原因很简单:“因为 Java 就是这么做的”。这不是最好的理由,但我们就在这里。我想,在道格拉斯·克罗克福德 (Douglas Crockford) 开始压制一半语言*之前,当时的事情更有意义。最初你被“允许”,或者意味着,做这样的事情:
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
之间有什么真正的区别吗?
* 在你攻击我之前:克罗克福德的评论并不意味着被过于认真地对待。我确实同意他的观点,即 with
在隐式全局环境中非常危险。
关于javascript - 在 javascript 和 Math 对象中扩展 Number.prototype?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/622374/