ES6-2

向ES6看齐,用更好的JavaScript(二)

上一篇 中介绍了关于变量部分的新特性,本篇将从现有对象的拓展来展开介绍

1 增加了模板字符串

先看一下,ES6之前我们是如何实现输出模板的:

    document.getElementById(‘root‘).innerHTML = "the user name is " + username + "\nthe user age is  " + age;

这样通过字符串相加拼接确实挺繁琐的,很容易出错,ES6引入了模板字符串来简化代码,两者输出效果是一样:

    //ES6环境下
    document.getElementById(‘root‘).innerHTML = `the user name is ${username}
    the user age is  ${age}`;

通过反引号包裹的字符串来声明模板字符串,插入变量直接通过${变量名}实现,另外要注意模板字符串中的所有空格和换行都是被保留的。

${变量名}中大括号内不仅支持变量名,对于任意的JavaScript表达式也是支持的,例如可以这样用:

    var result =  `my name is ${(function(){return ‘vicfeel‘;})()}`;

2 数组的拓展

  • Array.from( ),将伪数组对象转换为真正的数组

什么是伪数组对象?具有数组的结构,但不是数组对象,不能使用数组方法如forEach等,举几个栗子:

    let fakeArr1 = {
        ‘0‘:1,
        ‘1‘:2,
        ‘2‘:3,
        ‘length‘:3
    };

    function f(){
        let fakeArr2 = arguments;
    }

    let fakeArr3 = document.querySelectorAll(‘div‘);

    //上面三类都是伪数组对象
    forEach in fakeArr1; //false
    let arr = Array.from(fakeArr1); //ES5的写法 var arr = Array.slice.call(fakeArr1);
    forEach in arr;   //true
    
  • Array.find( ),在数组中检索第一个匹配要素

find()参数为一个函数,设置查找条件,看栗子:

    let arr = [1,3,5,7];
    var result = arr.find(function(value, index, arr){
        return value > 4;
    });
    var result2 = farr.find(function(value, index, arr){
        return value > 10;
    });
    console.log(result); //5
    console.log(result2); //找不到返回undefined;

findIndex()方法与find()类似,只不过查找的是序号:

    let arr = [1,3,5,7];
    var result = arr.findIndex(function(value, index, arr){
        return value > 4;
    });
    var result2 = farr.findIndex(function(value, index, arr){
        return value > 10;
    });
    console.log(result); //2
    console.log(result2); //找不到返回-1;
  • Array.fill( ),给定一个值来填充数组
    let arr = [1,2,3];
    arr.fill(5); //[5,5,5]

    //fill也可以接收3个参数,第二个和第三个参数分别为填充开始的位置和结束的位置
    let arr2 = [1,2,3,4,5,6];
    arr2.fill(5,1,3); //[1,5,5,4,5,6]

3 函数增加默认参数

ES6之前的函数是无法带有默认参数的,我们通常采用以下方式实现默认参数设置:

    function f(name,age){
        //设置默认值
        name = name || ‘defaultName‘;
        age = age || ‘defaultAge‘;
    }

ES6中提供了新的方法:

    //ES6环境下
    function f(name,age = 23){
        console.log(name + ‘,‘ + age);
    }
    f(‘vicfeel‘);  //vicfeel,23

通过Babel可以将ES6代码转换为浏览器支持ES5代码,这实际上是用ES5来模拟的一个过程,可以帮助我们了解ES6该方法的实现原理:

    //Babel转换后
    function f(name) {
        var age = arguments.length <= 1 || arguments[1] === undefined ? 23 : arguments[1];

        console.log(name + ‘,‘ + age);
    }
    f(‘vicfeel‘); //vicfeel,23

从上面可以看出,如果第二个参数严格等于“===”undefined就使用默认参数,这实际上在原有函数的基础上对形参加了一层解析赋值(见上一篇中的变量解析赋值)。

4 函数新增rest参数

ES6引入了rest参数(“...变量名”),用于获取函数的多余参数,这样就不需要使用arguments对象了,看个栗子:

    function f(...vals){
        console.log(vals);  //[1,2,3]
    }

    f(1,2,3);

