JavaScript-day09

19 阅读3分钟

一、Math对象

不需要创建,直接使用

1.1 PI

var pi = Math.PI

1.2 取整

  • 向上取整:
var num = Math.ceil(num)//小数超过15位之后只能取整,不能向上取整
  • 向下取整:
var num = Math.floor(num)
  • 四舍五入:
var num = Math.round(num)//只看小数位数的第一位
  • num.toFixed(d):
    1. d代表保留的小数位数,可以四舍五入
    2. 解决浏览器带来的舍入误差,2-1.6=0.3999999999999这种情况就可以使用toFixed来解决
    3. 结果是一个字符串
  • 自己封装一个函数来实现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);

1.3 乘方和开方

  • 乘方:
Math.pow(底数,幂);  相当于  底数**幂
  • 开方:
Math.sqrt(num); - 仅仅只能开平方

1.4 最大值和最小值

var max/min=Math.max/min(a,b,c,d,e,f,g,...);
对于数组求最值得方法:
Math.max/min.apply(Math,arr);//apply具有打散数组的功能
<script>
    // 求最大值和最小值
    var arr=[31,25,43,76,98,6234,2,4645,686,43421,5,6548,65]
    // var arr = [5,45,56,8,9,5,5,6,2,526]
    console.log(Math.max(1,2,3,45,5,6,8,9,6))
    console.log(Math.min(1,2,3,45,5,6,8,9,6))
    console.log(Math.max.apply(Math,arr))
    console.log(Math.max.apply(Math,arr))
</script>

1.5 绝对值

Math.abs(-1);//1

1.6 随机数

  • Math.random(); 在0-1之间去一个随机的小数
  • 搭配上parseInt,只能取到0,但是不可能取到1,意味着取不到最大值
  • 随机数公式:parseInt(Math.random()*(max-min+1)+min)

二、Date对象

日期对象,提供了操作日期和时间的API。日期的所有API都是直接修改原日期的,无法获得修改之前的日期。

2.1 创建

  • 创建一个当前日期: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月
  • 创建一个自定义时间:var date=new Date(毫秒数);//计算机元年:1970年1月1日 8点整
  • 复制一个日期:日期的所有API都是直接修改原日期的,无法获得修改之前的日期,所以,在执行API之前先进行复制,然后再操作复制后的日期
var end=new Date(start);

2.2 使用

两个日期之间相减得到的是毫秒差

2.3 Date的API

  • get/setFullYear - 获取/设置当前年份的数字
  • get/setMonth - 获取/设置当前月份(0-11)
  • get/setDate - 获取/设置当前日期(1-31)
  • getDay - 获取当前星期(0-6,0代表是星期天)(此方法没有set功能)
  • get/setHours - 获取/设置当前时(0-23)
  • get/setMinutes - 获取/设置当前分钟(0-59)
  • get/setSeconds - 获取/设置当前秒(0-59)
  • get/setMilliseconds - 获取/设置当前毫秒
  • 格式化日期为本地字符串:date.toLocaleString();
    1. 具有兼容性问题
    2. 用了此方法会失去一些东西:日期的自动进制、日期的API

三、定时器

3.1 周期性定时器:

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

3.2 一次性定时器:

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

四、同步和异步

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

五、案例

<body id = "bd">
    <button>点击购买双色球</button>
    <script>
        // 红球1-33 篮球1-16
        var btn = document.getElementsByTagName('button')[0]
        btn.onclick = function() {
            var user = prompt("请输入要购买的注数:")
            for (var i = 0; i < user; i++) {
                // 篮球
                var blue = parseInt(Math.random()*(16)+1)
                // 红球
                var red = []
                while(red.length < 6) {
                    var r = parseInt(Math.random()*(33)+1)
                    if(red.indexOf(r) == -1) {
                        red.push(r)
                    } 
                }
                red.sort((a,b)=>a-b)
                var section = document.createElement('section')
                // 红
                red.forEach(val=>{
                    var div = document.createElement('div')
                    div.innerHTML = val
                    div.className = 'red'
                    section.appendChild(div)
                })
                // 蓝
                var div = document.createElement('div')
                div.innerHTML = blue
                div.className = 'blue'
                section.appendChild(div)

                bd.appendChild(section)
            }
        }
    </script>
</body>
</html>
<script>
    // 让员工自己输入自己的入职时间,计算出3年后员工的合同到期时间,前一个月人力会对员工进行续签,计算出续签时间,如果续签是周末,提前到周五,而续签前一个星期,会对员工进行提醒,计算出提醒时间
    // 入职时间·
    var user = prompt("请输入入职时间,格式为:yyyy/mm/dd hh:mm:ss");
    // 复制一份入职时间
    var entry = new Date(user);
    console.log("入职时间为:"+getTime(entry));
    // 获取年并且设置三年后合同到期的日期
    entry.setFullYear(entry.getFullYear() + 3);
    console.log("合同到期时间为:"+getTime(entry));
    // 复制一份合同到期时间
    var due = new Date(entry)
    // 获取并且设置合同到期前一个月  续签
    due.setMonth(due.getMonth() - 1)
    // 复制一份提前一个月续签时间
    var ren = new Date(due)
    // 判断是否为周末
    if(ren.getDay() == 6) {
        ren.setDate(ren.getDate() - 1)
    } else if (ren.getDay() == 0) {
        ren.setDate(ren.getDate() - 2)
    }
    // 续签时间
    console.log("续签时间为:"+getTime(ren));
    // 提醒时间
    var tx = new Date(ren)
    tx.setDate(tx.getDate() - 7)
    console.log("提醒时间为:"+getTime(tx));

    // 格式化日期
    function getTime(time) {
        var year = time.getFullYear()
        var month = time.getMonth() + 1
        var date = time.getDate()
        var h = time.getHours()
        var m = time.getMinutes()
        var s = time.getSeconds()
        month = month<10?"0"+month:month
        date = date<10?"0"+date:date
        h = h<10?"0"+h:h
        m = m<10?"0"+m:m
        s = s<10?"0"+s:s
        // 星期
        var day = time.getDay()//0-6
        var arr = ["天","一","二","三","四","五","六"]
        return year+"年"+month+"月"+date+"日 "+"星期"+arr[day]+" "+h+"时"+m+"分"+s+"秒"
    }
</script>
<div id="box"></div>
<script>
    // 倒计时 计算距离端午节还有多久 2023-06-22
    getTime()
    timer = setInterval(function(){
        getTime()
    },1000)
    function getTime() {
        // 端午的时间
        var time = new Date("2023/06/22 00:00:00")
        // 现在的时间
        var now = new Date()
        // 差
        var dif = time - now
        var day = parseInt(dif/1000/60/60/24)
        var hours = parseInt(dif/1000/60/60%24)
        // var hours = parseInt((dif - (day*24*60*60*1000))/1000/60/60)
        var min = parseInt(dif/1000/60%60)
        // var min = parseInt((dif - (hours*60*60*1000))/1000/60)
        var s = parseInt(dif/1000%60)
        hours = hours<10?"0"+hours:hourse
        min = min<10?"0"+min:min
        s = s<10?"0"+s:s
        box.innerHTML = box.innerHTML.indexOf(":") == -1?"距离端午节还有:"+day+"天"+hours+":"+min+":"+s:"距离端午节还有:"+day+"天"+hours+" "+min+" "+s
    }
</script>