原型继承,call,继承行为案例,函数参数的默认值,对象的简写,解构,剩余运算符,展开,计算最大值,数组去重的n种方法,jq演示

103 阅读1分钟

1.原型-继承

跟函数一样起到一个重复调用

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta name="viewport"
        content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no" />
    <title>06-原型-继承-call</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
    </style>
</head>

<body>
    <script>
        function Person(name, age, height) {
            this.username = name;
            this.age = age;
            this.height = height;
        }

        function Student(name, age, height, color) {
            // 这一行代码解决了继承的问题!!
            // call 借用别人的方法
            // 谁有方法
            // 谁想要借用person方法  this = 实例 = 下面代码的s1
            Person.call(this, name, age, height);//   儿子想要复用父亲的某些代码 父亲方法.call(this,形参1,形参2。)
            // this.name = name;
            // this.age = age;
            // this.height = height;
            this.color = color;
        }

        // const p1 = new Person('奥特之父', 5000, 200);
        const s1 = new Student('迪迦', 2000, 100, 'yellow');

        // console.log(p1);
        console.log(s1);
    </script>
</body>

</html>

2.call()

就是一个借调方法

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta name="viewport"
        content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no" />
    <title>09-call3</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
    </style>
</head>

<body>
    <script>
         // call 借调 可以让一个对象 来借用另外一个对象的方法
      const obj = {
        name: '老王',
        skill() {
          // this = obj   this.name =  obj.name
          console.log(this.name + ' 翻墙'); // this 等于 调用者
        },
      };

      const obj2 = {
        name: '大郎',
      };

      // 大郎没有翻墙的方法 但是 老王有
      // 让大郎 借用一下 老王的翻墙功能
      // obj.skill.call(obj2); // 你有把老王的翻墙技能 借给谁使用

      const obj3={
        name:"刘同学"
      }
      obj.skill.call(obj3);//  ? 老王还是刘同学 
        // const obj = {
        //   name: '超人',
        //   skill:function(fly) {
        //     console.log(this.name + fly);
        //   },
        // };
        // obj.skill(' 会飞');
        // obj.skill(' 发射激光');
        // console.log(obj);

        // console.log(obj);{name:"超人",skill:function(){}}

        // 车
        // const car = {
        //   name: '装甲车',
        //   add:function(n1,n2,n3,n4) {
        //     // 给装甲车 武装武器  给car添加属性
        //     // n1 n2 n3 n4 武器
        //     // console.log(n1,n2,n3,n4);
        //     // console.log(this);// this = ??? 数据类型  对象类型 cart

        //     // car[n1]=n1; // n1 = A   car["A"]="A";
        //     // car[n2]=n2; // n2 = B   car["B"]="B";
        //     // car[n3]=n3;
        //     // car[n4]=n4;

        //     //  this =  car
        //     this[n1]=n1;
        //     this[n2]=n2;
        //     this[n3]=n3;
        //     this[n4]=n4;

        //   },
        // };
        // car.add("A","B","C","D");
        // console.log(car);

        // const obj={};

        // obj["username"]="普通人";// 是什么意思 ? 给obj对象添加属性
        // console.log(obj);

        const car = {
            name: '装甲车',
            add: function (username, age) {
                // 本质 可以给car添加新的属性
                this.username = username;
                this.age = age;
            },
        };

        // car.add('发动机', 100);
        // console.log(car);

        const obj = {};
        // car.add.call(obj); // obj 想要借用 添加属性的方法
        car.add.call(obj, '发动机', 200); // call 传入参数  add.call(谁要借用,被借用的方法的形参1,被借用的方法形参2)
        console.log(obj); // obj 有没有 username属性(不用管属性值)、有没有age属性(不用属性值)


      // 可以实现 了 一个空对象 obj 通过call的使用 来实现了 借别人的方法add 来给obj添加新的属性 
    </script>
</body>

</html>

3.继承行为

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta name="viewport"
        content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no" />
    <title>10-继承.html</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
    </style>
</head>