上例中的vals类型为Array,值为[1,2,3],可以看成将arguments转换为数组后的结果,而且要比arguments有更高的灵活性,rest参数还可以这样用:

    //ES6环境下
    function f(v,...vals){
        console.log(v);   //‘temp‘
        console.log(vals); //[1,2,3]
    }

    f(‘temp‘,1,2,3);
    //ES5通过arguments的模拟
    function f(v) {
        console.log(v);

        for (var _len = arguments.length, vals = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
            vals[_key - 1] = arguments[_key];
        }

        console.log(vals);
    }

    f(‘temp‘, 1, 2, 3);

另外在使用rest时要注意的一点,rest参数后不可以再加别的参数:

    function f(...vals,v){ }  //这种方式会报错

除了在函数中作为rest参数,“ ... ”本身可以作为一个运算符使用,用处与rest参数刚好相反,是将一个数组转为用逗号分隔的参数序列,看看栗子:

    function add(x,y){
       return x + y;
    }

    var arr = [23,12];
    add(...arr); //35

    Math.max(...[4, 13, 15]) // 等同于Math.max(4, 13, 15);

    //结合rest使用
    function f(...vals){
        vals //[1,2,3]
    }

    var arr = [1,2,3];
    f(...arr);
    //当然上面这样用是多次一举,转换为参数再转回来,目的是为了理解两者是互为逆操作的

    //其它用法
    var nodeList = document.querySelectorAll(‘div‘);
    var array = [...nodeList];

    var arr1 = [1,2,3],arr2 = [4,5,6];
    var arr3 = [...arr1,...arr2]; //合并数组,在ES5中我们一般是这样用的arr1.concat(arr2);

5 增加箭头=>函数

直接用Babel转换“var f = a => b”为ES5看了一下

    //var f = a => b;

    var f =function (a) {
      return b;
    };

这样一下就明了了,我们可以将箭头函数理解成一种语法糖,是对函数的一种简化,a为参数,b为返回值

看一下复杂的用法:

    //当传入多个参数或对象时,要用()包裹
    var add = (a,b) => a + b
    //等同于
    var add = function(a,b){ return a + b; }

    //传入对象
    var plus = ({name,age}) => name + age;
    var person = {
        name:‘Vicfeel‘,
        age:23
    };
    plus(person); //Vicfeel23
    

灵活运用箭头函数,可以简化很多操作:

    let arr1 = [1,2,3,4];
    arr1.map(x => x * x);

    const IsEven = x => x % 2 == 0;

    let arr2 = [12,2,43,3,18];
    arr2.sort((x,y) => x - y);

另外,关于使用箭头函数有一点需要注意的地方:this对象的指向是可变的,但是在箭头函数中,它是固定的,我们结合例子看一下:

    var handler = {
      init: function() {
        document.addEventListener(‘click‘,
          e => this.doSomething(e), false);
      },

      doSomething: function(e) {
        console.log(‘do something);
      }
    };

我们为document绑定了点击事件,回调函数中使用箭头函数,调用handler的doSomething方法,一般的函数在点击执行中this会发生改变,指向document,并报错doSomething未定义,但在箭头函数中this在定义时便是固定的不再改变,将上面的例子转换为ES5看一下:

    //ES5
    var handler = {
        init: function init() {
            var _this = this;

            document.addEventListener(‘click‘, function (e) {
                return _this.doSomething(e);
            }, false);
        },

        doSomething: function doSomething(e) {
            console.log(‘do something‘);
        }
    };

转换后的ES5代码就清楚地说明了,箭头函数里面根本没有自己的this,而是引用外层的this。

参考Reference
http://www.ecma-international.org/ecma-262/6.0/index.html
http://es6.ruanyifeng.com/
http://www.cnblogs.com/Wayou/p/es6_new_features.html
http://www.cnblogs.com/snandy/p/4403111.html

博文作者:vicfeel
博文出处:http://www.cnblogs.com/vicfeel

时间: 2024-10-22 11:29:55

ES6-2的相关文章

