Math对象、Date对象

63 阅读4分钟

Math对象

  • 专门提供了数学计算的API
  • 强调:不需要创建,直接使用
  • 属性:Math有一些属性,涉及到科学计数法,但是几乎用不到,只有Math.PI有可能用到 === 3.1415926...这一串数字我们不需要自己创建,浏览器自带

API

取整:3种

  • 上取整:超过一点点,就取下一个整数

    • var num=Math.ceil(num);//小数位数不能超过15位,否则此方法只能取整,不能上取整
  • 下取整:无论超过多少,都会省略小数部分

    • var num=Math.floor(num);
  • 四舍五入取整:

    • var num=Math.round(num);//只看小数位数的第一位
  • 以上三个方法都是垃圾:都是在取整,只能取整

  • 取整的方式:以上三个+parseInt(str去掉单位)+num.toFixed(d);

  • num.toFixed(d);

    • 优点:

      • 可以四舍五入,并且保留指定小数位数,d其实就是保留的小数位数
      • 解决浏览器带来的舍入误差,2-1.6=0.39999999这种情况就可以使用toFixed来解决
    • 缺点:结果是一个字符串,建议搭配上parseFloat()使用

    • 不允许使用toFixed的情况下,自己封装一个函数,由用户传入数字和保留位数,实现四舍五入操作:

      function toFixed(num,d){
              num*=(10**d);
              num=Math.round(num);
              num/=(10**d);
              return num;
      }
      var result=toFixed(Math.PI,2);
      console.log(result);
      

乘方和开方

  • 乘方:Math.pow(底数,幂); -> 更简化:底数**幂
  • 开方:Math.sqrt(num); - 仅仅只能开平方

最大值和最小值

  • var max/min=Math.max/min(a,b,c,d,e,f,g,...);//自动在你传入的数字中比较出最大值或最小值
  • 问题:本身不支持数组参数
  • 解决:固定用法:Math.max/min.apply(Math,arr);//apply具有打散数组的功能

绝对值

  • 把负数转为正数
  • Math.abs(-1);//1

随机数

  • Math.random(); 在0-1之间取一个随机的小数
    • 搭配上parseInt,只能取到0,但是不可能取到1,意味着取不到最大值
    • 公式:parseInt(Math.random()*(max-min+1)+min)
    • 强调:只要以后网页中某一块有随机的功能,他的底层一定用到了随机数

Date对象

  • 日期对象,提供了操作日期和时间的API

创建:4种

  • 创建一个当前日期var now=new Date();
  • 创建一个自定义时间var birth=new Date("yyyy/MM/dd hh:mm:ss");
  • 创建一个自定义时间:var birth=new Date(yyyy,MM,dd,hh,mm,ss);//修改月份,从0~11,0代表1月
  • 复制一个日期
    • 为什么:日期的所有API都是直接修改原日期的,无法获得修改之前的日期
    • 所以,在执行API之前先进行复制,然后再操作复制后的日期:var end=new Date(start);
  • 创建日期的最后一种方式,绝对没人用:var date=new Date(毫秒数);//计算机元年:1970年1月1日 8点整

使用:2类

倒计时的关键

  • 两个日期对象之间,可以相减(大-小),得到一个毫秒差,换算出自己想要的任何一部分 - 日期的本质其实就是保存了一个毫秒数

API:

  • 分量:时间的单位
    • 年月日星期:FullYear Month Date Day
    • 时分秒毫秒:Hours Minutes Seconds Milliseconds
    • 每一个分量都有一对儿getXXX/setXXX的方法
  • 特殊:
    • 取值范围:
      • FullYear - 当前年份的数字
      • Month - 0~11
      • Date - 1~31
      • Day - 0~6:0代表是星期天,外国人的眼里星期天才是一周的第一天
      • Hours - 0~23
      • MinutesSeconds:0~59
      • 设置超出范围,他很聪明,会自动进制
    • Day,没有set方法
    • 如果希望对某个分量进行加减操作date.setXXX(date.getXXX()+/-n)
    • 格式化日期为本地字符串:date.toLocaleString(); - 垃圾:具有兼容性问题,我们一般会选择自己创建一个格式化方法来格式日期
      • 用了此方法会失去一些东西:日期的自动进制、日期的API
      • 也会获得一些东西:字符串的API

定时器

周期性定时器

  • 每过一段时间就会执行一次,先等后做
    • 开启:timer=setInterval(callback,间隔毫秒数);
    • 停止:clearInterval(timer);

一次性定时器

  • 等待一段时间,只会做一次就结束了
    • 开启:timer=setTimeout(callback,间隔毫秒数);
    • 停止:clearTimeout(timer);

同步、异步

  • 同步技术:代码必须一行一行的执行,前面没做完,后面就等着
  • 定时器是我们第一次见到的异步技术:无论我这一块代码多么的耗时,也不会卡住后续代码