(javascript)(基础知识+实例) 8.栈内存,math,时钟

72 阅读3分钟

值传递和引用传递

  • js的存储数据方式
    • 栈内存
      • 所有的变量名都是存储在栈里面,js在使用某个变量的时候只会在栈里面查找
      • 基础数据类型的值直接存在栈里面的
      • 复杂数据类型在栈里面存储的是一个地址
      • 在使用复杂数据类型的时候得到就是一个地址,会根据这个地址到堆里面找到这个数据
    • 堆内存
      • 复杂数据类型的值存在堆里面的
      • 在堆内存里面存储数据的时候就会开辟一块空间,得到一个空间地址,会将这个地址存储在栈里面
  • 值传递和引用传递
    • 当我们把一个变量的数据赋值给另一个变量的过程称为传递过程
    • 基础数据类型之间的传递是值传递,直接是把一个变量的值给了另一个变量,这样一个变量变化另一个不受影响
    • 复杂数据类型之间的传递是地址传递(引用传递),直接把一个变量的存储地址赋值给了另一个变量,两个变量地址指向的是同一块堆内存的数据,一个变化另一个也会变化
  • 值传递和引用传递影响
    1. 赋值
    2. 比较

arguments

  • 每一个函数内部都自带一个arguments
  • 可以记录函数在调用的时候传递的实参信息
  • 它是一个伪数组,真的数组里面是没有callee

Math

  • js里面内置的对象
  • 凡是设计到数学运算的

了解

  • 求最大值
    • Math.max(数,数,...)
  • 求最小值
    • Math.min(数,数,...)
  • 求绝对值
    • Math.abs(数)
  • 求n次方
    • Math.pow(底数,次方数)
  • 求平方根
    • Math.sqrt(数)

掌握 取整

  • 向上取整
    • 正数 舍去小数位 整数位+1
    • 负数 舍去小数位 整数位不变
    • Math.ceil(数)
  • 向下取整
    • 正数 舍去小数位 整数位不变
    • 负数 舍去小数位 整数位-1
    • Math.floor(数)
  • 四舍五入取整
    • 如果小数大于4采用向上 小于等于4采用向下
    • Math.round(数)

保留几位小数

  • 借助字符串的toFixed方法
  • 数字.toFixed(位数)

Date

  • 凡是和日期相关都会用到Date
  • 获取计算机本地年月日 时分秒 星期
  • Date是js内置的构造函数
  • 使用Date的流程
    1. 创建一个日期对象
      • var riqi = new Date()
    2. 利用创建出来的日期对象获取年月日 时分秒
      • riqi.getFullYear()
      • riqi.getMonth() 0代表1月份 1代表2月份... 拿到月份做加一的处理
      • riqi.getDate()
      • riqi.getHours()
      • riqi.getMinutes()
      • riqi.getSeconds()
      • riqi.getDay() 0-6 0代表星期天 1代表星期1...
    • 获取是当前电脑系统的时间
  • 国际标准的日期格式
    • YYYY-MM-DD hh:mm:ss
    • YYYY/MM/DD hh:mm:ss
  • 时钟
    • 间隔一秒钟获取最新的系统时间 写到页面
  • 定时器
    • 可以实现间隔一段时间执行一次代码
    • 可以实现延迟一段时间执行一次代码
    • 间隔定时器
          // fn代表一个函数
          // ms代表毫秒数 1s = 1000ms
          setInterval(fn, ms)
      
    • 延迟定时器
          setTimeout(fn, ms)
      
  • 倒计时
    • '2023-01-22 00:00:00'
  • 时间戳
    • 含义: 一个时间距离计算机初始化时间(1970-01-01 00:00:00)的毫秒数
    • 获取时间戳
      • 先要把这个字符串转换成一个日期对象
      • 调用getTime()

实例

(以下代码均为课程实例)

(1)值传递和引用传递

    <script>
        var num1 = 1
        var num2 = num1 // 将num1的值赋值给num2
        num1++
        // 一个变化另一个不会变化的
        console.log(num1)
        console.log(num2)

        var arr1 = [1,2,3,4]
        var arr2 = arr1
        arr1.push(5)
        console.log(arr1)
        console.log(arr2)
    </script>

(2)数组排序

    <script>
        var arr1 = [2,23,1,2,34,5]
        arr1.sort(function(a, b){
            return a-b
        })
        // 将arr1赋值给了arr2
        var arr2 = arr1 // 此处赋值是一个引用的传递
        // 改变arr2 因为arr2和arr1地址指向的是同一块空间的数据
        arr2.sort(function(a, b){
            return b-a
        })
        // 
        console.log(arr2)
        console.log(arr1)
        // 深克隆和浅克隆
    </script>

