前端

165 阅读5分钟

MarkDown使用手册

  • 加粗: Ctrl/Cmd + B

  • 标题: Ctrl/Cmd + H

  • 插入链接: Ctrl/Cmd + K

  • 插入代码: Ctrl/Cmd + Shift + C

  • 行内代码: Ctrl/Cmd + Shift + K

  • 插入图片: Ctrl/Cmd + Shift + I

  • 无序列表: Ctrl/Cmd + Shift + L

  • 撤销: Ctrl/Cmd + Z

HTML笔记

CSS笔记

JavaScript笔记

* 1.事件对象
    `{
       var event = event || window.event
    }`
* 2.封装兼容性取消冒泡方法
    `{
        function stopBubble(event){
            var event = event || window.event
            if(event.preventDefault){
                event.preventDefault()
            }else{
                event.returnValue = false
            }
        }
    }`
* 3.拖拽方法
    `{
        function drag(elem){
            var disX;
                disY;
            elem.addEventListener("mousedown",function(e){
                var event = e || window.event;
                disX = event.clientX - parseInt(getStyle(elem,"left"))
                disY = event.clientY - parseInt(getStyle(elem,"top"))
                document.addEventListener("mousemove",mouseMove,false)
                document.addEventListener("mouseup",mouseUp,false)
                stopBubble(event)
                cancelHndler(event)
            },false)
            
            function mouseMove(e){
                var event = e || window.event;
                elem.style.left = event.clientX - disX + "px"
                elem.style.top = event.clientY - disY + "px"
            }
            function mouseUp(e){
                var event = || window.event
                document.removeEventListener("moussemove",mouseMove,false)
                document.removeEventListener("mouseup",mouseUp,false)
            }
            
        }
    }
    `
* 4. javascript数据类型
        基本类型:
            1.Number
            2.String
            3.undefined
            4.Boolean
            5.null(空对象引用)
            6.symbol
        引用类型:
            1.Object(Array Function )
    
* 5. 预编译前奏
        暗示全局变量:即任何变量,如果变量未经声明就赋值,此变量就为全局对象所有
                      a=10 ----> window.a = 10
                      function test(){
                          var a = b = 123
                      }
        预编译四部曲:
            1.创建AO对象
            2.找形参和变量声明,将变量和形参名作为AO属性名,值为Undefined
            3.将实参值和形参统一
            4.在函数体里面找函数声明,值赋予函数体
        例子:`function fn(a){
                console.log(a)
                var a = 123;
                console.log(a)
                function a(){}
                console.log(a)
                var b= function (){}
                console.log(b)
                function d(){}
              }
             fn(1)   
             
             AO{
                 a:undefined 1 function a(){} 123 123
                 b:undefined  function(){}
                 d:function(){}
             }
        `
* 6.闭包

    `function a(){
        var num = 100;
        function b(){
            num++;
            console.log(num)
        }
    }`
    var demo = a()
    demo() 此时a的执行期上下文已被销毁
    demo()
    aA0 {num:100->101->102}
    
    `function test(){
        var arr = []
        for(var i =0;i<10;i++){
            arr[i] = function() {
                document.write(i+"")
            }
        }
        return arr
    }`
    var myArr = test()
    for(var j= 0 ;j<10;j++){
        myArr[j]()
    } //10 10 10 10 10 10 ....
    
    `function test(){
        var arr = []
        for(var i = 0;i<10;i++){
            (function(j){
                arr[j] = function(){
                    document.write(j+"")
                }
            }(i))
        }
        return arr
    }`
    var myArr = test()
    for(var j= 0 ;j<10;j++){
        myArr[j]()
    }
闭包现象:
    当内部函数被保存到外部时,将会生成闭包。闭包会导致原有作用域链不释放,造成
    内存泄漏
闭包应用:
    1.实现公有变量
        eg:含税累加器
        
          `function add(){
              var count = 0;
              function demo(){
                count++;
                console.log(count)
                }
            }`
            var counter = add()
            counter()
            counter()
            counter()
            
           `function test(){
               var num = 100;
               function a(){
                 num++;
                 console.log(num)
                }
                function b(){
                 num--;
                 console.log(num)
                }
                 return [a,b]
              }`
              var myArr = test()
              myArr[0]()
              myArr[1]()
    2.可以做缓存(存储结构)
            eg:eater
            `function eater(){
                var food = ""
                var obj = {
                    eat:function(){
                        console.log("i am eating"+food)
                        food = ""
                    },
                    push:function(myFood){
                        food = myFood
                    }
                }
                return obj
            }`
            var eater1 = eater()
            eater1.push('banana')
            eater1.eat()
    3.可以实现封装,属性私有化
            eg:Person()
    4.模块化开发,防止污染全局变量

*7.立即执行函数
    针对初始化功能的函数
        (function(){
           var a = 123;
           var b = 234;
           console.log(a+b)
        }())
        
        var num = (function(a,b,c){
            var d= a + b + c * 2 - 2
            return d
        }(1,2,3))

