9.7-day04-js基础

84 阅读3分钟

1. 函数的写法

//1.什么是函数?
      // 把特点的代码片段,抽取成为独立运行的实体

      //2.函数等于现实生活中'工具'
      // 联想: 锤子,手机,电脑,车子...
      //  冰箱,洗衣机,热水器
      // 洗衣机:作用 提高洗衣服的效率
      //     1.使用简单,方便
      //     2.无须了解原理
      //     3.不受时间的限制

      //3.使用函数的好处?
      // 1).重复使用,提供效率
      // 2).提高代码的可读性
      // 3).有利用程序的维护


      //4.函数的分类
      //  1.内置函数(系统函数) 已经提供的
      // alert();
      // var res = prompt("请输入一个数")
      // confirm("您却定要删除吗?");
      // print()
      // document.write()
      // console.log()
      // isNaN();
      // parseInt()
      // parseFloat()
      // Number();
      // Boolean()
      // toString()
      // toFixed(2)
      // ...
      // 1.作用,2,参数,返回值

      //
      //  自定义方式
      //定义语法
      // function 函数名称(形参1, 形参2, ...) {
      //   //逻辑代码
      //   // return 结果
      // }
      // //函数的调用
      //  函数名称(实参)


      // //计算2个数相加
      // function calc(num1, num2) {

      //   var res = num1 + num2;

      //   return res;

      // }
      // //使用
      // var result = calc(100, 200);

      // console.log(result);


      //函数的定义有三种写法
      //写法1  普通写法,调用的是,可以再定义函数的前面,后面使用

      console.log(show("刘德华"));
      function show(name) {
        return "姓名为:" + name;
      }
      console.log(show("吴某凡"));

      //写法2  匿名函数
      show(); //不可以,必须在定义函数的后面调用
      var show = function () {
        console.log("我是匿名函数");
      }
      show();


      //写法3 构造函数创建函数
      // new Function的最后一个参数,是函数的代码体
      var calc = new Function("a", "b", "c", "return a+b+c");
      var res = calc(10, 20, 30);
      console.log(res);

练习:

// function calc(num1, num2) {
      //   console.log(num1);
      //   console.log(num2);
      //   return 11
      // }
      // console.log(num1);

      // var res = calc(10);
      // console.log(res);

      // 1, 写一个函数计算1到n的和, 
      //并返回结果打印出来;(n为函数参数)
      function fn1(n) {
        var sum = 0;
        for (var i = 1; i <= n; i++) {
          sum += i;
        }
        return sum;
      }

      console.log(fn1(5));

      // 2, 写一个函数计算n的阶乘,并返回结果打印出来
      function fn2(n) {
        var sum = 1;
        for (var i = 1; i <= n; i++) {
          sum *= i;
        }
        return sum
      }
      console.log(fn2(5));
      console.log(fn2(10));
      // 3, 写一个函数计算两个数的最小公倍数; 
      //并返回结果打印出来
      //写法1
      function fn3(n, m) {
        var res = 0;
        var max = n > m ? n : m;
        for (var i = max; i <= n * m; i++) {
          if (i % n == 0 && i % m == 0) {
            res = i;
            break;
          }
        }
        return res;
      }
      console.log(fn3(6, 9));

      //写法2
      function fn4(n, m) {
        var max = n > m ? n : m;
        for (var i = max; i <= n * m; i++) {
          if (i % n == 0 && i % m == 0) {
            return i;
          }
        }
      }

      console.log(fn4(6, 9));

练习2:

//  1, 写一个函数判断一个年份是不是闰年
      function isRun(year) {
        var exp1 = year % 4 == 0 && year % 100 != 0;
        var exp2 = year % 400 == 0;
        return exp1 || exp2;
      }
      //  2, 写一个函数判断一个数是不是素数 (又称质数,除了1和本身以外不再有其他数整除)
      function isSu(num) {
        var res = true;//默认是 素数,就不是合数
        for (var i = 2; i < num; i++) {
          if (num % i == 0) {
            res = false;
            break;
          }
        }
        return res;
      }
      // console.log(isSu(7));
      // console.log(isSu(13));
      //  3, 年月日分别为自定义函数的参数,判断某一个日期是否为合法的日期;
      // 如: 2016年12月33日不是合法的日期
      //       2016年11月13日是合法的日期

      function checkDate(yyyy, mm, dd) {
        var maxDay = 0;
        if (isNaN(yyyy)) {
          return false;//不是一个有效的年份
        }
        if (isNaN(mm)) {
          return false;//不是数值的月份
        }
        if (isNaN(dd)) {
          return false; //不是有效的日
        }
        if (!(mm >= 1 && mm <= 12)) {
          return false; //输入月份不行是1~12
        }
        if (!(dd >= 1 && dd <= 31)) {
          return false;
        }
        switch (Number(mm)) {
          case 1:
          case 3:
          case 5:
          case 7:
          case 8:
          case 10:
          case 12:
            maxDay = 31;
            break;
          case 4:
          case 6:
          case 9:
          case 11:
            maxDay = 30;
            break;
          default:
            maxDay = isRun(yyyy) ? 28 : 29;
            break;
        }
        return dd <= maxDay
      }

      console.log(checkDate(2020, 12, 32));