(3)比较数据

    <script>
        var num1 = 1
        var num2 = 1
        // 此处比较是两个值进行比较
        console.log(num1 === num2)
        console.log(num1 == num2)
        var arr1 = [1,2,3,4] 
        var arr2 = [1,2,3,4]
        // 此处比较是两个地址进行比较
        console.log(arr1 === arr2) 
        console.log(arr1 == arr2) 
    </script>

(4)math函数的运用

    <script>
        console.log(Math)
        console.log(Math.PI)
        console.log(Math['PI'])
        var num = Math.random()
        // 求最大值
        var maxNum = Math.max(10,12,33,4,7,8)
        console.log(maxNum)
        var maxNum01 = Math.max([10,12,33,4,7,8])
        console.log(maxNum01)
        // 求最小值
        var minNum = Math.min(10,12,33,4,7,8)
        console.log(minNum)
        // 求绝对值
        var num1 = Math.abs(10)
        console.log(num1)
        var num2 = Math.abs(-10)
        console.log(num2)
        // 求平方
        console.log(Math.pow(3,2)) // 3的平方
        console.log(Math.pow(3,3)) // 3的立方
        console.log(Math.pow(3,8)) // 3的8次方
        // 求平方根
        console.log(Math.sqrt(4))
    </script>

(5)利用date获取年月日时分秒

    <script>
        // 创建一个日期对象
        var riqi = new Date()
        console.log(riqi)
        // 获取年
        var year = riqi.getFullYear()
        console.log(year)
        
        // 获取月
        var month = riqi.getMonth()
      
        console.log(month + 1)
        // 获取日
        var date = riqi.getDate()
        console.log(date)
        // 获取时
        var hour = riqi.getHours()
        console.log(hour)
        // 获取分
        var minute = riqi.getMinutes()
        console.log(minute)
        // 获取秒
        var second = riqi.getSeconds()
        console.log(second)
        // 获取星期
        var week = riqi.getDay()
        console.log(week)
    </script>

(6)日期格式化

    <script>
      // 创建一个日期对象
      var riqi = new Date();
      // 获取年
      var year = riqi.getFullYear();
      // 针对于月日时分秒如果是个位的话 要在数字前面补0
      // 获取月
      var month = riqi.getMonth() + 1;
      month = month<10 ? '0' + month : month 
      // 获取日
      var date = riqi.getDate();
      date = date<10 ? '0' + date : date 
      // 获取时
      var hour = riqi.getHours();
      hour = hour<10 ? '0' + hour : hour 
      // 获取分
      var minute = riqi.getMinutes();
      minute = minute<10 ? '0' + minute : minute 
      // 获取秒
      var second = riqi.getSeconds();
      second = second<10 ? '0' + second : second 
      var str = year + '-' + month + '-' + date + '  ' + hour + ':' + minute + ':' + second
      document.write(str)
    </script>

(7)间隔定时器

    <script>
        console.log('哈哈哈')
        function time(){
            // 只有此处的代码会间隔调用的
            console.log('time函数被调用了')
        }
        console.log('嘻嘻嘻')
        // time这个函数是setInterval这个函数来调用的
        // 1s会调用time函数一次
        setInterval(time, 1000)
        console.log('呵呵呵')
    </script>

(8)延迟定时器

    <script>
        setTimeout(function(){
            console.log('函数调用了')
        }, 1000)
    </script>

(9)时钟

    <script>
      function showTime() {
        // 创建一个日期对象
        var riqi = new Date();
        // 获取年
        var year = riqi.getFullYear();
        // 针对于月日时分秒如果是个位的话 要在数字前面补0
        // 获取月
        var month = riqi.getMonth() + 1;
        month = month < 10 ? "0" + month : month;
        // 获取日
        var date = riqi.getDate();
        date = date < 10 ? "0" + date : date;
        // 获取时
        var hour = riqi.getHours();
        hour = hour < 10 ? "0" + hour : hour;
        // 获取分
        var minute = riqi.getMinutes();
        minute = minute < 10 ? "0" + minute : minute;
        // 获取秒
        var second = riqi.getSeconds();
        second = second < 10 ? "0" + second : second;
        var str =
          year +
          "/" +
          month +
          "/" +
          date +
          "  " +
          hour +
          ":" +
          minute +
          ":" +
          second;
        // 在每一次写新时间之前清除上一次的内容
        document.body.innerHTML = "";
        // 把时间写到页面
        document.write(str);
      }
      // 页面进入的时候就需要写一次
      showTime()
      setInterval(function () {
        // 每间隔一秒钟写一次
        showTime()
      }, 1000);
    </script>

