1.什么是闭包?应用场景


    闭包就是函数嵌套函数的特殊形式:1.函数作为参数被传入
                       2.函数作为返回值被返回

    闭包其实也是自由变量的特殊表现形式:1.自由变量:没有在当前作用域声明的变量
                              2.自由变量的值和作用域是在函数定义的时候去欸的那个,不是在函数执行的时候确定

    优点:1.可以变量私有化,避免变量的全局污染
               2.自由变量值,存储在内存中不会被销毁

    应用场景:1.封装组件,插件库的时候避免变量全局污染
          2.创造局部作用域变量,类似于let效果


2.如何实现继承


    1.构造函数绑定:使用 call 或 apply 方法,将父对象的构造函数绑定在子对象上
         functionA(name){this.name=name}
         functionB(name,age){
            A.call(this.age)
            this.age = age;
        }
        B.prototype = Object.create(A.prototype)
        B.prototype.constructor =  B

    2.实例继承:将子对象的 prototype 指向父对象的一个实例
    3.拷贝继承:如果把父对象的所有属性和方法,拷贝进子对象
    4.原型继承:将子对象的 prototype 指向父对象的 prototype
    5.ES6 语法糖 extends:class ColorPoint extends Point {}


3.原型与原型链应用场景

    每一个对象都有一个隐式原型__proto__
    每一个构造函数都有一个显示原型__prototype__
    对象实例的隐式原型等同于,创建该对象的构造函数的显示原型prototype
    当查找一个对象的方法和属性,先在自身对象属性上查找,找不到,则沿着隐式原型__proto__向上查找,(__proto__.__proto__)
    Object.prototype.__proto__ 结果为null

 应用场景:
    1.实现继承
    2.创建实例的公共方法:Vue.__prototype__.$http = axios
    

4. 实现深拷贝

1.什么是闭包?应用场景
    闭包就是函数嵌套函数的特殊形式:1.函数作为参数被传入
                       2.函数作为返回值被返回

    闭包其实也是自由变量的特殊表现形式:1.自由变量:没有在当前作用域声明的变量
                              2.自由变量的值和作用域是在函数定义的时候去欸的那个,不是在函数执行的时候确定

    优点:1.可以变量私有化,避免变量的全局污染
               2.自由变量值,存储在内存中不会被销毁

    应用场景:1.封装组件,插件库的时候避免变量全局污染
          2.创造局部作用域变量,类似于let效果


2.如何实现继承


    1.构造函数绑定:使用 call 或 apply 方法,将父对象的构造函数绑定在子对象上
         functionA(name){this.name=name}
         functionB(name,age){
            A.call(this.age)
            this.age = age;
        }
        B.prototype = Object.create(A.prototype)
        B.prototype.constructor =  B

    2.实例继承:将子对象的 prototype 指向父对象的一个实例
    3.拷贝继承:如果把父对象的所有属性和方法,拷贝进子对象
    4.原型继承:将子对象的 prototype 指向父对象的 prototype
    5.ES6 语法糖 extends:class ColorPoint extends Point {}


3.原型与原型链应用场景

    每一个对象都有一个隐式原型__proto__
    每一个构造函数都有一个显示原型__prototype__
    对象实例的隐式原型等同于,创建该对象的构造函数的显示原型prototype
    当查找一个对象的方法和属性,先在自身对象属性上查找,找不到,则沿着隐式原型__proto__向上查找,(__proto__.__proto__)
    Object.prototype.__proto__ 结果为null

 应用场景:
    1.实现继承
    2.创建实例的公共方法:Vue.__prototype__.$http = axios
    

4. 实现深拷贝

1.什么是闭包?应用场景
    闭包就是函数嵌套函数的特殊形式:1.函数作为参数被传入
                       2.函数作为返回值被返回

    闭包其实也是自由变量的特殊表现形式:1.自由变量:没有在当前作用域声明的变量
                              2.自由变量的值和作用域是在函数定义的时候去欸的那个,不是在函数执行的时候确定

    优点:1.可以变量私有化,避免变量的全局污染
               2.自由变量值,存储在内存中不会被销毁

    应用场景:1.封装组件,插件库的时候避免变量全局污染
          2.创造局部作用域变量,类似于let效果


2.如何实现继承


    1.构造函数绑定:使用 call 或 apply 方法,将父对象的构造函数绑定在子对象上
         functionA(name){this.name=name}
         functionB(name,age){
            A.call(this.age)
            this.age = age;
        }
        B.prototype = Object.create(A.prototype)
        B.prototype.constructor =  B

    2.实例继承:将子对象的 prototype 指向父对象的一个实例
    3.拷贝继承:如果把父对象的所有属性和方法,拷贝进子对象
    4.原型继承:将子对象的 prototype 指向父对象的 prototype
    5.ES6 语法糖 extends:class ColorPoint extends Point {}