<body>
    <script>
        // 对象 两个大的特点
        // 属性 - 属性的继承
        // 行为-方法
        // 让儿子也具有父亲的行为  =>  把父亲的DNA 给到儿子即可
        // 给儿子添加行为 儿子的原型上添加
        // 父亲的行为 存放在父亲原型上

        function Person(name, age) {
            this.username = name;
            this.age = age;
        }

        Person.prototype.say = function () {
            console.log(this.username, this.age); // 我是谁 我的年龄是
        };
        Person.prototype.show = function () {
            console.log(this.username + ' 秀肌肉');
        };

        // const p1=new Person("父亲",50);
        // p1.say();

        function Student(name, age, color) {
            // name age person里面已经有定义
            // 借用一下
            Person.call(this, name, age);

            // color person里面没有的 需要自己来定义
            this.color = color;
        }
        const s1 = new Student('三好学生', 10, 'yellow');

        // 把父亲的行为 也设置到儿子上
        Student.prototype.say = Person.prototype.say;
        Student.prototype.show = Person.prototype.show;

        s1.say();
        s1.show();

        /*
        总结
        想要实现继承的功能 分两个部分
        1 属性的继承
          Person.call(this,其他参数)
        2 方法的继承
          儿子的原型.say =  父亲的原型.say 
        
         */
    </script>
</body>

</html>

4.继承的案例

封装重复的代码,跟函数调用差不多

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta name="viewport"
        content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no" />
    <title>12-继承的案例</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
    </style>
</head>

<body>
    <script>
        /* 
        封装 代码 实现以下的功能
        1 父亲   Element
          1 属性 dom   this.dom
          2 行为 实例.append(父元素标签的选择器)
        2 儿子1  ElementDouble  div
          1 继承父亲 Element  
            属性 dom
            行为 append
        3 儿子2  ElementSingle  img 
            属性 dom
            行为 append
  
        4 当执行以下代码时 出现对应效果
          1 const divModel = new ElementDouble("div","div内的文字")
          2 divModel.append("body") ;  body标签可以出现 一个 div 
  
          1 const imgModel = new ElementSingle("img","图片地址")
          2 imgModel.append("body");  body标签可以出现 一个图片 
         */

        //  父亲
        function Element(tagName) {
            const dom = document.createElement(tagName);
            this.dom = dom;
        }
        //  父亲
        Element.prototype.append = function (parentSelector) {
            document.querySelector(parentSelector).appendChild(this.dom);
        };

        // 儿子1
        function ElementDouble(tagName, content) {
            Element.call(this, tagName); // 继承 - 父亲的属性
            this.dom.innerText = content;
        }
        // 去继承父亲的行为
        ElementDouble.prototype.append = Element.prototype.append;

        // 儿子2
        function ElementSingle(tagName, src) {
            Element.call(this, tagName);
            this.dom.src = src;
        }
        ElementSingle.prototype.append = Element.prototype.append;

        const divModel = new ElementDouble('div', '这个是div');
        divModel.append('body');

        const imgModel = new ElementSingle('img', './images/b_01.jpg');
        imgModel.append('div');

      // 如果代码重复实现了 很有可能就是我们要封装的时候
      // 以前的封装 仅仅是封装一个小小的函数而已
      // 现在的封装, 面相对象的思维来封装
      // 封装 属性  父亲
      // 封装 方法  父亲

      // 两个儿子的代码 有重复部分
      // 创建标签重复 this.dom=dom  append方法也重复

      // 儿子1 有要什么功能
      // 先复用父亲的属性和方法

      // 分享
      // 在公司中,
      // 会调用代码的人 工作技术难度低(劳动量大),工资有上限
      // 还是会封装代码的人 工作技术难度高(劳动量不大) 工资高

      // 你感觉很难的知识,大佬都特别喜欢 是他们再次提高技术天花板的时候-提高收入-提高薪资

      // 金子塔上总是少部分的
      // 绝大部分的人过过多考虑自己的学习感受 而花很少时间去思考如何提高
      // 大佬 自己 死尸没有什么感受,  技术有用,能提高技术-如何去学
    </script>
</body>

</html>

5.函数参数的默认值

输出函数的时候不传参会默认,传实参会覆盖

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta name="viewport"
        content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no" />
    <title>15-函数参数默认值.html</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
    </style>
</head>