(10)倒计时

  <script>
    // 创建一个日期对象
    var riqi = new Date();
    // 获取年
    var year = riqi.getFullYear();
    // 针对于月日时分秒如果是个位的话 要在数字前面补0
    // 获取月
    var month = riqi.getMonth() + 1;
    month = month < 10 ? "0" + month : month;
    // 获取日
    var date = riqi.getDate();
    date = date < 10 ? "0" + date : date;
    // 获取时
    var hour = riqi.getHours();
    hour = hour < 10 ? "0" + hour : hour;
    // 获取分
    var minute = riqi.getMinutes();
    minute = minute < 10 ? "0" + minute : minute;
    // 获取秒
    var second = riqi.getSeconds();
    second = second < 10 ? "0" + second : second;
    var str =
      year +
      "/" +
      month +
      "/" +
      date +
      " " +
      hour +
      ":" +
      minute +
      ":" +
      second;
    // 过年时间
    var str2 = "2023-01-22 00:00:00";
    console.log(str2, str)
    // 过年的时间 - 当前的时间
    console.log(str2 - str);
    var riqi = new Date(str) // 将字符串转换成日期对象
    console.log(riqi.getTime()) // 获取时间戳
    var riqi2 = new Date(str2) // 将字符串转换成日期对象
    console.log(riqi2.getTime()) // 获取时间戳
    // console.log(riqi2.getTime() - riqi.getTime())
    var times = (riqi2.getTime() - riqi.getTime()) / 1000
    // document.write(times)
    var d = parseInt(times / 60 / 60 / 24);
    d = d < 10 ? '0' + d : d;         // 利用三元表达式统一格式,当数字小于10 时在前一位补0
    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;
    var times1 = d + '天' + h + '时' + m + '分' + s + '秒'
    document.write(times1)





    function countdown() {
      // 创建一个日期对象
      var riqi = new Date();
      // 获取年
      var year = riqi.getFullYear();
      // 针对于月日时分秒如果是个位的话 要在数字前面补0
      // 获取月
      var month = riqi.getMonth() + 1;
      month = month < 10 ? "0" + month : month;
      // 获取日
      var date = riqi.getDate();
      date = date < 10 ? "0" + date : date;
      // 获取时
      var hour = riqi.getHours();
      hour = hour < 10 ? "0" + hour : hour;
      // 获取分
      var minute = riqi.getMinutes();
      minute = minute < 10 ? "0" + minute : minute;
      // 获取秒
      var second = riqi.getSeconds();
      second = second < 10 ? "0" + second : second;
      var str =
        year +
        "/" +
        month +
        "/" +
        date +
        " " +
        hour +
        ":" +
        minute +
        ":" +
        second;
      // 过年时间
      var str2 = "2023-01-22 00:00:00";
      console.log(str2, str)
      // 过年的时间 - 当前的时间
      console.log(str2 - str);
      var riqi = new Date(str) // 将字符串转换成日期对象
      console.log(riqi.getTime()) // 获取时间戳
      var riqi2 = new Date(str2) // 将字符串转换成日期对象
      console.log(riqi2.getTime()) // 获取时间戳
      // console.log(riqi2.getTime() - riqi.getTime())
      var times = (riqi2.getTime() - riqi.getTime()) / 1000
      // document.write(times)
      var d = parseInt(times / 60 / 60 / 24);
      d = d < 10 ? '0' + d : d;         // 利用三元表达式统一格式,当数字小于10 时在前一位补0
      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;
      var times1 = d + '天' + h + '时' + m + '分' + s + '秒'
      document.body.innerHTML = "";//在每一次写新时间之前清空页面
      document.write(times1)
    }
    setInterval(function () {
      // 每间隔一秒钟写一次
      countdown()
    }, 1000);




      // 一个月按30天
  </script>

(11)封装函数最大值

    <script>
        // 封装一个返回最大值和最小值的函数
        function max(){
            console.log(arguments)
            // 找到arguments伪数组里面最大的
            for(i=0;i<arguments.length;i++){
                if(arguments[i]>arguments[i+1]){
                    // 交换位置
                    var temp = null
                    temp = arguments[i]
                    arguments[i] = arguments[i+1]
                    arguments[i+1] = temp
                }
            }

            return arguments[arguments.length-1]
        } 
        console.log(max(10,12,33,4,7,8))
        var num01 = max(10,12,33,4,7,8,100, 33,66)
        console.log(num01)
    </script>