[ES6] ES6的认识和语法

为什么学习es6?

  1. es5先天性不足
  2. vue react框架都是用es6,作者最开始以为自己看不懂vue,后来发现其实是看不懂es6语法 /(ㄒoㄒ)/~~
  3. 暂时大部分公司都是用es6

ES6是js语言的标准,目标是可以编写复杂的大型应用程序,成为企业级开发语言
babel:被称为下一代的JS编译器,可以把es6变成es5

ES6新特性

let 和 const 命令

let 和 const都是和var一样来声明变量
let:

    //这样写会把a变量提升到最上面,但是不赋值,所以会打印undefined
    console.log(a);
    var a = 2;

    //这样写会报错,因为let不会提升变量
    console.log(b);
    let b = 10;

    //let是一个块级作用域
    console.log(c1) //不报错
    console.log(c2) //报错
    if(true){
    
    
        var c1 = 1;
        let c2 = 1;
    }

    // let 不能重复声明 , var就可以
    let d = 1;
    let d = 2; //报错

const:除了let的三个限制之外,还有着一旦声明无法改变的特性,相当于声明常量

es6的模板字符串

在以前,想拼接一个字符串就要这样

    <div class="box">
    </div>

    <script>
        const oBox = document.querySelector('.box');
        let id = 1,
            name = "小帅";
        oBox.innerHTML = "<ul><li><p id="+id+">"+name+"</p></li></ul>"
    </script>

es6可以快速的添加模板字符串

    <script>
        const oBox = document.querySelector('.box');
        let id = 1,
            name = "小帅";
        
        let htmlStr = `<ul>
            <li>
                <p id='${ 
        id}'>${ 
        name}</p>
            </li>
        </ul>`;
        oBox.innerHTML = htmlStr;
    </script>

增强的函数

赋默认值的操作

    //es5
    function add(a,b) {
    
    
        a = a || 10;
        b = b || 20;
        return a+b;
    }
    //es6
    functon add(a = 10 , b = 20){
    
    
        return a+b ;
    }

默认表达式也可以是一个函数

    function getVal(val){
    
    
        return val+5;
    }
    //默认值可以直接为表达式
    function add(a,b = getVal(5)){
    
    

    }

剩余参数

    let book = {
    
    
        title:"aa教程",
        author:'zs',
        year:2023
    }
    //eas5 写法
    function pick5(obj) {
    
    
        let result = Object.create(null);
        for(let i = 1; i < arguments.length ; i++){
    
    
            result[arguments[i]] = obj[arguments[i]];
        }
        return result
    }
    //es6 剩余参数的写法 由三个点和一个紧跟着的具名参数指定
    function pick6(obj,...keys) {
    
    
        let result = Object.create(null);
        for(let i = 0 ; i < keys.length ; i++){
    
    
            result[keys[i]] = obj[keys[i]];
        }
        return result;
    }
    let bookData5 = pick5(book,'author','year');
    let bookData6 = pick6(book,'author','year');
    console.log(bookData5);
    console.log(bookData6);

扩展运算符

    //剩余运算符,把多个独立的合到一个数组中
    //扩展运算符:将一个数组分割,并且将各个项作为分离的参数传给函数
    const arr = [10,20,30,50,60,100];
    console.log(Math,max.apply(null,arr)); //es5写法
    console.log(Math.max(...arr));  //扩展运算符写法

箭头函数

    //使用 => 来定义 
    // function(){}等于 ()=>{}
    let add = function(a,b) {
    
    
        return a+b;
    }
    //es6写法
    let add6 = (a,b)=>{
    
    
        return a+b;
    }
    //一个参数
    let add1 = val => {
    
    
        return val+5;
    }
    //再简便就是
    let add2 = val => (val+5);

    //函数嵌套
    let fn = (() => {
    
    
        return () => {
    
    
            console.log('hello world');
        }
    })();
    fn();

    //箭头函数的this绑定
    let PageHandle5 = {
    
    
        id:123,
        init:function (){
    
    
            document.addEventListener('click',function(event) {
    
    
                this.doSomethings(event,type);
            }.bind(this),false)
        },
        doSomethings:function(type){
    
    
            console.log(`事件类型:${
      
      type},当前id:${
      
      this.id}`);
        }
    }
    PageHandle5.init();
    //es6
    let PageHandle6 = {
    
    
        id:123,
        init:function (){
    
    
            document.addEventListener('click',(event) => {
    
    
                this.doSomethings(event,type);
            },false)
        },
        doSomethings:function(type){
    
    
            console.log(`事件类型:${
      
      type},当前id:${
      
      this.id}`);
        }
    }
    PageHandle6.init();

