我一直想知道为什么Javascript具有全局Math对象而不是给出数字自己的方法.它有充分的理由吗?
做这样的事情也有任何缺点(效率除外)吗?:
Number.prototype.round = function(){ return Math.round(this); };
为了说清楚,我理解像π这样的常量需要某个地方和函数应用于多个数字,如min/max.问题主要涉及只影响单个数字的方法,如圆形,abs,sin,pow等.
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()
.
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这会将所有数学函数放入全局范围,从而有效地允许您停止输入"Math".问问自己:扩展
Number
和扩展window
这些功能有什么真正的区别吗?*在你激怒我之前:克罗克福德的评论并不意味着太过认真.我确实同意他
with
在一个隐含的全球环境中非常危险.
3> 小智..:试着做
123.round();
你的javascript控制台会给你的眼睛抛出几百个错误:P,不......
你可以做:
Number.prototype.x
然后:(123).x();
但永远不会123.x();
简单:123..round()
是的,`123..round()`或`(123).round()`都可以.`123..round()=== 123.0.round()`
我一直想知道为什么你不能做123.method().我知道因为浮点数而不允许它更容易,但我认为ruby允许语法,它会让一切变得更容易!