<body>
    <script>
        // function show(msg) {
        //   // 如果你给我传递了形参 我就输出你的形参
        //   // 如果没有给我输出,我就输出你好
        //     // console.log(msg);
        //     // 需要自己去判断
        //     if(msg){
        //       // 存在
        //       console.log(msg);
        //     }else{
        //       // 不存在
        //       console.log("你好");
        //     }
        // }

        // es6 函数参数默认值
        // 你好 默认值
        function show(msg = '你好', str = "你我都好") {
            console.log(msg, str);
        }

        show(); // 没有传递参数  输出你好 你我都好
        show('大家好'); // 输出 大家好 你我都好
        show('大家好', "世界美好"); // 输出大家好 世界美好
    </script>
</body>

</html>

6.对象的简写

变量名如果和你的对象的属性名一致 可以简写

对象的方法 简写 say(){}

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
    />
    <title>16-对象简写.html</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
    </style>
  </head>
  <body>
    <script>
      // 简写 如果变量的名字和属性的名字 一致的话,对象可以简写

      // const obj = {
      //   // 属性名 和 属性值
      //   username: 123,
      // };
      const username = 123;
      const color = 'red';

      const say = function () {};

      function show() {}

      // 很常用
      const obj = {
        username, // username:username
        color, // color : color
        say,
        show,
        height: 100,
      };

      obj.height = 200;
      // console.log(obj);
      // 对象中方法的简写
      const person={
        show:function(){
          console.log("show");
        },// 常规写法
        // es6 关于 方法简写
        say(){
          console.log("say");
        } // es6 关于 方法简写
      }
      person.show();
      person.say();
      /* 
      小结:
      1 变量名如果和你的对象的属性名一致 可以简写
         let username='悟空'
         const obj = { username }

      2 对象的方法 简写
        const obj ={
          say(){  // 简写的方法
          }
        }
       */
    </script>
  </body>
</html>

7.解构

解构数组,解构对象

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
    />
    <title>17-解构.html</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
    </style>
  </head>
  <body>
    <div data-index="100" data-num="200">div</div>
    <script>
      // dataset = { index:100}
      // const dataset= document.querySelector('div').dataset;
      // const { index,num } = document.querySelector('div').dataset;
      // console.log(dataset);
      // const {index}=dataset;
      // console.log(index);
      // console.log(num);
      // const arr = ['悟空', '八戒', '龙马', '三藏'];
      // 希望 声明四个变量  a = 悟空  b = 八戒 。。。
      // 下次我看到谁这么写代码的, 手都打肿!!!
      // 太low!! 低级  我自己 无地自容  想不开你
      // const a = arr[0];
      // const b = arr[1];
      // const c = arr[2];
      // const d = arr[3];

      // 数组解构
      // const  [a,b,c,d]=arr;
      // const [a, b, c, d] = ['悟空', '八戒', '龙马', '三藏',"沙僧"];
      // console.log(a, b, c, d);

      // 对象的解构
      // const obj = {
      //   username: '悟空',
      //   height: 100,
      // };

      // 声明两个变量 来获取obj的两个属性
      // low 代码!!!
      // const username = obj.username;
      // const height = obj.height;

      // 对象解构
      // const { username, height } = obj;
      // console.log(username, height);

      // 解构 + 默认值
      // const arr = [1,100];
      // const [a,b ] = arr; a = 1 b=undefined
      // const [a, b = 2] = arr;
      // console.log(a, b); // a =1  b = 2

      // b = 2 默认值 (你没有,就使用我,你有,使用你的)
      // const [a, b = 2] = arr;
      // console.log(a,b);

      const obj = {
        username: 100,
        height: 500,
      };
      const { username, height = 200 } = obj;
      console.log(username, height);

      /* 
      小结
      1 解构 对象 和 数组上
        对象 
        const  { username,height } = {username:"悟空",height:200}
        数组
        const [a,b]=[100,200];

     2 解构 + 默认值
       如果 右边的对象中没有height 属性 那么 height变量 =  1000 
       const  { username,height=1000 } = {username:"悟空",height:200} 
        
      //  c 在右边找不到对应的数据 c 就使用默认值 300 
        const [a,b,c=300]=[100,200];
       */
    </script>
  </body>
</html>

8.拓展运算符-剩余运算符-延展运算符

... 剩余运算符,接受所有剩下的

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta name="viewport"
        content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no" />
    <title>18-拓展运算符-剩余运算符-延展运算符.html</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
    </style>
</head>

