ECMA-262 对内置对象的定义是“任何由 ECMAScript 实现提供、与宿主环境无关,并在 ECMAScript 程序开始执行时就存在的对象”。<br />具体的内置对象参考[这个 <-------👈](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Math/random)
8.1 Math
ECMAScript
提供了Math对象作为保存数学公式、信息和计算的地方,整个Math对象包含了许多辅助计算的数学方法和属性。
注意:
Math 对象上提供的计算要比直接在 JavaScript 实现的快得多,因为 Math 对象上的计算 使用了 JavaScript 引擎中更高效的实现和处理器指令。但使用 Math 计算的问题是精度会因浏览器、操作系统、指令集和硬件而异。(简而言之,Math 的计算效率通过浏览器主机来确定)
属性、方法名 | 功能 |
---|---|
Math.PI | 圆周率 |
Math.floor() | 向下取整 |
Math.ceil() | 向上取整 |
Math.round() | 四舍五入版 就近取整 注意 -3.5 结果是 -3 |
Math.abs() | 绝对值 |
Math.max()/Math.min() | 求最大和最小值 |
Math.random() | 获取范围在[0,1]内的随机值 |
注意:
- Math内置对象使用时要带
()
1. min() 和 max() 方法
Math 对象也提供了很多辅助执行简单或复杂数学计算的方法。min()
和max()
方法用于确定一组数值中的最小值和最大值。这两个方法都接受任意多个参数。
let max = Math.max(3, 54, 32, 16);
console.log(max); // 54
let min = Math.min(3, 54, 32, 16);
console.log(min); // 3
- 54、32和16 中,Math.max() 返回 54,Math.min() 返回 3.
- 使用这两个方法可以避免使用额外的循环和 if 语句来确定一组数值的最大最小值。
当输入数组来确认数组内的最大值时
let values = [1,2,3,4,5,6,7,8];
let max = Math.max(...val);
- 想要
max()
认识数值,需要在数组名前面加...
三个英文句号,用来表示内部元素为数组元素
2. 舍入方法
舍去浮点型小数部分有四种方法:
Math.ceil()
方法始终向上舍入为最接近的整数 (1.9=2、1.2=2)Math.floor()
方法始终向下舍入为最接近的整数 (1.9=1、1.2=1)Math.round()
方法执行四舍五入Math.fround()
方法返回数值最接近的单精度(32位)浮点数表示// 向上取整,小数全部为进位
console.log(Math.ceil(25.9)); // 26
console.log(Math.ceil(25.5)); // 26
console.log(Math.ceil(25.1)); // 26
//四舍五入
console.log(Math.round(25.9)); // 26
console.log(Math.round(25.5)); // 26
console.log(Math.round(25.1)); // 25
console.log(Math.fround(0.4)); // 0.4000000059604645
console.log(Math.fround(0.5)); // 0.5
console.log(Math.fround(25.9)); // 25.899999618530273
// 向下取整,小数全部舍去不进位
console.log(Math.floor(25.9)); // 25
console.log(Math.floor(25.5)); // 25
console.log(Math.floor(25.1)); // 25
对于25-26之间的值,
Math.ceil()
都会返回 26,而Math.floor()
都会返回 25
random() 方法
Math.random
方法返回一个 0~1 范围内的随机数,其中包含 0 但不包含 1。对于希望显示随机名言或随机新闻的网页,这个方法是非常方便的。
function getRandonInt(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min)) + min; // 不含最大值,含最小值
}
- 这是选择最小数~最大数之间随机选择一个整数
- 通过向下取整舍去全部小数,所以不会达到最大数值,需要在此基础上
+1
let num = Math.floor(Math.random() * 10 + 1);
- 这是取1~10内随机数
- 如果要取整数在外层包裹一个
Math.floor()
在此基础上,如果取2~9的话,情况又不一样
let num = Math.floor(Math.random() * 9 + 2);
- 当
Math.random()
取 0 时,由于最小是2,所以需要在当前基础上+2 - 但在最大时,由于最小取值已经是2,最大值 * 10 时会在当前基础上 +2,从而会取到11,考虑到范围,需要限制从而将10换成9
function selectFrom(lowerValue, upperValue) { //lowerValue 为最小值 upperValue 为最大值
let choices = upperValue - lowerValue + 1; //值为乘区大小
return Math.floor(Math.random() * choices + lowerValue);
}
let num = selectFrom(2,10); // 10-2+1=9,所以*9
console.log(num); // 2~10 范围内的值,其中包含 2 和 10
- 这里的函数 selectFrom()接收两个函数:应该返回的最小值和最大值。通过将这两个值减再加 1 得到可选总数,然后再套用上面的公式。于是,调用selectFrom(2,10)就可以从 2~10 (包含) 范围内选择一个值了。使用这个函数,从一个数组随机选择一个元素就很容易
在这个例子中,传给 selectFrom()的第二个参数是数组长度减 1,即数组最大的索引值。let colors = ["red","green","blue","yellow","black","purple","brown"];
let color = colors[selectFrom(0, colors.length-1];
注意:Math.random()
方法在这里处于演示目的是没有问题的。如果是为了加密而需要生成随机数(传给生成器的输入需要较高的不确定性),那么建议使用window.crypto.getRandowValues()
。
8.2 日期对象
Date 对象和 Math 对象不一样,Date是一个构造函数,所以使用时需要实例化后才能使用其中具体方法和属性。Date 实例用来处理日期和时间
使用Date实例化日期对象
获取当前时间必须实例化:
var now = new Date();
获取指定时间的日期对象
var future = new Date('2021/5/7');
注意:如果创建实例时并未传入参数,则得到的日期对象是当前时间对应的日期对象
通过Date实例获取总毫秒数
- 总毫秒数的含义
- 基于1970年1月1日(世界标准时间)起的毫秒数
- getTime()
- valueOf()
- 获取总毫秒数
// 实例化Date对象
var now = new Date();
// 1. 用于获取对象的原始值
console.log(date.valueOf());
console.log(date.getTime());
// 2. 简单写可以这么做
var now = +new Date();
// 3. HTML5中提供的方法,有兼容性问题
var now = Date.now();
倒计时
<script>
// 倒计时效果
// 1.核心算法:输入的时间减去现在的时间就是剩余的时间,即倒计时 ,但是不能拿着时分秒相减,比如 05 分减去25分,结果会是负数的。
// 2.用时间戳来做。用户输入时间总的毫秒数减去现在时间的总的毫秒数,得到的就是剩余时间的毫秒数。
// 3.把剩余时间总的毫秒数转换为天、时、分、秒 (时间戳转换为时分秒)
// 转换公式如下:
// d = parseInt(总秒数/ 60/60 /24); // 计算天数
// h = parseInt(总秒数/ 60/60 %24) // 计算小时
// m = parseInt(总秒数 /60 %60 ); // 计算分数
// s = parseInt(总秒数%60); // 计算当前秒数
function countDown(time) {
var nowTime = +new Date(); //返回的是当前时间总的毫秒数
var inputTime = +new Date(time); // 返回的是用户输入时间总的毫秒数
var times = (inputTime - nowTime) / 1000; // times是剩余时间总的秒数
var d = parseInt(times / 60 / 60 / 24); // 天
d = d < 10 ? '0' + d : d;
var h = parseInt(times / 60 / 60 % 24); //时
h = h < 10 ? '0' + h : h;
var m = parseInt(times / 60 % 60); // 分
m = m < 10 ? '0' + m : m;
var s = parseInt(times % 60); // 当前的秒
s = s < 10 ? '0' + s : s;
return d + '天' + h + '时' + m + '分' + s + '秒';
}
console.log(countDown('2019-10-1 18:00:00'));
var date = new Date();
console.log(date);
</script>