3.原型与原型链应用场景

    每一个对象都有一个隐式原型__proto__
    每一个构造函数都有一个显示原型__prototype__
    对象实例的隐式原型等同于,创建该对象的构造函数的显示原型prototype
    当查找一个对象的方法和属性,先在自身对象属性上查找,找不到,则沿着隐式原型__proto__向上查找,(__proto__.__proto__)
    Object.prototype.__proto__ 结果为null

 应用场景:
    1.实现继承
    2.创建实例的公共方法:Vue.__prototype__.$http = axios
    

4. 实现深拷贝

通过jQuery的extend方法

通过 JSON 对象

函数库lodash的_.cloneDeep方法

递归的方式

5. js事件流    


    冒泡流(默认) :1.最具体的元素先触发事件,一次向上冒泡式的传递
                  2.e.stopPropogation() 阻止时间冒泡流
                3.e.preventDefault() 阻止默认事件
    捕获流 :最大元素捕获到时间,然后传递个最具体的元素
                   element.addEventListener(callbacak,false)


6. 数组去重


    1.es6 中的set
    2.遍历去重
            fliter   :  当前的index与indexOf(elem)的值不一致去重
            对象key唯一  :用一个临时对象吧数组的值,当key存储在对象中,如果对象上已经有key值,说明数组的值是重的 

7.异步同步


    异步:向服务器发送请求,必须等请求到内容,才能刷新页面,用户才能看到新内容
    同步:向服务器发送请求,这时可以做其他事情,内容请求到时,用户不用刷新页面,也可以看到新内容

8. ajax
    异步的javaScript和xml
    核心对象:XMLHTTPRequest(xhr)
    通过xhr 与后端扶额u交换数据,通过 js 实现无刷新更新页面
    优点  :无刷新更新页面,实现各种懒加载,异步加载,提供首屏渲染速度
    缺点  :由于内容是动态加载的,SEO搜索引擎 不友好
    常见库  :JQuery.$ajax
        axios : 不依赖任何DOM,
                      服务端(nodejs)
                      能够创建实例二次封装
                      能对请求创建实例二次封装

9. 跨域和jsonp
    跨域考虑到安全问题,有同源策略
    所谓同源策略,就是“端口,域名,协议”三者一致,就算有两个相同的域名访问统一IP地址,也非同源
    如果“端口,域名,协议”三者内有一者不相同,就称为跨域    

    jsonp是解决跨域问题的一种方法,jsonp是利用<script>标签没有同源限制,直接发送给服务器,可以返回带有callback参数的回调函数


10. promise
    1.  ES6 新增方法:解决异步操作,回调函数层级过深的问题(回调地狱)
    2.  Promise.race()  : 多个promise请求返回最快的一个
    3.  Promise.all()  : 等多个promise都执行并返回时,才执行then
    4.  Promise.reject()  : 抛出错误
    5.  Promise状态一旦确定就不会更改  : 
    var p = new Promise( (resolve,reject)=>{
            // reject(xxx)
            // resolve(xxx)
        } )
    p.then( (res)=>{ })
    .catch(err=>{ })

11. this指向问题
    1.  全局 window :script 
                 setInterval.setTimeout
    2.  对象 指对象本身 
    3.  构造函数的实例
    4.  class类的实例
    5.  箭头函数 指向上一层作用域this
    6.  函数 函数的直接调者
    7.  call.apply.bind 指向第一个参数
 

12. 对象类型判断
    typeof    
        值类型    :string number boolean undefined null symbol 
        引用类型  :function array object 

    instance of
    constructor
    Object.prototype.toString.call() 最准
13. 堆与栈

14.浏览器的渲染过程
    1.  解析 HTML 构建 DOM(DOM 树)
    2.  CSS 文件下载完成,开始构建 CSSOM(CSS 树)
    3.  合并dom和css树,生成 渲染树
    4.  渲染页面

    
      在地址输入一个地址 按回车 :
    1. 查找IP  
        a.  浏览器缓存
        b.  host文件
        c.  本地缓存
        d.  dns服务器向上查询 找到域名对应的 IP 为止
    2. 得到响应数据 :  三次握手  四次挥手 建立连接,下载html,根据 html 下载其他资源

15.前端性能优化

    1.  减少 http 请求和大小     (压缩与合并)+ base64 图片
    2.  优化首屏的渲染速度    (css放前面,js放后面,避免错误,只加载首屏的必要资源)
    3.  按需加载,懒加载,预加载   (js,css,图片,页面,按需 懒 预加载)
    4.  让加载更快           启用 CDN ,开启gzip,缓存
         
    

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