<body>
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
    </ul>
    <script>
        // ...
        // 拓展运算符 以下三点
        // ...   获取剩下 展开

        // 获取剩下 数组
        // const [a,b,...c]=[1,2,3,4,5,6,7];
        // const [a,b,...c]=[1,2,3];
        // const [a, b, ...c] = [1, 2];
        // console.log(a,b); // 1 , 2
        // console.log(c);// [3,4,5,6,7]
        // console.log(c); //  [3]
        // console.log(c); //  []

        // 获取剩下 对象
        // const { a, ...c } = { a: 1, b: 2, c: 3 };
        // const { a,b,c ,...d } = { a: 1, b: 2, c: 3 };
        // console.log(c);// ? {b:2,c:3}
        // console.log(d); // ?

        // const [...a]=[1,2,3,4];
        // console.log(a);// [1,2,3,4]
        // console.log(a.map);
        // const lis = document.querySelectorAll('li');// lis 伪数组 没有map方法
        // const newList = [...lis]; // 如何理解 ? 转成真正的数组
        // console.log(newList.map);

        // 获取剩下 用在函数的形参上

        // 计算数据和的功能
        // calc(1,2)// 1 + 2
        // calc(1,2,3) // 1 + 2 + 3
        // calc(1,2,3,4) // 1 + 2 + 3 + 4
        function calc(...args) {
            // args 数组 装载这所有传给calc的参数
            // console.log(args);
            let sum = 0;
            args.forEach((value) => (sum += value));
            console.log(sum);
        }
        calc(1, 2); // ? [1,2]
        calc(1, 2, 3); // [1,2,3]
        calc(1, 2, 3, 4); // [1,2,3,4]


        /*
        剩余运算符
        1 数组中  const [a,b,...c]=[1,2,3,4,5,6,7];  c =[3,4,5,6,7]
          应用场景 伪数组转真正的数组
        2 对象中  const { a,...d } = { a: 1, b: 2, c: 3 }; // d = {b:2,c:3 }
        3 函数的形参中  
          calc(1, 2, 3);   function calc(...args) {}  // args = [1,2,3]
         计算数字总和 
  
        4 练习题目 
          getMax(1,2,3) // 输出3 
          getMax(1,4) // 输出4
          getMax(1,20,4) // 输出20 
          getMax(1,20,4,30,2) // 输出30
        
         */
    </script>
</body>

</html>

9.计算最大值的两种方法

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta name="viewport"
        content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no" />
    <title>19-计算最大值.html</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
    </style>
</head>

<body>
    <script>
        // 计算最大值的写法 第一种
        function getMax(...args) {
            // args= 数组  接收 所有传递给 getMax方法的 参数
            // console.log(args);
            // 计算最大值 的
            let max = args[0];
            args.forEach((value) => {
                if (value > max) {
                    max = value;
                }
            });
            console.log(max);
        }

        // getMax(1);
        // getMax(1, 2);
        // getMax(1, 2, 3);
        // getMax(11, 33, 2, 3);

        // Math对象 自己就封装过 计算最大值和最小值的代码
        // console.log(Math.max(1,3,4,2));// 4
        // console.log(Math.min(1,3,4,2));// 1
                 //第二种
        function getMax2(...args) {
            // Math.max(1,3,4,2)
            // args=[1,3,4,3]
            // Math.max([1,3,4,3]) =>  Math.max(1,3,4,2)
            // 剩余运算符的

            console.log(Math.max(...args));
        }
        // getMax2(1,2,3);
        // getMax2(1,2,33);
        // console.log(Math.max(...[1,3,4,3])); //  Math.max(1,3,4,2)

        getMax2(1, 2, 3, 4); // 体现的思想 不再是 剩余 。  展开-延展-拓展 思想 
    </script>
</body>

</html>

10.拓展-展开-延展

就是修改数组对象,但是旧的不会被污染

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta name="viewport"
        content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no" />
    <title>20-拓展-展开-延展.html</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
    </style>
</head>

