zoukankan      html  css  js  c++  java
  • ES6常用语法

    1.变量声明let与const(注意与var的区别)

    /**
     * 声明变量let和const
     */
    
    //let声明的变量不存在预解析
    //报错 flag is not defined
     console.log(flag);
     let flag = 123;
    //let声明的变量不允许重复(在同一个作用域内)
     //报错Identifier 'flag' has already been declared
    let flag = 123;
    let flag = 456;
    console.log(flag);
    //ES6引入了块级作用域,而之前在浏览器中的JS是不存在块级作用域的
    if (true) {
        //var flag = 123;   //用var声明的flag变量在for循环外也可以正常打印出来
        let flag = 123;     //用let声明的flag变量在for循坏外面打印报错:flag is not defined
    }
    console.log(flag);
    //const用来声明常量
    //const声明的常量不允许重新赋值
    //报错:Assignment to constant variable.
    const n = 1;
    n = 2;
    
    //const声明的常量必须初始化
    //报错:Missing initializer in const declaration
    const a;

     2.变量的解构赋值

    /**
     * 变量的解构赋值
     */
    /* 
    var a = 1;
    var b = 2;
    var c = 3;
     */    //或者var a = 1, b = 2, c = 3;
    
    //ES6中数组的解构赋值
    //var [a,b,c] = [1,2,3];      //打印结果:1 2 3
    //let [a,b,c] = [,123,];      //打印结果:undefined 123 undefined
    let [a = 111,b,c] = [,123,];  //打印结果:111 123 undefined
    console.log(a,b,c);
    //对象的解构赋值
    //对象的赋值与顺序没有关系,是通过对象的名称进行赋值
    //let {foo,bar} = {foo:'hello',bar:'hi'};
    let {foo,bar} = {bar:'hi',foo:'hello'};
    console.log(foo,bar);
    
    //对象的属性别名(如果有了别名,那原来的名字就无效了)
    let {foo:abc,bar} = {bar:'hi',foo:'hello'};  //打印结果:hello hi
    //let {foo:abc,bar} = {bar:'hi',abc:'hello'};   //打印结果:undefined 'hi'
    console.log(abc,bar);   //正常打印
    //console.log(foo,bar);     //报错:foo is not defined

    内置对象Math(Math是对象,不是函数)

    let {cos,sin,random} = Math;
    //字符串的解构赋值
    //[]里面声明的叫变量,这种方法不能获取字符串的长度
    let[a,b,c,d,e] = "hello";
    console.log(a,b,c,d,e);   //打印结果:h e l l o
    
    let[a,b,c,d] = "hello";
    console.log(a,b,c,d);      //打印结果:h e l l
    
    //{}里面声明的是对象,即对象的解构赋值
    let {length} = "hello";
    console.log(length);    //打印结果:5
    
    //对象的解构赋值指定默认值
    let {foo:abc = 'hello',bar} = {bar:'hi'};
    console.log(abc,bar);

     3.字符串扩展

    /**
     * 字符串相关扩展
     * 几个常用的API:
     * includes():判断字符串中是否包含指定的子串,有的话返回true,否则返回false
     *              参数一:匹配的字符串;参数二:从第几个开始匹配
     * startsWith():判断字符串是否以特定的字符串开始
     * endsWith():判断字符串是否以特定的字符串结束
     * 
     * 模板字符串
     */
    
    /* console.log('hello world'.includes('world'));  //true
    console.log('hello world'.includes('world1'));  //false
    console.log('hello world'.includes('world',6));  //true
    console.log('hello world'.includes('world',7));  //false */
    
    /* let url = 'admin/index.php';
    console.log(url.startsWith('admin'));
    console.log(url.endsWith('php')); */
    
    let obj = {
        username:'xiaoming',
        age:'24',
        gender:'male'
    }
    
    let tag = '<div><span>'+obj.username+'</span><span>'+obj.age+
                '</span><span>'+obj.gender+'</span></div>';
    console.log(tag);
    
    //模板字符串:注意:用的是反引号(键盘上数字1左边的)
    //反引号表示模板,模板中的内容可以有格式,通过${}方式填充数据
    //支持一些简单的表达式运算,也支持函数调用
    let fn = function(info){
        return info;
    }
    let tpl = `
        <div>
            <span>${obj.username}</span>
            <span>${obj.age}</span>
            <span>${obj.gender}</span>
            <span>${1+1}</span>        
            <span>${fn('hello')}</span>   
        </div>
    `;
    console.log(tpl);

     4.函数扩展

    /**
     * 函数扩展:
     * 1.参数默认值
     * 2.参数解构赋值
     * 3.rest参数
     * 4.扩展运算符:...
     */
    
     //参数默认值
     //以前的写法:
    function foo(param){
        let p = param || 'hello';   
        //let p = 'hello' || param;   //注意,如果把'hello'赋值放在前面,则不管参数是什么都将打印hello 
        console.log(p);
    }
    //foo();   //打印结果:hello
    foo('hi');   //打印结果:hi
    
    //ES6的写法:在原来的基础上做了精简
    function foo(param = 'hello'){
        console.log(param);
    }
    //foo();   //打印结果:hello
    foo('hi');   //打印结果:hi
    
    //参数的解构赋值(传入的参数就是一个对象了)
    function foo({name='xiaoming',age=24} = {}){
        console.log(name,age);
    }
    foo();    //打印结果:xiaoming 24
    foo({name:'zhangsan',age:22});   //打印结果:zhangsan 22
    
    //rest参数(剩余参数):将单个数据转化成数组
    function foo(a,b,...param){
        console.log(a);
        console.log(b);
        console.log(param);   //剩余的参数用数组的形式打印出来
    }
    foo(1,2,3,4,5,6);
     
    
    //扩展运算符 ... :将数组转化成单个数据
    function foo(a,b,c,d,e){
        console.log(a+b+c+d+e);
    }
    foo(1,2,3,4,5);     //打印结果:15
    let arr = [1,2,3,4,5];
    foo.apply(null,arr);    //打印结果:15
    foo(...arr);      //打印结果:15
    
    //合并数组:rest参数的应用
    let arr1 = [1,2,3];
    let arr2 = [4,5,6];
    let arr3 = [...arr1,...arr2];
    console.log(arr3);         //打印结果:[ 1, 2, 3, 4, 5, 6 ]
    /**
     * 箭头函数
     */
    //普通函数:
    function foo(){
        console.log('hello');
    }
    //箭头函数:
    let foo = () => console.log('hello');
    
    //带一个参数的普通函数:
    function foo(v){
        return v;
    }
    //带一个参数的箭头函数:
    let foo = v => v;
    
    //多个参数的箭头函数参数必须用()包住,函数体内有多行代码的必须用{}包住
    let foo = (a,b) => {let c=a+b; console.log(c);}
    
    /**
      * 箭头函数的注意事项
      */
     //1.箭头函数中的this取决于函数的定于,而不是调用
     function foo(){
         //使用call调用foo时,这里的this其实就是call的第一个参数
         console.log(this);     //打印结果:{ num: 1 }
         setTimeout(() => {console.log(this.num)},100);    //打印结果:1
     }
     foo.call({num:1});
    
    //2.箭头函数不可以new
     let foo = () => {this.num = 123;}
     new foo();  //报错:foo is not a constructor
    
    //3.箭头函数不可以使用arguments获取参数列表,可以使用rest参数代替
    let foo = (a,b) => {
        console.log(arguments);   //打印出来的对象
    }
    
    let foo = (...param) => {
        console.log(param);     //打印结果:[ 123, 456 ]
    }
    foo(123,456);

     5.类与继承

    /**
     * 类与继承
     */
    //以前创建构造函数和实例
    function Animal(name){
        this.name = name;
    }
    Animal.prototype.showName = function(){
        console.log(this.name);
    }
    var a = new Animal('Tom');
    a.showName();
    var b = new Animal('Jerry');
    b.showName();
    //===============================================
    //ES6语法创建构造函数和实例
    class Animal{
        //静态方法
        static showInfo(){
            console.log('hello');
        }
        //构造函数
        constructor(name){
            this.name = name;
        }
        showName(){
            console.log(this.name);
        }
    }
    let a = new Animal('spike');
    a.showName();
    Animal.showInfo();    //静态方法只能通过类名来调用
    //============================================================
    //类的继承extends
    class Dog extends Animal{
       constructor(name, color){
           super(name);    //调用父类的构造函数
           this.color = color;
       } 
       showColor(){
           console.log(this.color);
       }
    }
    
    let dog = new Dog('doudou','yellow');
    dog.showName();
    dog.showColor();
    Dog.showInfo();     //继承静态方法也是用类名调用
  • 相关阅读:
    [HAOI2007][SDOI2005]反素数
    [UVa1636]Headshot
    [Codeforces 581D]Three Logos
    [NOIP2014普及组]子矩阵
    洛谷 P3299 [SDOI2013]保护出题人 解题报告
    洛谷 P3965 [TJOI2013]循环格 解题报告
    洛谷 P3989 [SHOI2013]阶乘字符串 解题报告
    [SHOI2013]发牌 解题报告
    洛谷 P3962 [TJOI2013]数字根 解题报告
    LOJ 2664. 「NOI2013」向量内积 解题报告
  • 原文地址:https://www.cnblogs.com/zcy9838/p/11624121.html
Copyright © 2011-2022 走看看