我一直想知道为什么Javascript具有全局Math对象而不是给出数字自己的方法。它有充分的理由吗?
做这样的事情也有任何缺点(效率除外)吗?:
Number.prototype.round = function(){
return Math.round(this);
};
为了弄清楚,我理解像π这样的常量需要某个地方和函数应用于多个数字,如min / max。问题主要涉及只影响单个数字的方法,如圆形,abs,sin,pow等。
答案 0 :(得分:20)
除了让其他人感到困惑之外,延伸Number.prototype
没有任何缺点。重点是什么?使用value.round()
代替Math.round(value)
更好?
Math
对象有几个很好的理由:
Math.round("5")
有效,而value.round()
在值为字符串时不起作用(例如,文本框的值)Math.min()
或Math.max()
。或者你想像a.max(b)
?Math.PI
或函数Math.random()
等常量。答案 1 :(得分:19)
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
在一个隐含的全球环境中是非常危险的。
答案 2 :(得分:13)
尝试123.round();
你的javascript控制台会给你的眼睛抛出几百个错误:P,nah ......
你可以这样做:
Number.prototype.x
然后:(123).x();
但永远不会123.x();
答案 3 :(得分:1)
我认为Math不仅仅是Number方法的集合。它的用途更广泛。比方说,使用NumberVariable.PI可能会令人困惑。与随机数生成相同。
另外我认为扩展数字是可以的,因为它是JS性质的一部分。如果我在这里错了,也许会有人纠正我。
答案 4 :(得分:1)
我相信这样调用也可以,因为Number的原型函数就像其他Object的原型函数一样工作:
5.5["round"]();
//should return 6
答案 5 :(得分:1)
所以,关于它是否是一个好主意的谈话,你可以做得很好。
您可以执行123.x()但js的解释器已损坏(因为它不会将点解释为消息调度)
奇怪的是,你可以使用123 .x()(在数字和点之间留一个空格)代替它,它会起作用。
123 ..也可以,但那是因为你有效地制作了小数,然后发送给它
(typeof 123.)==='number')// true
尝试:
Number.prototype.times = function(other){return this * other}; 3次(5);
在控制台中。
答案 6 :(得分:0)
我对此的看法是,如果您进行了正确的检查,不会覆盖本机功能,请了解本机命名标准,并使代码更易读,更易于管理,然后使代码更加方便。
if (Number.prototype.round == null)
Number.prototype.round = function() { return Math.round(this); }
AS使用它,因为javascript的性质,我相信最好的方法是:
答案 7 :(得分:0)
你可以这样做
Number.prototype.round = function() {
return Math.round(this.valueOf());
};