<body>
    <script>
        // 展开 ... 用法
        // const obj = {
        //   username: '悟空',
        //   height: 200,
        // };

        // // 新创建一个对象 这个对象 具有 所有 obj的属性
        // // 同时 还有多一个属性,color

        // // const newObj = obj;// 对象是引用类型   写 =  将 obj的地址 给了一份 newObj  两个变量指向的地址同样的 同一个对象
        // // newObj.color = 'yellow';
        // // console.log("新的对象",newObj);
        // // console.log("旧的对象",obj);

        // // 建议这做  互补影响
        // const newObj = { ...obj, color: 'yellow' }; // 给newObj 开辟新的内存空间
        // // const newObj={ username:"悟空",height:20}; // 给newObj 开辟新的内存空间
        // newObj.username = '八戒';
        // newObj.weight = 100;
        // console.log(obj);
        // console.log(newObj);

        // 展开运算符 对数组操作
        const arr = ['a', 'b', 'c'];
      // 在数组的后面 新增一个 元素 'd'
      // const newArr=[...arr,'d'];

      // 在数组宅前面 新增一个属性 w
      // console.log(newArr);
      // const newArr = ['w', ...arr];
      // console.log(newArr);
      // arr.push
      // arr.unshift
      // 中间 无法使用 ...
      // splice 来实现 
    </script>
</body>

</html>

11.数组去重的方法一

用some 如果数组中有一项 是返回了true 整个some方法就返回了true

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <meta name="viewport"
    content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no" />
  <title>21-数组去重.html</title>
  <style>
    * {
      margin: 0;
      padding: 0;
      box-sizing: border-box;
    }
  </style>
</head>

<body>
  <input type="text" />
  <ul></ul>
  <script>
    /* 
    1 输入框绑定键盘按下事件
      1 判断按下的是不是 回车键
      2 是的话 获取输入框的值
      3 判断当前要显示的数据 是否已经存在于数组中 filter 可以 some可以
        如果是已经存在 就不要继续添加
        如果是不存在  就继续添加
      4 把它添加到数组中
      5 写一个方法 把数组的数据 拼接成li标签,插入到 ul中
     */
    const input = document.querySelector('input');
    const ul = document.querySelector('ul');
    const arr = ['a', 'b'];
    render();

    input.addEventListener('keydown', function (event) {
      //判断按下的是不是回车
      if (event.key === 'Enter') {
        // console.log(this.value);

        // some 如果数组中有一项 是返回了true 整个some方法就返回了true
        // 调用some方法的时候,在它的回调函数中 拿数组中的元素 和 当前要添加的元素 做比较 如果相等 就返回true 表示找到了重复

        const isHas = arr.some((value) => value === this.value); // 在我的数组中找到了和你待添加的元素 一样的值 返回true
        if (isHas) {
          // 有重复了 不要再添加
          alert('有重复了 不要再添加')
        } else {
          // 没有重复 你可以添加
          // 把它添加到数组中
          arr.push(this.value);
          // 数组发生了改变 重新调用render方法 来实现页面的渲染
          render();
          input.value = ''
        }
      }
    });

    function render() {
      const html = arr.map((value) => `<li>${value}</li>`).join('');
      ul.innerHTML = html;
    }
  </script>
</body>

</html>

12.数组去重的方法二

用for循环的方式

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <meta name="viewport"
    content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no" />
  <title>21-数组去重.html</title>
  <style>
    * {
      margin: 0;
      padding: 0;
      box-sizing: border-box;
    }
  </style>
</head>

<body>
  <input type="text" />
  <ul></ul>
  <script>
    const input = document.querySelector('input');
    const ul = document.querySelector('ul');
    const arr = ['a', 'b'];
    render();

    input.addEventListener('keydown', function (event) {
      if (event.key === 'Enter') {
        // 定一个变量,表示数组有没有重复的数据
        // 假设它 没有重复
        let isHas = false;
        for (let index = 0; index < arr.length; index++) {
          // 判断数组中的每一个元素 和 当前要输入的值做比较
          // 如果找到了,设置 isHas=true 同时 打断循环
          if (arr[index] === this.value) {
            // 找到重复了
            isHas = true;
            break;
          }
        }

        // 判断数据有没有重复
        if (isHas) {
          // 有重复
          console.log('有重复');
        } else {
          // 没有重复 添加
          arr.push(this.value);
          render();
        }
      }
    });

    function render() {
      const html = arr.map((value) => `<li>${value}</li>`).join('');
      ul.innerHTML = html;
    }
  </script>
</body>

</html>

13.数组去重的方法三

