码码JS

167 阅读14分钟

一:js的书写方式

  • 行内式(可读性差,引号易错,特殊情况使用)

      <input type="text" onclick="alert('弹出')">
    
  • 内嵌式(最常用)

      <script>
    
      </script>
    
  • 外部式(利于HTML界面结构化,引用外部JS文件的script标签中间不可以写代码,适用于js代码量比较大的情况

       <script src=""></script>
    

1.2 字符串转义字符

image.png

1.3js的输入输出语句

  • alert()浏览器弹出警示框
  • consol.log()浏览器控制台打印输出信息
  • prompt()浏览器弹出输入框,用户可以输入

二:变量

2.1 变量的使用(必须声明变量,并且赋值后才能使用,否则会报错)

  • var是一个js关键字,用来声明变量。使用该关键字声明变量后,计算机会自动会变量分配内存空间

  • age是程序员定义的变量名,我们要通过变量名来访问内存中分配的空间

      <script>
          var age;
          age=1;
      </script>
      <script>
        //1. 用户输入姓名 存储到一个 myname的变量里面
        var myname = prompt(" 请输入您的名字");
        //2. 输出这个用户名
        alert(myname);
      </script>
      
    
  • 一个变量被重新复赋值后,它原有的值就会被覆盖,变量值将以最后一次赋的值为准。

  • 同时声明多个变量时,只需要写一个 var, 多个变量名之间使用英文逗号隔开。

      var age = 10,  name = 'zs', sex = 2;       
    

2.2 变量的命名规范

  • 由字母(A-Za-z)、数字(0-9)、下划线、美元符号$组成
  • 严格区分大小写,varapp和varApp是两个变量
  • 不能以数字开头,18age是错误的
  • 不能是关键字、保留字,例如:var、for、while
  • 遵守驼峰命名法,首字母小写,后面单词的首字母要大写,如usrAge

三:数据类型

  • 数字型 Number(0)
  • 布尔型 Boolean(false)
  • 字符串类型 String("")
  • Undefined (var a;声明了变量a但没有给值,此时a=undefined)
  • Null (var a=null;声明了变量a为空值)

3.1 字符串的拼接

  • 多个字符串之间可以使用+进行拼接,字符串+任何类型=拼接之后的新字符串

  • 拼接前会把与字符串相加的任何类型转成字符串,再拼接成一个新的字符串

      <script>
        console.log('奥拓' + '汽车');
    
        console.log('奥拓老师' + 18);
    
        console.log('奥拓老师' + true);
    
        console.log('12' + 12);
    
        console.log('奥拓老师' + 18 + '岁');
      </script>
    
  • 将字符串与变量拼接时,变量不能添加引号,加引号的变量会变成字符串

      var age = 25;
      console.log('奥拓老师' + age + '岁');
    
  • 模板字符串(拼接字符串和变量)

        <script>
          let age = 18
          document.write(`我今年${age}岁了`)//反引号包裹
        </script>
    

3.2 布尔型变量参与运算

    console.log(true + 1);  // 2
    console.log(false + 1); // 1
    

3.3 undefined与null的特殊性

    <script>
        var str1=undefined
        console.log(str1+'auto')//undefinedauto
        console.log(str1+1)//NaN
        var str2=null
        console.log(str2+'auto')//nullauto
        console.log(str2+1)//1
      </script>

3.4 获取变量类型

image.png

3.5 数据类型转换

转换为字符串

  • toString()

  • String()强制转换

  • 加号拼接字符串隐式转换

      <script>
        var num = 10;
        var str = num.toString();
        console.log(str);
    
        console.log(String(num));
    
        console.log('' + num);
      </script>
    

转换为数字型

  • parseInt()

  • parseFloat()

  • Number()强制转换

  • (- * /)隐式转换

      <script>
        var age = '18';
        console.log(parseInt(age)); //18
        console.log(parseInt('3.9')); //3 取整
        console.log(parseInt('120px')); //120 自动去掉px
        console.log(parseInt('rem120px')); //NaN
    
        console.log(parseFloat('3.14')); //3.14
        console.log(parseFloat('120px')); //120
        console.log(parseFloat('rem120px')); //NaN
    
        console.log(Number('123'));//123
    
        console.log('12'-0); //数字12
      </script>
    

转换为布尔型

  • Boolean()

  • 代表空、否定的值会被转换为false

      console.log(Boolean('')); // false
      console.log(Boolean(0)); // false
      console.log(Boolean(NaN)); // false
      console.log(Boolean(null)); // false
      console.log(Boolean(undefined)); // false
      console.log(Boolean('小白')); // true
      console.log(Boolean(12)); // true
    

四:运算符

4.1算数运算符(+ - * / %取余数)

  • ++i与i++在单独使用时效果是一样的

      <script>
          let i=1
          i++
          console.log(i)//2
          let a=1
          ++a
          console.log(a)//2
        </script>
        
    
  • 前置递增或后置递增与其他代码连用时,前置递增先加后运算,后置递增先运算,后返回自身++后的值

        <script>
          let i=1
          console.log(++i +1)//3
          let a=1
          console.log(a++ +1)//2(运算出结果为2后,a的值才变为2)
        </script>
        
    
  • 注意浮点数运算

      var result = 0.1 + 0.2;    // 结果不是 0.3,而是:0.30000000000000004
      console.log(0.07 * 100);   // 结果不是 7,  而是:7.000000000000001
      
    

4.2比较运算符

image.png

  • 等号==有隐式转换,会将其它类型的元素转换为字符型进行比较
  • 全等===要求两侧值和数据类型都一致才会显示true

4.3逻辑运算符

  • &&逻辑与(一假则假)

  • ||逻辑或(一真则真)

  • !逻辑非(真变假,假变真)

  • 短路运算原理:当有多个表达式(值)时,左边的表达式(值)可以确定结果时,就不再继续运算右边的值

      <script>
        /* 
           短路运算
              逻辑与短路运算特点
              语法:表达式1&&表达式2
              如果第一个表达式为真,则返回表达式2
              如果第一个表达式为假,则返回表达式1
    
              逻辑或运算特点
              语法:表达式1||表达式2
              如果第一个表达式为真,则返回表达式1
              如果第一个表达式为假,则返回表达式2 
          */
        console.log(123 && 456);//  456
        console.log(0 && 456);//  0
        console.log(0 && 1 + 2 && 456);//  0
    
        console.log(123 || 456);//  123
        console.log(0 || 456);//  456
    
      </script>
    

4.4运算符优先级

image.png

五:流程控制

5.1if语句

  • 条件表达式为真,则继续执行大括号里的代码,为假则不行

      if(3<5) {
        alert('123');
      }
    

5.2if else语句(多选一,分支较少)

  • 如果条件表达式1满足就执行,语句1执行完毕后,退出整个if分支语句

  • 如果条件表达式1不满足,则判断条件表达式2是否满足,以此类推

  • 如果所有条件表达式都不满足,则执行else中的语句

      //结构
      if(条件表达式1){
        //语句1
      }
      else if(条件表达式2){
        //语句2
      }
      else if(条件表达式3){
        //语句3
      }
      else{
        //最后的语句
      }
    

5.3三元表达式

  • 如果条件表达式结果为真,则返回表达式1的值;如果结果为假,则返回表达式2的值

       条件表达式 ? 表达式 1 : 表达式 2
    

5.4switch语句(分支较多的情况)

  • 如果case都没有匹配上,switch中如果有default语句则执行default,没有则不执行

  • switch后面的括号和case后的值事全等形式

  • switch后面的括号不能是浮点数

  • switch case语句常用于case为确定值的情况;if else常用于范围判断(大于,等于某个范围)

      switch(表达式){
        case value1:执行语句1;break;
        case value2:执行语句1;break;
        case value3:执行语句1;break;
        case value4:执行语句1;break;
        default:执行最后的语句;
      }
    

5.5while循环

    <script>
      // while循环案例
      // 1. 打印人的一生,从1岁到100岁
      var i = 1;
      while (i <= 100) {
        console.log(`这个人今年${i}岁了`);
        i++;
      }

      // 2. 计算 1 ~ 100 之间所有整数的和
      var sum = 0;
      var j = 1;
      while (j <= 100) {
        sum += j;
        j++
      }
      console.log(sum);

      // 3. 弹出一个提示框, 你爱我吗?  如果输入我爱你,就提示结束,否则,一直询问。
        while (true){
            let str=promt('你爱我吗')
            if (str==='爱')
                break
        }
    </script>

break 与 continue区别

  • break用于立刻跳出整个循环

      for (var i = 1; i <= 5; i++) {
            if (i == 3) {
              break;
            }
            console.log('我正在吃第' + i + '个包子');
      }
      //打印结果: 我正在吃第1个包子
                  我正在吃第2个包子
    
  • continue用于立刻跳出本次循环,继续下一次循环(本次循环continue后的代码也不被执行)

       <script>
          for (let i=1;i<=5;i++){
            if (i===3){
              continue
            }
            console.log(`我正在吃第${i}个包子`)
          }
          //打印结果:
                    我正在吃第1个包子;
                    我正在吃第2个包子;
                    我正在吃第4个包子;
                    我正在吃第5个包子;
    
        </script>
    

for循环

  • for循环外层循环一次,内层for循环全部执行

      <script>
       //打印 5×5  阵列星星
       var str = '';
       //用于链接星星
       for (var j = 1; j <= 5; j++) {
         //控制行数
         for (var k = 1; k <= 5; k++) {
           str = str + '★';
         }
         str = str + '\n';
       }
       console.log(str);
     </script>
    

六:数组

6.1数组创建

    //创建数组 两种方式
    //1、利用数组字面量
    var arr = [1, 2, 3];
    console.log(arr[0]);

    //2 利用new Array()
    var arr1 = new Array();
    var arr2 = new Array(2);//表示数组长度为2 里面有两个空的数组元素
    var arr3 = new Array(3, 3);//等价于 [3,3]  表示里面有两个数组元素,一个是3一个是3
    console.log(arr3);
  • 数组通过索引来访问,设置,修改对应的数组元素,数组下标从0开始,通过“数组名[索引]”的形式来获取数组元素

6.2新增数组元素

     var arr1 = ['red', 'green', 'blue'];
        arr1[3] = 'pink';
        console.log(arr1);
        arr1[4] = 'hotpink';
        console.log(arr1);
        arr1[0] = 'yellow'; // 这里是替换原来的数组元素
        console.log(arr1);
        arr1 = '一个数组';
        console.log(arr1); // 不要直接给 数组名赋值 否则里面的数组元素都没有了
        

6.3数组筛选

  • 声明一个新的数组用于存放新数据newArr

  • 遍历原来的旧数组,找出符合条件的元素

  • 依次追加给新数组newArr

        <script>
          let arr = [2,0,6,1,77,9,54,3,78,7]
          let newArr =[]
          for (let i=0;i<arr.length;i++){
            if (arr[i]>=10){
              newArr.push(arr[i])
            }
          }
          console.log(newArr)
        </script>
        
    

七:函数

  • 函数不调用,函数不执行

  • 调用函数--函数名();

  • 声明函数用function关键字

       <script>
          // 利用函数计算1-100之间的累加和 
          // 1. 声明函数
          function getSum() {
              var sum = 0;
              for (var i = 1; i <= 100; i++) {
                sum += i;
              }
              console.log(sum);
          }
          // 2. 调用函数
          getSum();
          getSum();
      </script>
    

7.1形参与实参

  • 在声明函数时,可以在函数名称后面的小括号中添加一些参数,这些参数被称为形参,而在调用该函数时,同样也需要传递相应的参数,这些参数被称为实参

  • 形参:形式参数,函数定义的时候传递,当前并不知道是什么

  • 实参:实际参数,函数调用时传递的参数,实参是传给形参的

  • 如果实参的个数和形参的个数一致,则正常输出结果

  • 如果实参的个数多余形参的个数会取到形参的个数

  • 如果实参的个数小于形参的个数,假设形参(num1,num2)给了num1值没有给num2,但是函数的形参是一个局部变量,并且是一个没有接收值的underfined所以结果是:定义了,未赋值,结果为NaN

  • 在函数内部,未声明直接赋值的变量也是全局变量

      // 1. 利用函数求任意两个数的和
        function getSum(num1, num2) {
            console.log(num1 + num2);
        }
        getSum(1, 3); 
        getSum(3, 8);
    
    
      // 2. 利用函数求任意两个数之间的和
        function getSums(start, end) {
            var sum = 0;
            for (var i = start; i <= end; i++) {
              sum += i;
          }
          console.log(sum);
    
        }
        getSums(1, 100);
        getSums(1, 10);
      // 3. 注意点
      // (1) 多个参数之间用逗号隔开
      // (2) 形参可以看做是不用声明的变量
    

7.2return

  • 只要函数遇到return就把后面的结果返回给函数的调用者 后面的代码不会执行。 返回函数名()=return后面的结果

  • 只能返回一个值,如果需要返回多个值,则用数组return[num1.num2……],或者用对象

  • 如果函数里面有return则返回的是return后面的值,如果函数没有return,则返回的是underfined

  • return不仅能退出循环,还能返回return语句后面的值

      // 1. return 终止函数
      function getSum(num1, num2) {
        return num1 + num2; // return 后面的代码不会被执行
        alert('我是不会被执行的哦!')
      }
      console.log(getSum(1, 2));
    
    
      // 2. return 只能返回一个值
      function fn(num1, num2) {
        return num1, num2; // 返回的结果是最后一个值
      }
      console.log(fn(1, 2));
    
    
      // 3.  我们求任意两个数的 加减乘数结果
      function getResult(num1, num2) {
        return [num1 + num2, num1 - num2, num1 * num2, num1 / num2];
      }
      var re = getResult(1, 2); // 返回的是一个数组
      console.log(re);
    
    
      // 4. 我们的函数如果有return 则返回的是 return 后面的值,如果函数没有 return 则返回undefined
      function fun1() {
        return 666;
      }
      console.log(fun1()); // 返回 666
      function fun2() {
    
      }
      console.log(fun2()); // 函数返回的结果是 undefined
    

7.3匿名函数

    // 1. 利用函数关键字自定义函数(命名函数)
    function fn() {

    }
    fn();


    // 2. 函数表达式(匿名函数) 
    var 变量名 = function() {};
  • 具名函数可以在声明函数前或后使用,匿名函数必须先声明后使用

7.4变量作用域

全局变量

  • 在函数外部定义的变量

  • 在代码任何位置都可以使用

  • 在全局作用域下var/let声明的变量是全局变量

  • 如果在函数内部,没有声明直接赋值的变量也属于全局变量

      var num = 10; // num就是一个全局变量
      console.log(num);
    
      function fn() {
        console.log(num);
    
      }
      fn();
      // console.log(aru);
      
    

局部变量

  • 在函数内部定义var/let的变量

  • 局部变量只能在该函数内部使用

  • 函数的形参就是局部变量

      function fun(aru) {
          var num1 = 10; // num1就是局部变量 只能在函数内部使用
          num2 = 20;
      }
      fun();
    

八:对象

8.1创建对象的三种方式

  • 利用字面量创建对象

      let star = {
          name : 'pink',
          age : 18,
          sex : '男',
          sayHi : function(){
              alert('大家好啊~');
          }
      };
    
  • 利用new Object创建对象

      var andy = new Object();
      andy.name = 'pink';
      andy.age = 18;
      andy.sex = '男';
      andy.sayHi = function(){
          alert('大家好啊~');
      }
    
  • 利用构造函数创建对象

      function Person(name, age, sex) {
           this.name = name;
           this.age = age;
           this.sex = sex;
           this.sayHi = function() {
            alert('我的名字叫:' + this.name + ',年龄:' + this.age + ',性别:' + this.sex);
          }
      }
    

8.2对象的调用

  • 对象里面的属性调用 : 对象.属性名 ,这个小点 . 就理解为“ 的 ”

  • 对象里面属性的另一种调用方式 : 对象[‘属性名’] ,注意方括号里面的属性必须加引号

  • 对象里面的方法调用:对象.方法名()  ,注意这个方法名字后面一定加括号

      console.log(star.name)     // 调用名字属性
      console.log(star['name'])  // 调用名字属性
      star.sayHi();              // 调用 sayHi 方法,注意,一定不要忘记带后面的括号
    

8.3遍历对象属性

    for (var k in obj) {
        console.log(k);      // 这里的 k 是属性名
        console.log(obj[k]); // 这里的 obj[k] 是属性值
    }

8.4Math对象(不是构造函数,它具有数学函数的属性和方法)

    Math.PI		 // 圆周率
    Math.floor() 	 // 向下取整
    Math.ceil()    // 向上取整
    Math.round()   // 四舍五入版 就近取整   注意 -3.5   结果是  -3 
    Math.abs()		 // 绝对值
    Math.max()/Math.min()	 // 求最大和最小值 
    <script>
    // 1.绝对值方法
    console.log(Math.abs(1)); // 1
    console.log(Math.abs(-1)); // 1
    console.log(Math.abs('-1')); // 隐式转换 会把字符串型 -1 转换为数字型
    console.log(Math.abs('pink')); // NaN 

    // 2.三个取整方法
    // (1) Math.floor()   地板 向下取整  往最小了取值
    console.log(Math.floor(1.1)); // 1
    console.log(Math.floor(1.9)); // 1
    // (2) Math.ceil()   ceil 天花板 向上取整  往最大了取值
    console.log(Math.ceil(1.1)); // 2
    console.log(Math.ceil(1.9)); // 2
    // (3) Math.round()   四舍五入  其他数字都是四舍五入,但是 .5 特殊 它往大了取  
    console.log(Math.round(1.1)); // 1
    console.log(Math.round(1.5)); // 2
    console.log(Math.round(1.9)); // 2
    console.log(Math.round(-1.1)); // -1
    console.log(Math.round(-1.5)); // 这个结果是 -1

    </script>

随机数方法random()

  • 随机数方法 random() : 返回的是一个浮点数 取值是[0,1) 0 =< x < 1 ,这个方法不跟参数

      <script>        
              //  
    
              //  得到一个两数之间的随机整数 不包括两个数在内
              function getRandomInt(min, max) {
                  min = Math.ceil(min);
                  max = Math.floor(max);
                  return Math.floor(Math.random() * (max - min)) + min; //不含最大值,含最小值
              }
              console.log(getRandomInt(10, 20));
    
              //  得到一个两数之间的随机整数 包括两个数在内
              function getRandomIntInclusive(min, max) {
                  // min = Math.ceil(min);
                  // max = Math.floor(max);
                  return Math.floor(Math.random() * (max - min + 1)) + min; //含最大值,含最小值 
              }
              console.log(getRandomIntInclusive(20, 30));
    
      </script>
    

8.5日期对象(是构造函数,需要实例化后才能使用)

  • 使用第一步:获取当前时间必须实例化

      var now = new Date();
      console.log(now);
    
  • 第二步:Date()构造函数参数:如果括号里有时间,就返回参数里面的时间,new Date('2023-12-4')或new Date('2023/12/4');如果括号里不写参数就返回当前时间

日期格式化

    <script>
            // 格式化日期 年月日 
            var date = new Date();
            console.log(date.getFullYear()); // 返回当前日期的年  2023
            console.log(date.getMonth() + 1); // 月份 返回的月份小1个月   记得月份+1 
            console.log(date.getDate()); // 返回的是 几号
            console.log(date.getDay()); // 1  周一返回的是 1 周六返回的是 6 但是 周日返回的是 0
            // 我们写一个 2023年 12月 4日 星期一
            var year = date.getFullYear();
            var month = date.getMonth() + 1;//补回上面的坑
            var dates = date.getDate();
            var arr = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
            var day = date.getDay();
            console.log('今天是:' + year + '年' + month + '月' + dates + '日 ' + arr[day]);
            // 格式化日期 时分秒
            var date = new Date();
            console.log(date.getHours()); // 时
            console.log(date.getMinutes()); // 分
            console.log(date.getSeconds()); // 秒
            // 要求封装一个函数返回当前的时分秒 格式 08:08:08
            function getTimer() {
                var time = new Date();
                var h = time.getHours();
                h = h < 10 ? '0' + h : h;
                var m = time.getMinutes();
                m = m < 10 ? '0' + m : m;
                var s = time.getSeconds();
                s = s < 10 ? '0' + s : s;
                return h + ':' + m + ':' + s;
            }
            console.log(getTimer());
    </script>

8.6数组对象

增删数组元素

     <script>
            // 添加删除数组元素方法
            // 1. push() 在我们数组的末尾 添加一个或者多个数组元素   push  推
            var arr = [1, 2, 3];
            // arr.push(4, 'pink');
            console.log(arr.push(4, 'pink'));

            console.log(arr);
            // (1) push 是可以给数组追加新的元素
            // (2) push() 参数直接写 数组元素就可以了
            // (3) push完毕之后,返回的结果是 新数组的长度 
            // (4) 原数组也会发生变化


            // 2. unshift 在我们数组的开头 添加一个或者多个数组元素
            console.log(arr.unshift('red', 'purple'));

            console.log(arr);
            // (1) unshift是可以给数组前面追加新的元素
            // (2) unshift() 参数直接写 数组元素就可以了
            // (3) unshift完毕之后,返回的结果是 新数组的长度 
            // (4) 原数组也会发生变化

            // 3. pop() 它可以删除数组的最后一个元素  
            console.log(arr.pop());
            console.log(arr);
            // (1) pop是可以删除数组的最后一个元素 记住一次只能删除一个元素
            // (2) pop() 没有参数
            // (3) pop完毕之后,返回的结果是 删除的那个元素 
            // (4) 原数组也会发生变化


            // 4. shift() 它可以删除数组的第一个元素  
            console.log(arr.shift());
            console.log(arr);
            // (1) shift是可以删除数组的第一个元素 记住一次只能删除一个元素
            // (2) shift() 没有参数
            // (3) shift完毕之后,返回的结果是 删除的那个元素 
            // (4) 原数组也会发生变化
    </script>

image.png

数组排序

     <script>
            // 数组排序
            // 1. 翻转数组
            var arr = ['pink', 'red', 'blue'];
            arr.reverse();
            console.log(arr);

            // 2. 数组排序(冒泡排序)
            var arr1 = [13, 4, 77, 1, 7];
            arr1.sort(function(a, b) {
                //  return a - b; 升序的顺序排列
                return b - a; // 降序的顺序排列
            });
            console.log(arr1);
    </script>

数组索引

    <script>
            // 返回数组元素索引号方法  indexOf(数组元素)  作用就是返回该数组元素的索引号 从前面开始查找
            // 它只返回第一个满足条件的索引号 
            // 它如果在该数组里面找不到元素,则返回的是 -1  
            // var arr = ['red', 'green', 'blue', 'pink', 'blue'];
            var arr = ['red', 'green', 'pink'];
            console.log(arr.indexOf('blue'));
            // 返回数组元素索引号方法  lastIndexOf(数组元素)  作用就是返回该数组元素的索引号 从后面开始查找
            var arr = ['red', 'green', 'blue', 'pink', 'blue'];

            console.log(arr.lastIndexOf('blue')); // 4
    </script>