2021-04-27 JS 高级01

 

1.复习数据类型

 

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

<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Document</title>
</head>

<body></body>
<script>
  /* 
    值类型:
        数字/字符串/布尔/null/undefined
      
        类型转换"
            把其他类型转成数字
                Number()
                ParseInt()
                ParseFloat()
                +'1'
                -'1'
                '1' - 0 

            把其他类型转成布尔
                Boolean()
                !!
                if(flag===false){

                }
                if(!flag)

            其他类型转换成字符串

                String()
                .toString()
                " "+
    引用类型:
        对象:
            万物皆对象
                数组
                函数
                伪数组
                元素
            内置对象(Math/Date/Array/Object)
            基本包装类型 String/Number/Boolean
            自定义: new Object()
     */

  console.log(+"1"); //+是数学里面的正负号的 正号
  console.log(-"1"); //+是数学里面的正负号的 负号
  console.log("1" - 0); //+是数学里面的正负号的 负号

  // var a;
  // console.log(a.toString());
  /*  var box = document.getElementById("box");
  box.onclick = function () {
    console.log(123);
  }; */

  // 基本类型中 undefined和null的区别?
  /*  undefined--未定义 当前没有 以后也没有,通常要给它赋值 会赋值为值类型
  undefined 在页面上只会有一个 */
  // var a = undefined;
  // var b = undefined;
  // null--空 --当前没有 以后会有 通常以后会赋值一个对象给该变量 null不会占用内存空间

  undefined == null //会进行类型的隐式转换=>false == false
  undefined === null //比较其实都是比较在栈里面的值

  // typeof --检测数据类型
  // typeof 数据
  // typeof(数据)
</script>

</html>

 

 

2.值类型 和引用类型

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body></body>
  <script>
    /* 
    值类型和引用类型的不同
    1.存储的位置不一样 
    值---栈  ----使用频率高 栈空间的内存是有顺序的 大小是固定的

    引用: ---堆--- 使用频率没有值类型高,堆空间的内存是无序的 大小是动态分配的
    */
    var obj = { name: "王德发" };
    obj.age = 12;
    obj.gender = "男";
    console.log(obj);
    // delete这格关键字 用于删除对象的属性
    delete obj.gender;
    console.log(obj);

    // 值传递和引用传递: 变量赋值其实是:把栈里面的的值复制一份的过程
    var a = 20;
    var b = a;
    // a = 30;
    // console.log(b);
    //值传递修改a或者b的值 两者互不影响

    //引用传递
    var o1 = {};
    var o2 = o1;
    //引用传递修改o1或者o2其实是修改的同一个对象
 

    // function fn(a,b){
    //     a++; //21
    //     b++; //21
    //     console.log(a);
    //     console.log(b);
    // }
    // fn(a,b);

    function f2(o){
        o.name = '李狗蛋';
    }
    f2(o2);
    console.log(o1);
    console.log(o2);
  </script>
</html>

 

 

3.复习逻辑运算

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
    /* 
    作用:
        运算逻辑 连接条件表达式,得到逻辑结果(true,false)
        && || !

        &&
        两边都为true的时候 得到才是true
        
        ||
        一边为true,得到结果就是true

        ! 取反 if(flag===false)   => if(!flag)


    短路机制:

    代码1 && 代码2

    代码1 || 代码2
    
    短路运算事实上也是逻辑运算 根据逻辑运算的执行过程分析即可


    优先级 

    ! > && > ||

    (a||b) && c === c && a || b

    a|| b && c
     */
</script>
</html>

 

4.对象

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <div id="box"></div>
  </body>
  <script>
    /* 
    三个角度来学习方法
    1:是什么
    2:有什么用
    3.怎么用
    
    对象 
        本质: 无序数据的集合
            数据
                属性
                方法
    
    有什么用:
        1.存储一些复杂结构的数据
        2.封装方法
    
    如何使用:
        1.找对象
            1.1 有些是人家已经提供给我们的(内置对象/BOM对象/DOM对象/Jq对象)
            1.2  还有一些自己创建的 
                var obj ={}
                var obj = new Object()
        
        2.使用对象的属性和方法:
             2.1如果使用人家的对象,直接用过 键 去访问
                键---属性名 --- 本质就是个字符串

                对象.属性名
                对象[属性名]

                对象.方法名([参数])
                对象['方法名'](参数)

            2.2 {name : ''}  obj.name = ''

    
     */
    var obj = {
      name: "任君爽",
    };
    obj.sayHi = function () {
      console.log("哈哈哈哈哈");
      console.log(this.name);
    };
    console.log(obj);
    obj.sayHi();

    // 拓展:函数事实上也是一种数据类型
    var num = 123;
    var fn = function aa() {};
    console.log(typeof num);
    console.log(typeof fn);
    // 语法糖---------能够简单快速实现效果的语法

    // 对象的  in  关键字
    var obj = { name: "包拯" };
    // 想要知道某个对象身上是否支持这个属性或者方法
    // obj.age = 20;
    // console.log('age' in obj);

    /*   兼容注册事件 
    addEventListener attachEvent
    判断当前的浏览器是否支持该方法 如果支持就使用 要不支持就是用另外一个 */
    var box = document.getElementById("box");
  /*   if (box.addEventListener) {
      //当前浏览器支持
      console.log(123);
    } else if (box.attachEvent) {
      console.log(456);
    } */

    if('addEventListener' in box){
        console.log(123);
    }

    // in通常还配合 for in  遍历对象的可遍历的属性 
  </script>
