ES6相关

作者: 我叫Aliya但是被占用了 | 来源:发表于2019-06-20 01:06 被阅读0次

    关于变量提升

    • var 创建、初始化 被提升
    • let、const 创建 被提升
    • function 创建、初始化、赋值 都被提升
    • const 如果是引用类型,貌似(常量功能)无效
    function aa () {
        console.info('a', a)  // undefined
        var a = 1
        console.info('c', c)  // function c
        function c () {}
        console.info('b', b)  // 报错
        let b = 2
    }
    

    WeakMap、Map、Set

    • Set:不可重复的数组
    • Map:Dictionary<>
    • WeakMap: key必须是对象(的弱引用),key不可枚举(没有keys方法)。官方文档的说法是:

    原生的 WeakMap 持有的是每个键或值对象的“弱引用”,这意味着在没有其他引用存在时垃圾回收能正确进行。               -- WeakMap

    关于Symbol

    Symbol 基本数据类型 string number boolean null undefined object
    Symbol 用来定义(标识)唯一常量,比如 Symbol('deleted')
    Symbol('deleted') != Symbol('deleted')
    Symbol.for('passed') == Symbol.for('passed') passed有取值,没有创建
    他们说定义一个let sb = Symbol('deleted') 用来当作对象属性的Key,且这个key不可被便利,so,有什么用呢

    proxy reflect 代理和反射

    // 对象深度监控
    function objectWatcher (obj) {
        for (let key in obj) {
            let val = obj[key]
            Object.defineProperty(obj, key, {
                enumerable:true,        // 是否可枚举的
                configurable:true,  // 是否可删除
                // writable:true,       // 是否可修改
                // value:'1'
                get () { return val },
                set (value) { val = value; console.log('change', key, val) }
            });
            if (typeof val == 'object') { 
                objectWatcher(obj[key])
            }
        }
    }
    var json = { obj: { name: 'json'}, arr: [1,[2,3],5,[6]] }
    objectWatcher(json)
    json.obj.name = 'haha'
    json.arr[1] = 99
    

    使用proxy可以轻松实现上功能。兼容性的话,一般吧

    let handler = {
        get (target,key) { 
            if (typeof target[key] == 'object') { 
              return    new Proxy(target[key], handler)
            }
            return Reflect.get(target,key); 
        },
        set (target,key,value) {
            console.log('change', key, value)
            return Reflect.set(target,key,value); // proxy reflect 都是es6
        },
    }
    var json = { obj: { name: 'json'}, arr: [1,[2,3],5,[6]] }
    var prox = new Proxy(json, handler)
    prox.obj.name = 'proxy'
    

    ES6静态模块

    执行前检查

    • export 可以写多个,只能导出变量
    • export.default 可以导出常量
    • import 进来不可再赋值,会根据源文件值的改变而改变
    • import xxx 不包含default
    • import * 包含default
    • import _ 即default

    Class

    • 可以使用 get xx () {} set xx () {} 实现实体类;
    • 实体属性是原型上的
    • 实体属性不可枚举
    • 抽象类判断:if (new.target == 本类) throw new Error('抽象类不可创建实例')
    • 实例._proto_ == 父.prototype
    • extends原理基于_proto_ => 对象._proto_ == 父
    • 继承必须super() => father.call(this)
    • 有装饰器概念 @装饰器名
      es7提案,chrome74 on mac还不支持
      有多个装饰器,以驼峰式执行 => 外层先于class执行,内层从下向上执行
    • 可以有私有属性 #xxx;也是提案
    class SuperClass {
        constructor () {
            this.name = 'SuperClass'
        }
    }
    let father = new SuperClass()
    // console.info(Object.setPrototypeOf(father.prototype, SuperClass.prototype))
    console.log(father.__proto__ === SuperClass.prototype)  // true
    console.log(
        father.hasOwnProperty('prototype'), // false
        father.hasOwnProperty('constructor'), // false
        father.__proto__.hasOwnProperty('constructor') // true
    )
    console.log(father.__proto__.constructor == SuperClass.prototype.constructor) // true
    
    class SubClass extends SuperClass {
        constructor () {
            super()
            this.age = 'so rude'
        }
    }
    let son = new SubClass()
    console.log(SubClass.__proto__ === SuperClass) // true
    console.log(son.hasOwnProperty('name')) // true
    

    Event Loop

    • 作用域是声明时创建的
    let a = 10
    {
      console.log(a)  // undefined
      let a = 4
    }
    
    • 宏任务:setTimeout、MessageChannel
    • 微任务:then、mutationObserver

    数组

    组合函数 compose reduceRight

    let fn1 = msg => { console.log('fun1 from', msg); return 'fun1'; }
    let fn2 = msg => { console.log('fun2 from', msg); return 'fun2'; }
    let fn3 = msg => { console.log('fun3 from', msg); return 'fun3'; }
    let zuheFn = (...fns) => (msg) => fns.reduceRight((msg, fn) => fn(msg), msg)
    zuheFn(fn3, fn2, fn1)('haha')
    

    模板引擎 ejs 的实现 with new Function

    ejs使用方法

    var people = ['geddy', 'neil', 'alex'],
        html = ejs.render('<%= people.join(", ") %>', {people: people});
    

    逻辑:

    1. 将ejs模板中的<%等标识改为`,以组成字符串
    2. 使用with包裹字符串,以便ejs中的变量调用
    3. 使用new Function 将字符串执行
    let fs = require('fs')
    fs.readFile('./helper.ejs', 'utf8', function (error, res) {
        let html = render(res, { title: '假的ejs', list: ['第一项', '第二项'] })
        console.info(html)
    })
     
    let render = function (htmlstr, data) {
        htmlstr = "`" + htmlstr
            .replace(/\<\%\=([^%]+)\%\>/g, "` + $1 + `")
            .replace(/\<\%([^%]+)\%\>/g, "`; $1 html+= `")
            + "`";                           // `` + people.join(", ") + ``
        htmlstr = `with (data) {
            var html = ${htmlstr}
            return html
        }`                                    // var html = `` + people.join(", ") + ``
        let handlerStrFn = new Function('data', htmlstr)
        return handlerStrFn(data)
    }
    

    .
    .
    .
    .
    left knowledge points for me
    MessageChannel、mutationObserver、serviceWork、workBox
    VO(全局)AO(函数执行时 VO -> AO,并且将上级作用域链和AO对象进行拼接)
    .

    相关文章

      网友评论

          本文标题:ES6相关

          本文链接:https://www.haomeiwen.com/subject/laanfctx.html