Math对象
正如我们所看到的那样,Math
对象中包含了许多与数字相关的工具函数,比如Math.max
(求最大值)、Math.min
(求最小值)和Math.sqrt
(求平方根)。
Math
对象被用作一个容器来分组一堆相关的功能。 只有一个Math
对象,它作为一个值几乎没有用处。 相反,它提供了一个命名空间,使所有这些函数和值不必是全局绑定。
过多的全局绑定会“污染”命名空间。全局绑定越多,就越有可能一不小心把某些绑定的值覆盖掉。比如,我们可能想在程序中使用名为max
的绑定,由于 JavaScript 将内置的max
函数安全地放置在Math
对象中,因此不必担心max
的值会被覆盖。
当你去定义一个已经被使用的绑定名的时候,对于很多编程语言来说,都会阻止你这么做,至少会对这种行为发出警告。但是 JavaScript 不会,因此要小心这些陷阱。
让我们来继续了解Math
对象。如果需要做三角运算,Math
对象可以帮助到你,它包含cos
(余弦)、sin
(正弦)、tan
(正切)和各自的反函数(acos
、asin
和atan
)。Math.PI
则表示数字π
,或至少是 JavaScript 中的数字近似值。在传统的程序设计当中,常量均以大写来标注。
function randomPointOnCircle(radius) {
let angle = Math.random() * 2 * Math.PI;
return {x: radius * Math.cos(angle),
y: radius * Math.sin(angle)};
}
console.log(randomPointOnCircle(2));
// → {x: 0.3667, y: 1.966}
如果你对正弦或余弦不大熟悉,不必担心。我们会在第 13 章用到它们时,再做进一步解释。
在上面的示例代码中使用了Math.random
。每次调用该函数时,会返回一个伪随机数,范围在 0(包括)到 1(不包括)之间。
console.log(Math.random());
// → 0.36993729369714856
console.log(Math.random());
// → 0.727367032552138
console.log(Math.random());
// → 0.40180766698904335
虽然计算机是确定性的机器,但如果给定相同的输入,它们总是以相同的方式作出反应 - 让它们产生随机显示的数字是可能的。 为此,机器会维护一些隐藏的值,并且每当你请求一个新的随机数时,它都会对该隐藏值执行复杂的计算来创建一个新值。 它存储一个新值并返回从中派生的一些数字。 这样,它可以以随机的方式产生新的,难以预测的数字。
如果我们想获取一个随机的整数而非小数,可以使用Math.floor
(向下取整到与当前数字最接近的整数)来处理Math.random
的结果。
console.log(Math.floor(Math.random() * 10));
// → 2
将随机数乘以 10 可以得到一个在 0 到 10 之间的数字。由于Math.floor
是向下取整,因此该函数会等概率地取到 0 到 9 中的任何一个数字。
还有两个函数,分别是Math.ceil
(向上取整)和Math.round
(四舍五入)。以及Math.abs
,它取数字的绝对值,这意味着它反转了负值,但保留了正值。