</html>

 

5.调试篇

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <button id="btn">按钮</button>
  </body>
  <script>
    // 代码调错的步骤
    /* 
    1.如果自己的代码运行没有效果或者不是自己想要的效果,千万别直接回头查看代码.先打开控制台 console  
    如果说有报错 ---解决报错
    要是没有报错 ->跳转到第二步

    2.需要断点调试
      Sources
        哪里不对点哪里

    3.根据你自己想要以及展示的效果(推理)
     */

    /* debugger  当代码执行到这一行的时候就会停止*/
    //  console.log(456);
    //  console.log(456);
    //  debugger
    //  console.log(456);
    function fn() {
      console.log(123);
      console.log(123);
      console.log(123);
      console.log(123);
      console.log(123);
      console.log(123);
    }

    document.getElementById("btn").onclick = function () {
      console.log("兽人永不为奴");
      console.log("兽人永不为奴");
      console.log("兽人永不为奴");
      console.log("兽人永不为奴");
     
      console.log("兽人永不为奴");
      console.log("兽人永不为奴");
      fn(); 
      console.log("兽人永不为奴");
      console.log("兽人永不为奴");
      console.log("兽人永不为奴");
      console.log("兽人永不为奴");
      console.log("兽人永不为奴");
      console.log("兽人永不为奴");
    };
  </script>
</html>

 

6.封装

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
    /* 
        封装:
            -函数封装
                把一串代码,放到一个函数,可以重复使用
            
            对象的封装
                面向对象的思想

        面向对象的思想
            --吃烤鸭
            面向过程化
            1.买一只小鸭
            2.买饲料
            3.养大
            4.杀鸭
            5.褪毛
            6.收拾鸭子的尸体
            7.买个烤箱
            8.把鸭子放里面
            9,等待鸭子被烤熟
            10.配菜+吃鸭子

            关注过程,任何的步骤都需要自己仔仔细细的处理

            面向对象化
            拿钱去市场买一个烤鸭

            注重结果,找对象 指挥对象去做事情


            怎么做:
                1.找 对的 对象
                    --系统自带的
                    --自定义的
                2.调用对象的属性和方法实现效果
     */
</script>
</html>

 

7.面向对象

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
    /* 
    面向对象:
        1.找到对的对象
        2.调用里面的属性和方法
    
    特征:
        封装 -封- 密封起来 不让外部知道里面实现的过程
        继承 -继承-  子类具有父类的特征(属性) 和方法 代码重用
        多态 -具有表现为多种形态的能力-
     */
</script>
</html>

 

 

8.dom操作

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body></body>
  <script>
    // 面向过程化代码 实现添加样式的div  难以维护
    // 1.动态创建多个div
    for (var i = 0; i < 3; i++) {
      var div = document.createElement("div");
      // 2.修改宽度,高度,背景颜色
      div.style.width = "200px";
      div.style.height = "200px";
      div.style.backgroundColor = "tomato";

      // xxx.style.xxx = 'xxx'
      // 3.追加到页面
      document.body.appendChild(div);
    }
  </script>
</html>

 

9.函数封装DOM

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body></body>
  <script>
    // 1.先封装一个可以生辰个指定元素的函数
    function create(tag) {
      return document.createElement(tag);
    }

    // 2.封装一个可以修改css样式的方法
    function css(element, name, value) {
      element.style[name] = value;
    }

    for (var i = 0; i < 3; i++) {
      var div = create("div"); //
      css(div, "width", "100px");
      css(div, "height", "100px");
      css(div, "backgroundColor", "pink");
      document.body.appendChild(div);
    }
  </script>
</html>

 