es6学习 -- 解构赋值

ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 以前,为变量赋值,只能直接指定值. let a = 1; let b = 2; let c = 3; ES6 允许写成下面这样. let [a, b, c] = [1, 2, 3]; 上面代码表示,可以从数组中提取值,按照对应位置,对变量赋值. 本质上,这种写法属于"模式匹配",只要等号两边的模式相同,左边的变量就会被赋予对应的值.下面是一些使用嵌套数组进行解构的例子. 我认为

ES6之主要知识点(六)数组

引自http://es6.ruanyifeng.com/#docs/array 1.扩展运算符(...) 扩展运算符(spread)是三个点(...).它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列. 该运算符主要用于函数调用. function push(array, ...items) { array.push(...items); } function add(x, y) { return x + y; } var numbers = [4, 38]; add(...n

ES6简介

概述 ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在2015年6月正式发布,也叫ES2015. 语法提案的批准流程 新的语法从正式提案到正式成为标准,需要经历5个过程. Stage 0 - Strawman(展示阶段) Stage 1 - Proposal(征求意见阶段) Stage 2 - Draft(草案阶段) Stage 3 - Candidate(候选人阶段) Stage 4 - Finished(定案阶段) 一个提案进入Stage 2

es6的一些基本语法

首先说一下什么是es6: ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准; let 和 const 命令 let的基本用法: 上面代码在代码块之中,分别用let和var声明了两个变量.然后在代码块之外调用这两个变量,结果let声明的变量报错, var声明的变量返回了正确的值.这表明,let声明的变量只在它所在的代码块有效. const的基本用法: const声明的是一个常量,不能被修改,所以第二次声明后会报错! 数组的解构赋值: 之前最基本的写法是这样

js的ES6特性

一. let和const关键字 let出现之前,js所有的作用域都是以函数为单位的,只要在一个function里声明的var, 无论是for循环等块里面声明的还是在块外面声明的,整个function都可以使用这个var,比如: function foo() { for (var i=0; i<100; i++) { // } i += 100; // 仍然可以引用变量i } 我个人的理解是js的提升特性,函数会将里面声明的所有var都提升到函数开始的地方,所以整个函数内都共享这些var. let

Atitit js es5 es6新特性 attilax总结

1.1. JavaScript发展时间轴:1 1.2. 以下是ES6排名前十的最佳特性列表(排名不分先后):1 1.3. Es6 支持情况 基本chrome ff 360se8全面支持了2 2. ECMAScript 2015(ES6)的十大特征 – WEB前端开发 - 专注前端开发,关注用户体验.html2 1.1. JavaScript发展时间轴: 1.1995:JavaScript诞生,它的初始名叫LiveScript. 2.1997:ECMAScript标准确立. 3.1999:ES3出

30分钟掌握ES6核心内容

ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015. 也就是说,ES6就是ES2015. 虽然目前并不是所有浏览器都能兼容ES6全部特性,但越来越多的程序员在实际项目当中已经开始使用ES6了.所以就算你现在不打算使用ES6,但为了看懂别人的你也该懂点ES6的语法了... 在我们正式讲解ES6语法之前,我们得先了解下Babel. Babel Babel是一个广泛使用的ES6转码器,可以将

ES6之块级作用域

一.前言 在ECMAScript6(以下简称ES6)之前,ECMAScript的作用域只有两种: 1.  全局作用域: 2.  函数作用域. 正是因为有这两种作用域,所以在JavaScript中出现一术语--“变量提升(hoisting)”. 如下: function func(){ console.log(test); var test = 1; }; func(); 在node环境执行上述代码,结果为: 之所以为’undefined’,原因就在于‘变量提升’,在进入func函数时,将所有通过

[ES6] 03. The let keyword -- 1

var message = "Hi"; { var message = "Bye"; } console.log(message); //Bye The message inside the block still has impact on the outside. If you add function around the inside message: var message = "Hi"; function greeting(){ va

Es6中如何使用splic,delete等数组删除方法

Es6中如何使用splic,delete等数组删除方法 1:js中的splice方法 splice(index,len,[item])    注释:该方法会改变原始数组. splice有3个参数,它也可以用来替换/删除/添加数组内某一个或者几个值 index:数组开始下标        len: 替换/删除的长度       item:替换的值,删除操作的话 item为空 如:arr = ['a','b','c','d'] 删除 ----  item不设置 arr.splice(1,1)   /