*8. 原型
    1.定义:
        1.1:原型是function对象的一个属性,它定义了构造函数制造出的对象的公共祖先,可以继承该原型的属性和方法.原型也是对象
        1.2:利用原型特点和概念,可以提取共有属性
        1.3:对象如何查看原型 ->隐式属性__proto__
        1.4:对象如何查看对象的构造函数->constructor
        
    2.案例:
       //Person.prototype = {} 是祖先
       
       Person.prototype.name = "hehe"
       function Person(){
           
       }
       var person = new Person()
    3.继承
        Person.prototype.name = "abc"
        function Person(){
            <!--var this = {
                __proto__ :Person.prototype
            }-->
        }
        var obj = {
            name:"sunny"
        }
        var person = new Person()
        更改原型:person.__proto__ = obj
        
        
        Person.prototype.name = "sunny"
        function Person(){
            //var this = {__proto__:Person.prototype}
        }
        var person = new Person()
        Person.prototype = {
            name:"cherry"
        }
        person.name ->sunny 
        
        
        
        Person.prototype.name = "sunny"
        function Person(){
            
        }
        Person.prototype = {
            name:"cherry"
        }
        var person = new Person()
        
    4.原型链(原型上面加原型加原型形成链)
        Grand.prototype.__proto__ = Object.prototype(所有对象的最终原型)
        Grand.prototype.lastName = "Deng"
        function Grand(){
            
        }
        var grand = new Grand()
        
        Father.prototype = grand 
        可以理解为原本 grand.__proto__ = Grand.prototype
        你现在Father.prototype = grand
        也就是说 Father.prototype.__proto__ = Grand.prototype
        function Father(){
            this.name = "xuming"
        }
        var father  = new Father()
        
        Son.prototype = father
        function Son(){
            this.hobbit = "smoke"
        }
        var son = new Son()
        
        
        Person.prototype = {
            height:100
        }
        function Person(){
            this.eat = function(){
                this.height++
            }
        }
        var person = new Person()
        person.eat() 
       person            {height:101}  
       person.__proto__  Object{height:100}

*9. call and apply
    function Person(name,age){
        this.name = name;
        this.age = age;
    }
    var person = new Person('deng',100)
    var obj = {}
    Person.call(obj)---> 会让Person里所有预设的this指向obj
10.继承
    继承发展史
        1.传统形式 ->原型链
            过多的继承了没用的属性
        2.借用构造函数
            不能继承借用构造函数的原型
            每次构造函数都要多走一个函数
        3.共享原型
            不能随便改动自己的原型
        4.圣杯模式
        
        圣杯模式:
            function inherit(Target,Origin){
                function F(){}
                F.prototype = Origin.prototype
                Target.prototype = new F()
                Target.prototype.constructor = Target
                Target.prototype.uber = Origin.prototype 
            }
            Father.prototype.lastName = "Deng"
            function Father(){
                
            }
            function Son(){
                
            }
            inherit(Son,Father)
            var son = new Son()
            var father = new Father()
    

*11.命名空间
    var init = (function() {
        var name = "abc"
        function callName(){
            console.log(name)
        }
        return function(){
            callName()
        }
    }())
    init()
    
    var initDeng = (function() {
         var name = 123
         function callName(){
             console.log(name)
         }
         return function(){
             callName()
         }
         
    }())
    
    
    var obj = {
        age:123,
        sex:"male",
        height:180,
        weight:75,
        __proto__:{
            lastName:"deng"
        }
    }
    for(var prop in obj){
        console.log(obj.prop) //不对 会被转换成 obj['prop']
    }
    Object.prototype.abc = '123'
    
    for(var prop in obj){
        if(! obj.hasOwnProperty(prop)){
            console.log(obj[prop]) deng 123
        }
    }
    
    instanceof 关键字
    function Person(){
        
    }
    var person = new Person()
    A对象 是不是 B 构造函数构造出来的
    
    看A对象的原型链上  有没有B的原型
    
    A instanceof B
    
    person instanceof Person  true
    person instanceof Object  true
    [] instanceof Array       true
    [] instanceof Object      true
    
    typeof([])   object
    typeof({})   object
    
    判断数组还是对象
        [].constructor                      function Array(){}
        var obj = {}     obj.constructor    function Object(){}
    
        [].instanceof Array     true
        obj.instanceof Array    false
    
        Object.prototype.toString.call([])  this变为数组   [object Array]
        Object.prototype.toString.call({})  this变为对象   [object Object]
        
        
        
        Object.prototype.toString = function(){
            识别 this 
            返回相应的结果
        }
        
*12. 克隆
    浅克隆 vs 深度克隆
    
    var obj = {
        name:"abc",
        age:123,
        card:['visa','master'],
        wife:{
            name:"bcd",
            son:{
                name:"aaa"
            }
        }
    }
    
    var obj1 = {
        
    }
    
    //1.判断是不是原始值  typeof() object
    //2.判断是数组还是对象  
    //3.建立相应的数组或对象
    function deepClone(origin,target){
        var target = target || {},
            toStr = Object.prototype.toString,
            arrStr = "[object Array]"
        for(var prop in origin){
            if(origin.hasOwnProperty(prop)){
                if(orgin[prop]!=="null"&&typeof(origin[prop]) == 'object'){
                    if(toStr.call(origin[prop]) == arrStr){
                        target[prop] = []
                    }else{
                        target[prop] = {}
                    }
                    deepClone(origin[prop],target[prop])
                }else{
                    target[prop] = origin[[prop]
                }
            }
        }
        
        return target 
            
        
    }

Ajax笔记

jQuery笔记

Vue笔记

React笔记