2. arguments

//arguments  参数
      //1.它是一个伪数组,有下标,不具备数据的方法
      //2.它只能在函数内部出现
      //作用:动态接受实参
      function calc() {
        var sum = 0
        for (var i = 0; i < arguments.length; i++) {
          // console.log(arguments[i]); // 通过索引取得对应位置的值,(下标取值)
          sum += arguments[i];
        }
        return sum;
      }
      console.log(calc(10, 20, 10));

3. 作用域和作用域链

//1.什么时候函数的作用域和作用域链?
      // 作用域:作用的范围
      //      1).函数内部的是局部的
      //      2).函数外部的是全局
      // 作用域链?
      //     当函数内部访问某一个变量时候,首先去函数内部查找,如果内部
      //     没有,就想外出函数查找,如果外层函数,没有就向(浏览器像window)全局
      //      在nodejs是像(global)上查找,这个"查找的过程"就叫做"作用域链"



      //作用域
      // var a = 100;//全局作用域
      // function fn1() {
      //   var b = 200;//局部变量
      //   console.log(a);
      //   console.log(b);
      // }

      // function fn2() {
      //   console.log(a);
      //   console.log(b);
      // }

      // fn1();
      // fn2();

      // console.log(b);

      //-----------------------------

      function fn() {
        //在函数内部,使用var关键字,声明的变量是局部变量   a
        //在函数内部,没有使用var关键字的,是全局变量      b
        var a = b = 100;
      }

      fn();
      // console.log(a); // a is not defined
      console.log(b); // 100

小练习:

var a = 10;
      function fn1(a) {
        // var a;
        a = 20;
      }

      fn1();

      console.log(a);// 20

4. 简单dom操作

<input id="num1" value="">
    <select name="" id="opt">
        <option value="+">+</option>
        <option value="-">-</option>
        <option value="*">*</option>
        <option value="/">/</option>
        <option value="%">%</option>
    </select>
    <input id="num2">
    <button id="btn">=</button>
    <input id="num3">
        var oNum1=document.getElementById("num1");
        var oNum2=document.getElementById("num2");
        var oNum3=document.getElementById("num3");
        var oOpt=document.getElementById("opt");
        var oBtn=document.getElementById("btn");

        // 1.给按钮绑定点击事件
        // 事件驱动编程
        // 通过时间驱动函数的执行
        // 通过事件执行函数
        oBtn.onclick=function(){
            var n1=Number(oNum1.value);
            console.log(n1);
            var n2=Number(oNum2.value);
            var str=oOpt.value;
            var res=calc(n1,n2,str);
            oNum3.value=res;
            console.log(res);
        }
        function calc(num1,num2,opt){
            var result=0;
            if(opt=="+"){
                result=num1+num2;
            }else if(opt=="-"){
                result=num1-num2;
            }else if(opt=="*"){
                result=num1*num2;
            }else if(opt=="/"){
                result=num1/num2;
            }else{
                result=num1%num2
            }
            return result;
        }

效果:

image.png 练习:

// 1, 一个新入职,月工资为2000元的员工,每年涨当年工资5%,20年后的月工资是多少?
      var salary = 2000;
      for (var i = 0; i < 20; i++) {
        salary = salary * (1 + 0.05)
      }
      console.log(salary.toFixed(1));

      // 2, 山上有一口缸可以装50升水,现在有15升水。
      // 老和尚叫小和尚下山挑水,每次可以挑5升。
      // 问:小和尚要挑几次水才可以把水缸挑满?
      //通过编程解决这个问题。
      var count = 0;
      for (var i = 0; i < (50 - 15); i += 5) {
        count++;
      }
      console.log(count);


      // 3, 打印100–200之间所有能被3或者7整除的数
      for (var i = 100; i <= 200; i++) {
        if (i % 3 == 0 || i % 7 == 0) {
          console.log(i);
        }
      }

      // 4, 计算10的阶乘   
      //(1*2*3*4*5*6*7*8*9*10   n的阶乘1*2……*n)
      var n = 10;
      var sum = 1;
      for (var i = 1; i <= n; i++) {
        sum *= i;
      }
      console.log(sum);

      // 5, 计算1+3+5+...+99的和
      var sum = 0;
      for (var i = 1; i <= 99; i += 2) {
        // console.log(i);
        sum += i;
      }
      console.log(sum);
      // 6, 99乘法表
      for (var i = 1; i <= 9; i++) {
        for (var j = 1; j <= i; j++) {
          document.write(j + "x" + i + "=" + j * i + " ")
        }
        document.write("<br>");
      }

      // 7, 输出20~80之间能被3整除的整数, 每行5个
      document.write("<br>");

      var n = 0;
      for (var i = 20; i <= 80; i++) {
        if (i % 3 == 0) {
          //输出一次,累计一次
          document.write(i + ", ");
          n++;
          if (n % 5 == 0) {
            document.write("<br>")
          }
        }
      }



      // 8, 打印1000~2000年中所有的闰年, 每行4个
      document.write("<br>")
      var n = 0;
      for (var i = 1000; i <= 2000; i++) {
        var exp1 = i % 4 == 0 && i % 100 != 0;
        var exp2 = i % 400 == 0;
        if (exp1 || exp2) {
          document.write(i + ", ");
          n++;
          if (n % 4 == 0) {
            document.write("<br>")
          }
        }
      }

      // 9, 求: 1-1/2+1/3-1/4 …  1/100的和

      var n = -1;
      var sum = 0;
      for (var i = 1; i <= 100; i++) {
        // 1/i
        // console.log(n *= -1);
        n *= -1
        1 / i * n;
        sum += 1 / i * n;
      }
      console.log(sum);
      //      9,  输入两个数,求两个数的最小公倍数(****)
      //         如: 9和6的最小公倍数是18, 
      //          1, 先找出两个数中的最大数   // 9 -> 6*9
      //          2, 最大数++,找出能被两个数整除的数(退出循环)
      var a = 9, b = 6;
      var max = a > b ? a : b;
      for (var i = max; i <= a * b; i++) {
        if (i % a == 0 && i % b == 0) {
          console.log(i);
          break;
        }
      }



      //  10,  输入两个数n,a,如果n==3, a == 2;
      //        输出 2 + 22 + 222 的值。
      //      (不用输出式子)(****)
      //       如: n == 4, a == 3;
      //       输出 3 + 33 + 333 + 3333的值。
      //       提示: 1、n = 3,相加三次,每次相加比前一次相加的数,多一位
      //                2、每次多的这个位数的值为a, 
      //       3, 3*10+3(33), 33*10+3(333),...
      var n = 4, a = 3;
      var num = 0;
      var sum = 0;
      for (var i = 0; i < n; i++) {
        // 2,22,222
        num = num * 10 + a;
        // console.log(num);
        sum += num;
      }
      console.log(sum); //3702
      //  11, 五位数中,对称的数称为回文数,找出所有的回文数。
      //       如: 12321     34043

      for (var i = 10000; i <= 99999; i++) {
        var a = i % 10; //个位
        var b = parseInt(i / 10) % 10;//十位
        var d = parseInt(i / 1000) % 10//千位
        var e = parseInt(i / 10000)//万位
        if (a == e && b == d) {
          console.log(i);
        }
      }



      //       13, 求1!+2!+3!+4!+5! 
      var res = 0;
      for (var i = 5; i > 0; i--) {
        var sum = 1;
        for (var j = 1; j <= i; j++) {
          sum *= j;
        }
        res += sum;
      }
      console.log(res); //153

      //  14, 找出所有的水仙花数,三位数,各位立方和等于该数本身。
      //         如: 153 = 1 ^ 3 + 5 ^ 3 + 3 ^ 3 
      for (var i = 100; i <= 999; i++) {
        var a = i % 10;
        var b = parseInt(i / 10) % 10;
        var c = parseInt(i / 100) % 10;
        if (a ** 3 + b ** 3 + c ** 3 == i) {
          console.log(i);
        }
      }
      //  15, 输入任意两个数,如果第一个数小,
      //从第一个数打印到第二个数,如果第二个数小,
      //从第二个数打印到第一个数
      var a = 6;
      var b = 9;
      var min = a < b ? a : b;
      var max = a > b ? a : b;
      for (var i = min; i <= max; i++) {
        console.log(i);
      }


      //  16,  输入两个数,求两个数的最大公约数(*****)
      //         如: 12和8的最大公约数是4,
      //         提示: 能够同时整除两个数的最大数          
      //          1, 先找出两个数中最小的那个数, 
      //          2, 最小数--, 找出能被两个数整除的数
      //        (退出循环break)
      console.log("---------------");
      var a = 12;
      var b = 8;
      var min = a < b ? a : b;
      for (var i = min; i > 0; i--) {
        if (a % i == 0 && b % i == 0) {
          console.log(i);
          break;
        }
      }
      console.log("---------------");

      // 1 2 4 8 16 32 64 128...

      // var n = 1;
      // var sum = 0;
      // for (var i = 0; i < 63; i++) {
      //   n *= 2;
      //   // console.log(n);
      //   sum += n;
      // }
      // console.log(sum + 1);

      //bigInt 大整型
      // 大整型只能和大整型进行运算
      // var n = 100n;
      // console.log(Number(n + 1n));
      // console.log((n + 1n).toString());
      var n = 1n;
      var sum = 0n;
      for (var i = 0; i < 63; i++) {
        n = n * 2n;
        // console.log(n);
        sum += n;
      }
      console.log((sum + 1n));

      console.log(typeof 100n); //bigint 


      // string ,number,bigint,null,undefined,object js数据类型
      //boolean;