ECMA-262 对内置对象的定义是“任何由 ECMAScript 实现提供、与宿主环境无关,并在 ECMAScript
程序开始执行时就存在的对象”。
具体的内置对象参考这个 <———-👈
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
3. random() 方法
Math.random()
方法返回一个 0~1 范围内的随机数,其中包含 0 但不包含 1。对于希望显示随机名言或随机新闻的网页,这个方法是非常方便的。
function getRandomInt(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(包含)范围内选择一个值了。使用这个函数,从一个数组中随机选择一个元素就很容易
在这个例子中,传给 selecFrom()的第二个参数是数组长度减 1,即数组最大的索引值。let colors = ["red", "green", "blue", "yellow", "black", "purple", "brown"];
let color = colors[selectFrom(0, colors.length-1)];
注意 Math.random()
方法在这里出于演示目的是没有问题的。如果是为了加密而需要生成随机数(传给生成器的输入需要较高的不确定性),那么建议使用window.crypto. getRandomValues()
。
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>