10.dom封装2

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body></body>
  <script>
    // 1.先封装一个可以生辰个指定元素的函数
    function create(tag) {
      return document.createElement(tag);
    }

    // 2.封装一个可以修改css样式的方法 参数1 元素 参数2 对象
    function css(element, options) {
      for (var key in options) {
        //console.log(key + "-----------" + options[key]); //属性

        element.style[key] = options[key];
      }
    }

    for (var i = 0; i < 3; i++) {
      var div = create("div"); //
      css(div, {
        width: "100px",
        height: "100px",
        backgroundColor: "tomato",
      });
      document.body.appendChild(div);
  
    }
  </script>
</html>

 

11.面向对象封装体验

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body></body>
  <script>
    //初体验 使用对象封装的好处 : 隔绝别人的代码污染
    // 声明一个叫 $ 的对象
    var $ = {
      create: function (tag) {
        return document.createElement(tag);
      },
      css: function (element, options) {
        for (var key in options) {
          element.style[key] = options[key];
        }
      },
      append: function (parent, child) {
        parent.appendChild(child);
      },
    };

    for (var i = 0; i < 3; i++) {
      var div = $.create("div");
      $.css(div, {
        width: "150px",
        height: "150px",
        background: "green",
      });
      $.append(document.body,div)
    }
  </script>
</html>

 

12.构造函数

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body></body>
  <script>
    /* 
    
    构造函数:
            是什么? 本质就是一个函数
            干嘛用的? 用来批量创建对象的 --封装代码的
            怎么用?
            function 对象名(属性){
                this.属性名 = 值
                this.方法名 = function(){

                }
            }
    
     */

    //  创建两个人对象
    // 面向对象的代码书写的时候 要考虑有哪些属性和方法
    // 一个叫王德发
    // 一个叫翠花

    // var wtf = {
    //   name: "王德发",
    //   age: 20,
    //   sex: "男",
    //   say: function () {
    //     alert("hey girl");
    //   },
    // };

    // var ch = {
    //   name: "翠花",
    //   age: 18,
    //   sex: "女",
    //   say: function () {
    //     alert("上酸菜");
    //   },
    // };
    // console.log(wtf);
    // console.log(ch);
    // 工厂函数 --详见基础09
    // function createPerson(name, age, sex) {
    //   var person = {
    //     name: name,
    //     age: age,
    //     sex: sex,
    //   };
    //   return person;
    // }
    // var js = createPerson("剑圣", 18, "男");
    // var jax = createPerson("贾克斯", 20, "女");
    // console.log(js);
    // console.log(jax);

    // 构造函数也略显复杂,我们使用构造函数
    function Person(name, sex, lines) {
      this.name = name;
      this.sex = sex;
      this.lines = lines;
      this.sayHi = function () {
        console.log("敌军还有30秒到达战场,碾碎他们");
      };
    }
    var jj = new Person("菲奥娜", "女", "锐利的剑锐利的眼");
    var cstn = new Person("崔丝塔娜", "女", "我好像射点什么");
    console.log(jj);

    function Guaishou(name, sex, lines) {
      this.name = name;
      this.sex = sex;
      this.lines = lines;
      this.sayHi = function () {
        console.log("打倒奥特曼.夺奥特之母");
      };
    }
    // 好处就是能看着这种对象是什么类型
    var hsgn = new Guaishou("火山怪鸟");
    console.log(hsgn);
  </script>
</html>

 

 

13,使用构造函数封装代码

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <div id="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
  </body>
  <script>
    // for(var i= 0;i<3;i++){
    //     var div = $('div');
    //     div.css({
    //         width:100
    //     })
    // $('body').append(div)
    // }

    /*
    功能:
    1.创建元素
    2.改样式
    3.获取元素
    4.追加子元素
     */
    /* 面向对象首先需要考虑的是

     1.有什么对象

        自己创建自己的jq对象
        jq对象事实上就是伪数组 伪数组可以调用很多的方法

      */

    function MyJqObj(selector) {
      var res = document.querySelectorAll(selector);
      for (var i = 0; i < res.length; i++) {
        //当前要被添加 修改样式的元素  this[i]
        this[i] = res[i];
      }
      //要被修改元素的长度
      this.length = res.length;

      //封装一个可以一次性修改css样式的方法 方法名css
      this.css = function (opt) {
        for (var i = 0; i < this.length; i++) {
          for (var key in opt) {
            this[i].style[key] = opt[key];
          }
        }
      };
    }

    function $(selector) {
      //调用我们自定义的MyJqObj
      return new MyJqObj(selector);
    }
    //=================写法和jq一模一样===============================
    var box = $(".box");
    box.css({
      width: "100px",
      height: "50px",
      backgroundColor: "green",
    });
  </script>
</html>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值