filter方法先过滤出 和当前的输入框的值 不相等的 数据

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
    />
    <title>21-数组去重.html</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
    </style>
  </head>
  <body>
    <input type="text" />
    <ul></ul>
    <script>
      const input = document.querySelector('input');
      const ul = document.querySelector('ul');
      let arr = ['a', 'b'];
      render();

      input.addEventListener('keydown', function (event) {
        if (event.key === 'Enter') {
          // filter 来解决
          // filter 过滤
          // 先过滤出  和当前的输入框的值 不相等的 数据
          // 然后再添加
          // 当前输入框的值 "d"
          // 我数组 ['a','c','d']
          // 数组过滤 不包含 "d"  => ['a','c']
          // ['a','c'] 再次添加 'd' 进去 就可以了

          // 过滤出不包含 当前输入框的值的数组
          const newArr = arr.filter((value) => value !== this.value);
          // debugger
          // 让我们的旧的数组 等于你过滤后的数组
          arr = newArr;
          arr.push(this.value);
          render();
        }
      });

      function render() {
        const html = arr.map((value) => `<li>${value}</li>`).join('');
        ul.innerHTML = html;
      }
    </script>
  </body>
</html>

14.数组去重的方法四

splice删除插入;先判断,再用删除插入的方式

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
    />
    <title>21-数组去重.html</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
    </style>
  </head>
  <body>
    <input type="text" />
    <ul></ul>
    <script>
      const input = document.querySelector('input');
      const ul = document.querySelector('ul');
      let arr = ['a', 'b'];
      render();

      input.addEventListener('keydown', function (event) {
        if (event.key === 'Enter') {
          // this.value =  "b"
          // arr = ["a","b","c"]

          // 先找到 “b” 在我数组的索引 位置
          // 执行 数组 删除元素  arr = [a,c]
          // 然后 再去执行 添加元素的操作

          let i = -1; // -1 表示没有找到
          for (let index = 0; index < arr.length; index++) {
            if (arr[index] === this.value) {
              i=index;
              break;
            }
          }

          // 判断 i 等于-1 表示没有相同,直接添加
          //  i 不等于-1 表示有相同,先执行删除 再添加
          if(i===-1){
            // arr.push(this.value);
          }else{
            // 找到相同
            arr.splice(i,1);
            // arr.push(this.value);
          }
          arr.push(this.value);

          render();
        }
      });

      function render() {
        const html = arr.map((value) => `<li>${value}</li>`).join('');
        ul.innerHTML = html;
      }
    </script>
  </body>
</html>

15.数组去重的几种,了解

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta name="viewport"
        content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no" />
    <title>21-数组去重.html</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
    </style>
</head>

<body>
    <input type="text" />
    <ul></ul>
    <script>
        const input = document.querySelector('input');
        const ul = document.querySelector('ul');
        let arr = ['a', 'b'];
        render();

        input.addEventListener('keydown', function (event) {
            if (event.key === 'Enter') {
                // 数组去重 一堆方法
                // for forEach some  
                // 没有细讲 indexOf find findIndex  includes set every 

                // 没有足够的技术积累和代码量  优雅不起来!! 


                // indexOf find findIndex includes set

                // const index=arr.indexOf(this.value);
                // const index=arr.findIndex(value=>value===this.value)
                // const item=arr.find(value=>value===this.value);
                // const isHas=arr.includes(this.value)
                // if(!isHas){
                //   // 没有找到
                //   arr.push(this.value);
                //   render();
                // }

                const set = new Set(arr);
                set.add(this.value);
                arr = [...set];
                render();
            }
        });

        function render() {
            const html = arr.map((value) => `<li>${value}</li>`).join('');
            ul.innerHTML = html;
        }
    </script>
</body>

</html>

16.jq演示

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta name="viewport"
        content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no" />
    <title>26-演示jq.html</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
    </style>
</head>

<body>
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
        <li>5</li>
        <li>6</li>
        <li>7</li>
        <li>8</li>
        <li>9</li>
        <li>10</li>
    </ul>
    <script src="https://cdn.bootcss.com/jquery/1.11.3/jquery.js"></script>
    <script>
        //  简单 比js高级 简单多了 不是一个量级!! 
        $(function () {
            $("li").click(function () {
                //  1 点击 激活选中 其他li标签排他
                // $(this).css("backgroundColor","red").siblings().css("backgroundColor","#fff");

                // 2 点击 渐变 显示和消失
                // $(this).fadeToggle()

                // 3 手风琴
                // $(this).slideUp();
            })
        })
    </script>
</body>

</html>