zoukankan      html  css  js  c++  java
  • 几个ES6新特性

    ES6是JavaScript语言的下一代标准,已经在2015年6月正式发布了,因为ES6的第一个版本是在2015年发布的,所以又称ECMAScript 2015(简称ES2015)。本文主要讲述的是ES6相对于ES5的几个实用新特性,如有其它见解,欢迎指正和交流。

    在线babel转换地址:http://babeljs.io/repl/#?babili=false&evaluate=true&lineWrap=false&presets=es2015%2Creact%2Cstage-2&code=

    1. let关键字

    (1)基本用法:let关键字用来声明变量,它的用法类似于var,都是用来声明变量。

    (2)块级作用域:let声明的变量,只在let关键字所在的代码块内有效。

    {
      var a = 10;
      let b = 10;
    }
    console.log(a);  //10
    console.log(b);  //error: b is not defined
      
    var c = 10;
    {
      var c = 20;
    }
    console.log(c);  //20
      
    var d = 10;
    {
      let d = 20;
    }
    console.log(d);  //10
    
    var i=0;
    for(var i=0; i<10; i++) {
    }
    console.log(i);  //10
    
    var j=0;
    for(let j=0; j<10; j++) {
    }
    console.log(j);  //0

    (3)不存在变量提升:let声明的变量一定要在声明后使用,否则会报错

    console.log(a);  //undefined
    console.log(b);  //error: b is not defined
    
    var a = 10;
    let b = 10;

     2. const关键字

    (1)基本用法:声明一个只读的常量。一旦声明,常量的值就不能改变。

    console.log(a);  //undefined
    console.log(b);  //error: b is not defined
    var a = 10;
    let b = 10;

     (2)其他特性与var关键字一致

     3. 字符串拼接方法

    (1)基本用法:用反引号进行拼接 

    /*ES5中字符串处理方法*/
    var name = "Jack";
    var str1 = 'my name is ' + name;
    console.log(str1);  //my name is Jack
    
    /*ES6中字符串处理方法*/
    var str2 = `my name is ${name}`;
    console.log(str2);  //my name is Jack

    4. function函数

    (1)基本用法:默认参数

    /*ES5中函数默认参数处理方法*/
    function fn1(height) {
        var height = height || 100;
        console.log(height);
    }
    fn1();  //100
    
    /*ES6中直接在形参赋值进行设置默认参数*/
    function fn2(height = 100) {
        console.log(height);
    }
    fn2();  //100

    (2)箭头函数

    /*ES5中定义一个函数变量*/
    var fn1 = function(height) {
        console.log(height);
    }
    fn1(100);  //100
    
    /*ES6中用箭头函数定义函数变量*/
    var fn2 = (height) => {
        console.log(height);
    }
    fn2(100);  //100
    /*箭头函数特性:箭头函数的this指针保持和外层指针一致*/
    var ele = document.getElementById('ele');  //获取某个元素,绑定点击事件
    ele.onclick = function() {
        setTimeout(function() {
            console.log(this);   //点击后,打印出window对象
        }, 10)
    }
    ele.onclick = function() {
        setTimeout(() ()=> {
            console.log(this);   //点击后,打印出ele元素对象
        }, 10)
    }
    /*箭头函数特性:箭头函数的argumets对象和外层一致*/
    function fn1(height) {
        setTimeout(function() {
            console.log(arguments);
        }, 10)
    }
    function fn2(height) {
        setTimeout(() => {
            console.log(arguments);
        }, 10)
    }
    fn1(100);  //[]
    fn2(100);  //[100]

    5. 变量的结构赋值

    (1)基本用法

    /*ES5初始化变量*/
    var a = 10;
    var b = 20;
    
    /*ES6解构赋初值*/
    var [a, b] = [10, 20];
    /*ES5获取对象的key值*/
    var obj1 = {
        username1: 'jack',
        password1: 123
    }
    var username1 = obj1.username1;
    var password1 = obj1.password1;
    console.log(username1, password1);
    
    /*ES6通过解构拆包获取对象的key值*/
    var obj2 = {
        username2: 'jack',
        password2: 123
    }
    var {username2, password2} = obj2;
    console.log(username2, password2);
    /*字符串的解构赋值*/
    var [a, b, c, d, e] = 'hello';
    console.log(a, b, c, d, e);  //h e l l o
    /*数组的解构赋值*/
    var [a, b, c] = ['hello', 'world'];
    console.log(a, b, c);  //hello world

    6. …拓展操作符

     (1)基本用法

    //合并数组
    var arry = ['a', 'b'];
    var arry1 = arry.concat(['c']);  //ES5数组拼接
    var arry2 = [...arry, 'c'];  //ES6...操作符拼接数组
    console.log(arry1); //['a', 'b', 'c']
    console.log(arry2);  //['a', 'b', 'c']
    
    //合并对象
    var obj = {a: 1, b: 2};
    var obj1 = {...obj, c: 3};
    var obj2 = {...obj, a: 3};
    console.log(obj1) ; // {a: 1, b: 2, c: 3}
    console.log(obj2) ; // {a: 99, b: 2}
    /*拆分字符串*/
    console.log([...'hello']); // [ "h", "e", "l", "l", "o" ]
    /*合并成数组*/
    function mergeArr(...Arrys) {
        console.log(arguments);
    }
    mergeArr('a', 'b', 'c');  //['a', 'b', 'c'];
    
    /*拆分数组*/
    console.log(...['a', 'b', 'c']);  //a b c
    function fn1() {
        var arry = Array.prototype.sort.call(arguments, function(a, b) {
            return a - b;
        })
        console.log(arry);
    }
    fn1(3,1,5,3,8,6);  //1 3 3 5 6 8
    
    /*...操作符将类数组转换为数组*/
    function fn2() {
        var arry = [...arguments].sort(function(a, b) {
            return a - b;
        })
        console.log(arry);
    }
    fn2(3,1,5,3,8,6);  //1 3 3 5 6 8

    7. 对象的一些实用方法

    (1)Object.is():判断两个值是否相等,ES5比较两个值是否相等,只有两个运算符:相等运算符(==)和严格相等运算符(===)。它们都有缺点,前者会自动转换数据类型,后者的NaN不等于自身,以及+0等于-0。

    console.log(+0 === -0)  //true,错误结果
    console.log(NaN === NaN)  //false,错误结果
    console.log(Object.is(+0, -0)) // false,正确结果
    console.log(Object.is(NaN, NaN)) // true,正确结果
    /*普通值的比较*/
    console.log(Object.is('foo', 'foo')) //true
    console.log(Object.is({}, {}))  //false

    (1)Object.assign():合并对象的方法,将源对象(source)的所有可枚举属性,复制到目标对象(target)。

    /*使用方法*/
    var target = {a: 1, b: 1 };
    var source = {c: 1};
    console.log(Object.assign(target, source));  //{a: 1, b: 1, c: 1}
    /*如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性*/
    var target = {a: 1, b: 1 };
    var source = {a: 20, c: 1};
    console.log(Object.assign(target, source));  //{a: 20, b: 1, c: 1}
    /*运用:克隆对象*/
    function clone(origin) {
      return Object.assign({}, origin);
    }
    var obj1 = {
        a: 2
    }
    var obj2 = clone(obj1);
    console.log(obj2);  //{a: 2}
    
    /*注意:Object.assign方法实行的是浅拷贝,而不是深拷贝。也就是说,如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用。*/
    var obj1 = {a: {b: 1}, c: 1};
    var obj2 = Object.assign({}, obj1);
    obj2.a.b = 100;
    obj2.c = 200;
    console.log(obj1);  //{a: {b: 100}, c: 1}
    /*运用:合并对象*/
    var merge = (...sources) => Object.assign({}, ...sources);
    console.log(merge({a: 1}, {b: 2}, {a: 3, c :3}));  //{a: 3, b: 2, c: 3}

    8. promise对象

    (1)定义:一种异步函数的解决方案,避免了异步函数层层嵌套,将原来异步函数转换 为便于理解和阅读的链式步骤关系

    (2)三种状态:Pending(进行中)、Resoloved(已完成)、Rejected(已失败)。

    (3)两种结果:Pending->Resoloved(成功); Pending->Rejected(失败)。

    (4)then方法:第一个参数是成功时调用的函数,第二个参数是失败时调用的函数。

    (5)通常形式。

    var promise = new Promise((reslove, reject) => {
        if(条件成立) {
            /*Pending->Resoloved(成功*/
            reslove(); 
        }else {
            /*Pending->Rejected(失败)*/
            reject();
        }
    })
    /*运用:隔1s打印‘hello’,隔2s打印‘world’*/
    
    /*ES5实现方法*/
    setTimeout(function(){
        console.log('hello')
          setTimeout(function(){
            console.log('world')
          }, 1000)
    }, 1000)  
    
    /*Promise实现方法*/
    var wait1000 = (str) => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve(str);
            }, 1000)
        })
    }
    
    wait1000('hello').then((data) => {
        console.log(data);
        return wait1000('world');
    }, () => {
        console.log('err');
    }).then((data) => {
        console.log(data);
    })
  • 相关阅读:
    php socket 读取缓存区域
    PHP依赖注入的作用
    谷歌浏览器调试文字都变成font标签的解决方法
    php socket 同步异步堵塞非堵塞的区别
    css3中background-size中的cover与contain的区别
    css3 line-height:0的作用
    RDD的创建方式
    Serializable序列化操作解惑
    SparkCore分布式计算模拟
    spark不同环境下计算pi值
  • 原文地址:https://www.cnblogs.com/canfoo/p/5896927.html
Copyright © 2011-2022 走看看