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

向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。

时间: 2024-10-13 12:40:17

向ES6看齐,用更好的JavaScript(二)的相关文章

使用 Promises 编写更优雅的 JavaScript 代码

你可能已经无意中听说过 Promises,很多人都在讨论它,使用它,但你不知道为什么它们如此特别.难道你不能使用回调么?有什么了特别的?在本文中,我们一起来看看 Promises 是什么以及如何使用它们写出更优雅的 JavaScript 代码. 您可能感兴趣的相关文章 开发中可能会用到的几个 jQuery 提示和技巧 精心挑选的优秀jQuery Ajax分页插件和教程 推荐几款很好用的 JavaScript 文件上传插件 精心挑选的优秀 jQuery 文本特效插件和教程 精心挑选12款优秀 jQ

【摘】50个jQuery代码段帮助你成为一个更好的JavaScript开发者

今 天的帖子会给你们展示50个jQuery代码片段,这些代码能够给你的JavaScript项目提供帮助.其中的一些代码段是从jQuery1.4.2才 开始支持的做法,另一些则是真正有用的函数或方法,他们能够帮助你又快又好地把事情完成.这些都是我尽量记住的有着最佳性能的代码段,因此如果你发现你任 何可以做得更好的地方的话,欢迎把你的版本粘贴在评论中!我希望你在这一文章中能找到有帮助的东西. 1.     如何创建嵌套的过滤器: //允许你减少集合中的匹配元素的过滤器, //只剩下那些与给定的选择器

更快学习 JavaScript 的 6 个思维技巧---分享

更快学习 JavaScript 的 6 个思维技巧 2015-10-10 全栈开发者中心 我们在学习JavaScript,或其他任何编码技能的时候,往往是因为这些拦路虎而裹足不前: 有些概念可能会造成混淆,尤其当你是从其他语言转过来的时候. 找不到时间(有时是动力)学习. 很容易忘记已经理解了的东西. 工具多又在不断变化,所以不知道从哪里开始. 幸运的是,这些拦路虎是可以被识别,并消灭的.在这篇文章中,我将介绍六个思维技巧来帮助你更快地学习JavaScript,并成为一个更快乐.更富有成效的程序

帮助你更快学习JavaScript的六个思维技巧

? ? ? ? ? ? ? ? 当人们试图学习JavaScript或其他编程语言的时候,他们通常会遇到如下挑战. 一些概念让他们感到困惑,特别是如果之前学过其他类型的语言. 很难找到学习的时间(或者动力)去学习. 你很容易忘掉之前学到的东西. JavaScript工具太多并且经常更新,以至于很难找到学习的切入点. 幸运的是,这些难题最终能够被克服.在这篇文章,我将展示六个能够帮助你更快.更开心.更高效地学习JavaScript的六个思维技巧. 1   不要让未来的忧虑干扰你现在的学习 有些Jav

[label][翻译][JavaScript-Translation]七个步骤让你写出更好的JavaScript代码

7 steps to better JavaScript 原文:http://www.creativebloq.com/netmag/7-steps-better-javascript-51411781七个步骤让你写出更好的JavaScript代码 随着浏览器的性能提升,新的HTML5 APIS也在不断地被应用,JavaScript在web使用中不断增长.然而,一行糟糕的代码就有可能会影响到整个网站,产生糟糕的用户体验和造成潜在客户的流失. 开发者必须使用他所能使用的工具和技巧来提高代码的质量,

从头开始学JavaScript (二)——变量及其作用域

原文:从头开始学JavaScript (二)--变量及其作用域 一.变量 ECMAscript变量是松散型变量,所谓松散型变量,就是变量名称可以保存任何类型的数据,每个变量仅仅是一个用于保存值的占位符. 定义:var firstDemo; 二.变量的作用域 2.1基本概念 使用var 定义变量:定义该变量的作用域的局部变量,这种定义变量的方法也被成为显式声明. 这么说不理解的话可以看看下面这个简单粗暴的例子: test();function test(){var firstDemo="hello

javascript二维矩阵的乘法。

百度&谷歌竟然搜不到"javascript二维矩阵的乘法",那我就自己写一个分享给大家.(我写的是两个n*n的二维矩阵的乘法) 下面又到了贴代码的时候了: function matrixMultiplication(a,b){ var len=a.length,arr=[]; for(var i=0;i<len;i++){ arr[i]=[]; for(var j=0;j<len;j++){ arr[i][j]=0;//每次都重新置为0 for(var k=0;k&

JavaScript二(第一个js程序)

一.<script>xxxx</script>标签解析 1.charset :可选,表示通过src属性指定的字符集,由于大多数浏览器忽略它,所以很少有人用它2.defer:可选.表示脚本可以延迟到文档完全解析和显示之后再执行,由于大多数浏览器不支持,故很少用3.language:已经废弃.原来用于代码使用的脚本语言,由于大多数的浏览器都忽略它,所以不要用4.src:可选,表示包含要执行代码的外部文件5.type:必需,可以看作是language的替代品,表示代码使用的脚本语言的内容

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

本文是ES6系列的第三篇,主要介绍ES6新增的数据类型.数据结构,先上传送门: 1 变量部分 2 现有对象拓展 3 新增数据类型/数据结构 4 新的异步编程模式 5 类和模块 1 第七种数据类型Symbol ES6引入了一种新的原始数据类型Symbol,表示独一无二的值.它是JavaScript语言的第七种数据类型,前六种是:Undefined.Null.布尔值(Boolean).字符串(String).数值(Number).对象(Object). let s = Symbol(); conso