注意
1. 箭头函数内部没有arguments
2. 箭头函数不能使用new关键字来实例化对象

解构赋值

解构赋值是对赋值运算符的一种扩展
他针对数组和对象来进行操作
优点:代码书写简洁

    let node = {
    
    
        type : "c",
        name : "zs"
    }
    //es5
    let type = node.type;
    let name = node.name;
    //es6 - 完全解构
    let {
    
    type,name} = node;

    //再如 - 不完全解构
    let obj = {
    
    
        a:{
    
    
            name:'张三'
        },
        b:[],
        c:'helloWorld'
    }
    let {
    
    a} = obj
    //可以使用剩余运算符
    let {
    
    a,...res} = obj;

    //也可以对数组进行解构,参数名随便取

扩展的字符串,对象,数组功能

扩展的对象的功能:

  1. es6直接写入变量和函数,作为对象的属性和方法
    const name = 'zs',age = 20;
    const person = {
    
    
        name, //等价于name:name
        age
        sayName(){
    
    
            console.log(this.name);
        }
    }

    //可以出来给对象添加值,用[]来拼接名字
    const obj = {
    
    };
    obj.isShow = true;
    const name = 'z';
    obj[name + 's'] = 21;
    console.log(obj);

is() ===

    //比较两个值是否严格相等
    console.log(NaN === NaN) //false,特殊
    //is()是严格比较,啥都相同
    Object.is(NaN,NaN);

assign()

    //对象的合并
    //Object,assign(target,obj1,obj2,....)
    let target = {
    
    
        name:'zs'
    }
    target = Obj.assign(target,{
    
    a:1},{
    
    b:2});

Symbol

Symbol是es6提供的一种新的原始数据类型
他表示是独一无二的值

    const name = Symbol('name');
    const name2 = Symbol('name');
    console.log(name === name2) //false

他最大的用途:用来定义对象的私有变量

    let s1 = Symbol('s1');
    console.log(s1); //Symbol('s1')
    let obj = {
    
    };
    obj[s1] = 'zs';
    //或者这么直接复制
    let obj2 = {
    
    
        [s1]:'zs'
    }
    //如公用Symbol定义对象中的变量,取值时一定用[变量名]
    console.log(obj[s1]);

    //通过反射得到Symbol声明的属性名 (作为对象的key)
    const syms = Object.getOwnPropertySymbols(ibj);
    console.log(syms[0]);

    let syms1 = Reflect.ownKeys(obj);

Map和Set

Set:无重复值的有序列表

    let set = new Set();

    //添加元素 ,任意类型
    set.add(2)// 删除元素
    set.delete(2);
    set.has(2); //判断有无
    set.size; //大小

    //将set转换成数组
    let set2 = new Set([1,2,3,4,5,6,7,8]);
    let arr = [...set2]; // 通过扩展运算符来进行操作

    //set中对象的引用无法被释放
    let set3 = new Set(),obj = {
    
    };
    set.add(obj);

    obj = null; //释放资源 , 这里无法释放
    //解决方法- 使用WeakSet
    let set4 = new WeakSet(),obj2 = {
    
    }
    set.add(obj2);
    obj = null; //这里可以直接释放,set4中的obj2没了

WeakSet
1. 不能传入非对象类型的参数
2. 不可迭代
3. 没有forEach()
4. 没有size

Map:是键值对类型的有序列表,键和值时任意类型,Set就是键等于值的Map

    let map = new Map();
    map.set('key','value');

    //或者这样创建
    let map2 = new Map(['key1','value1'],['key2','value2']);
    //forEach遍历
    map.forEach((val,key) =>{
    
    

    })

猜你喜欢

转载自blog.csdn.net/qq_67548292/article/details/131724727