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()方法用于确定一组数值中的最小值和最大值。这两个方法都接收任意多个参数。

  1. let max = Math.max(3, 54, 32, 16);
  2. console.log(max); // 54
  3. let min = Math.min(3, 54, 32, 16);
  4. console.log(min); // 3
  • 54、32 和 16 中,Math.max()返回 54,Math.min()返回 3。
  • 使用这两个方法可以避免使用额外的循环和 if 语句来确定一组数值的最大最小值。

当输入数组来确数组内的最大值时

  1. let values = [1, 2, 3, 4, 5, 6, 7, 8];
  2. let max = Math.max(...val);
  • 要想max()认识数组,需要在数组名前面加...三个英文句号,用来表示内部元素为数组元素

2. 舍入方法

舍去浮点型小数部分有四种方法:

  1. - `Math.ceil()` 方法始终向上舍入为最接近的整数(1.9=21.2=2
  2. - `Math.floor()` 方法始终向下舍入为最接近的整数。(1.9=11.2=1
  3. - `Math.round()` 方法执行四舍五入
  4. - `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(包含)范围内选择一个值了。使用这个函数,从一个数组中随机选择一个元素就很容易
    let colors = ["red", "green", "blue", "yellow", "black", "purple", "brown"]; 
    let color = colors[selectFrom(0, colors.length-1)];
    
    在这个例子中,传给 selecFrom()的第二个参数是数组长度减 1,即数组最大的索引值。

注意
Math.random()方法在这里出于演示目的是没有问题的。如果是为了加密而需要生成随机数(传给生成器的输入需要较高的不确定性),那么建议使用window.crypto. getRandomValues()

8.2 日期对象

Date 对象和 Math 对象不一样,Date是一个构造函数,所以使用时需要实例化后才能使用其中具体方法和属性。Date 实例用来处理日期和时间

使用Date实例化日期对象

  • 获取当前时间必须实例化:

    var now = new Date();
    
  • 获取指定时间的日期对象

    var future = new Date('2021/5/7');
    

    注意:如果创建实例时并未传入参数,则得到的日期对象是当前时间对应的日期对象

图片4.png

  • 通过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>