ES6基础

作者: X_y_bfc1 | 来源:发表于2020-03-01 21:28 被阅读0次
    var 和 let 的区别
    var 只是声明一个变量,可以是局部也可以是全局
    let 只是局部变量,没有变量提升,没有预处理机制
    暂时性死区 
        只要块级作用域存在let命令,它所声明的变量就绑定在这个区域,不再受外部影响
        
    let 不允许重复声明 模块内部不允许,各模块之间可以
    
    块级作用域
    ES5只有全局作用域和函数作用域
    第一种场景 内层变量会覆盖外层变量
        var time = new Date()
        function fun() {
            console.log(time) // 未定义
            if (false) {
                var time = '2020'
            }
        }
        fun()  
        这种情况就是time 会优先选择模块内部的变量来使用
        
    第二种场景 变量使用完,并没有及时释放内存,提升为全局变量
        var string = "hello world";
        for(var i=0;i<string.length;i++){
            console.log(string[i]);
        }
        console.log('finished')
        console.log(i)  //i=12,i并没有释放
        
        
    ES6就新增了块级作用域 是let自己生成的
        function fun() {
            let num = 200;
            if(true){
                let num = 300;
            }
            console.log(num);
        }
        fun() //打印出200 如果是var 就打印出
    
    const 生成的常量
    const也存在块级作用域 也有暂时性死区 也不可重复声明
    
    const 声明的对象和数组  都是只读
    
    const对象冻结
        const obj = Object.freeze()
        obj.name = 'xx';
        obj.age = 30;
        console.log(obj.name);  // undefined
        console.log(obj.age);   //undefined
        console.log(obj);     //Object
        
        
        第二种
        const obj = Object.freeze({
            obj.name:'xx',
            obj.age:30;
        })
       
        console.log(obj.name);  // xx
        console.log(obj.age);   //30
        console.log(obj);     //Object
    
    立即执行函数
    (function () {}() )
    
    ES6的结构赋值
        数组解构:
            let [a, b, c] = [1, 2, 3] // a=1, b=2, c=3
            let [d, [e], f] = [1, [2], 3] // 嵌套数组解构 d=1, e=2, f=3
            let [g, ...h] = [1, 2, 3] // 数组拆分 g=1, h=[2, 3]
            let [i,,j] = [1, 2, 3] // 不连续解构 i=1, j=3
            let [k,l] = [1, 2, 3] // 不完全解构 k=1, l=2
        
        对象解构:
            let {a, b} = {a: 'aaaa', b: 'bbbb'} // a='aaaa' b='bbbb'
            let obj = {d: 'aaaa', e: {f: 'bbbb'}}
            let {d, e:{f}} = obj // 嵌套解构 d='aaaa' f='bbbb'
            let g;
            (g = {g: 'aaaa'}) // 以声明变量解构 g='aaaa'
            let [h, i, j, k] = 'nice' // 字符串解构 h='n' i='i' j='c' k='e'
        
        变量赋值ES5
            var data = {userName: 'aaaa', password: 123456}
            var userName = data.userName
            var password = data.password
            console.log(userName)
            console.log(password)
            var data1 = ['aaaa', 123456]
            var userName1 = data1[0]
            var password1 = data1[1]
            console.log(userName1)
            console.log(password1)
         
        变量赋值ES6
            const {userName, password} = {userName: 'aaaa', password: 123456}
            console.log(userName)
            console.log(password)
            const [userName1, password1] = ['aaaa', 123456]
            console.log(userName1)
            console.log(password1)
            
        函数参数的定义
            一般我们在定义函数的时候,如果函数有多个参数时,在es5语法中函数调用时参数必须一一对应,否则就会出现赋值错误的情况,来看一个例子:需要一一对应,这样就会极易出现参数顺序传错的情况,从而导致bug
            
            ES5:
            function personInfo(name, age, address, gender) {
              console.log(name, age, address, gender)
            }
            personInfo('xy', 18, 'heze', 'man')
            
            ES6:
            function personInfo({name, age, address, gender}) {
              console.log(name, age, address, gender)
            }
            personInfo({gender: 'man', address: 'heze', name: 'xy', age: 18})
            
            
        交换变量的值
        
            ES5:
            var a=1, b=2, c
            c = a
            a = b
            b = c
            console.log(a, b)
            
            ES6:
            let a=1, b=2;
            [b, a] = [a, b]
            console.log(a, b)
            
            
        函数的默认参数
            ES5
            function saveInfo(name, age, address, gender) {
              name = name || 'xy'
              age = age || 18
              address = address || 'heze'
              gender = gender || 'man'
              console.log(name, age, address, gender)
            }
            saveInfo()
            
            ES6
            function saveInfo({name= 'xy', age= 18, address= 'heze', gender= 'man'} = {}) {
              console.log(name, age, address, gender)
            }
            saveInfo()
            
        字符串的结构赋值
            和数组一样,因此也有length属性
            const [a,b,c,d,e] = 'HELLO';
            console.log(a); //H
            console.log(b); //E
            console.log(c); //L
            console.log(d); //L
            console.log(e); //O
            
            const {length:len} = 'HELLO';
            console.log(len) // 5
            或者
            const {length} = 'HELLO';
            console.log(length) // 5
    
    
    从函数返回多个值
        function fun(){
            return [1,2,3]
        }
        可以这样写
        console.log(fun())
        但是我们要取第二个,就需要提前定义一个数组来接收,再循环
        这时候就需要用到解构赋值,比较方便
        var [x,y,z] = fun()
        console.log(x);
        console.log(y);
        console.log(z);
        
        
        function fun(){
            return {
                name:'xy',
                age:'18'
            }
        }
        
        var [name,age] = fun()
        console.log(name);
        console.log(age);
        
    
    Map 结构
        let map = new Map();
        let obj = {
            name: 'Leon',
            sex: 'male'
        };
        map.set(obj,'myObject');
        map.get(obj); // "myObject"
        map.has(obj) //true
        map.delete(obj) //true
        map.has(obj) // false
        
        实例的属性和操作方法
        
            set(key,value):
            set方法设置键名key对应的键值为value,然后返回整个 Map 结构。
            let map = new Map();
            map.set('dsssddddddddsdsdsdssfw',8);
            map.set({a:1},'ddsdsds');
            
            get(key):
            获取key的值
            map.get('dsssddddddddsdsdsdssfw')//8
            
            has(key)
            has方法返回一个布尔值,表示某个键是否在当前 Map 对象之中。
            map.has('dsssddddddddsdsdsdssfw'); //true
            
            delete(key)
            delete方法删除某个键,返回true。如果删除失败,返回false。
            map.delete('dsssddddddddsdsdsdssfw');
            map.has('dsssddddddddsdsdsdssfw')//false
            
            clear()
            清空Map对象
            map.size // 2
            map.clear()
            map.size // 0
            
            
        遍历方法
        方法  作用
        keys()  返回键名的遍历器
        values()    返回键值的遍历器
        entries()   返回所有成员的遍历器
        forEach()   遍历 Map 的所有成员
        
            const map = new Map([
              ['F', 'no'],
              ['T',  'yes'],
            ]);
            
            for (let key of map.keys()) {
              console.log(key);
            }
            // "F"
            // "T"
            
            for (let value of map.values()) {
              console.log(value);
            }
            // "no"
            // "yes"
            
            for (let item of map.entries()) {
              console.log(item[0], item[1]);
            }
            // "F" "no"
            // "T" "yes"
            
            // 或者
            for (let [key, value] of map.entries()) {
              console.log(key, value);
            }
            // "F" "no"
            // "T" "yes"
            
            // 等同于使用map.entries()
            for (let [key, value] of map) {
              console.log(key, value);
            }
            // "F" "no"
            // "T" "yes"
    
    Map与其他数据结构的转换
        Map转为数组:
            const myMap = new Map()
              .set(true, 7)
              .set({foo: 3}, ['abc']);
            [...myMap]
            // [ [ true, 7 ], [ { foo: 3 }, [ 'abc' ] ] ]
        数组 转为 Map
    
            new Map([
              [true, 7],
              [{foo: 3}, ['abc']]
            ])
            
        Map 转为对象
            
            function strMapToObj(strMap) {
              let obj = Object.create(null);
              for (let [k,v] of strMap) {
                obj[k] = v;
              }
              return obj;
            }
            
            const myMap = new Map()
              .set('yes', true)
              .set('no', false);
            strMapToObj(myMap)
            
        对象转为 Map
            
            function objToStrMap(obj) {
              let strMap = new Map();
              for (let k of Object.keys(obj)) {
                strMap.set(k, obj[k]);
              }
              return strMap;
            }
            
            objToStrMap({yes: true, no: false})
    

    相关文章

      网友评论

          本文标题:ES6基础

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