本文是ES6系列的第二篇,主要介绍ES6中对现有对象方法属性的拓展,先上传送门:

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

本文版权归作者和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作!

如果阅读了本文章,觉得有帮助,您可以为我的博文点击“推荐一下”!

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

  1. 更快学习 JavaScript 的 6 个思维技巧

    更快学习 JavaScript 的 6 个思维技巧 我们在学习JavaScript,或其他任何编码技能的时候,往往是因为这些拦路虎而裹足不前: 有些概念可能会造成混淆,尤其当你是从其他语言转过来的时候 ...

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

    你可能已经无意中听说过 Promises,很多人都在讨论它,使用它,但你不知道为什么它们如此特别.难道你不能使用回调么?有什么了特别的?在本文中,我们一起来看看 Promises 是什么以及如何使用它 ...

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

    7 steps to better JavaScript 原文链接: http://www.creativebloq.com/netmag/7-steps-better-javascript-5141 ...

  4. (六)我的JavaScript系列:更好的JavaScript之CoffeeScript

    世界上的很多天才都在为构建更好的JavaScript而努力.已经有了很多尝试,其中最有前途的,无非就是CoffeeScript和TypeScript了.面对CoffeeScript,我有一见如故的感觉 ...

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

    原文:从头开始学JavaScript (二)--变量及其作用域 一.变量 ECMAscript变量是松散型变量,所谓松散型变量,就是变量名称可以保存任何类型的数据,每个变量仅仅是一个用于保存值的占位符 ...

  6. SkylineDemoForWeb JavaScript二次开发示例代码

    SkylineDemoForWeb JavaScript二次开发示例代码 http://files.cnblogs.com/files/yitianhe/SkylineDemoForWeb.zip

  7. JavaScript二(第一个js程序)

    一.<script>xxxx</script>标签解析 1.charset :可选,表示通过src属性指定的字符集,由于大多数浏览器忽略它,所以很少有人用它2.defer:可选 ...

  8. Javascript 二维码生成库:QRCode

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. 初识JavaScript(二)

    初识JavaScript(二) 我从上一篇<初识JavaScript(一)>知道和认识JavaScript的词法结构,也开始慢慢接触到了JavaScript的使用方法,是必须按照JavaS ...

  10. 向ES6看齐,用更好的JavaScript(一)

    众所周知,JavaScript作为弱类型语言,一直是精华与糟粕共存,许多"诡异"的地方我们不得不接受并使用.其实ES6(又称ECMAScript 2015)在2015年6月就已经正 ...

随机推荐

  1. 如何在osg中删除EventHandler

    最近在一个项目中需要动态的添加和删除EventHandler,添加的时候很顺利,使用view->addEventHandler()函数就可以了. 不过在删除的时候,出现点麻烦.   直接调用vi ...

  2. 让 cell 显示底部线条时,总是有几个线条被隐藏.

    一,经历 1> 感觉像是重用的问题,但从代码的分析中找不出任何问题. 2> 感觉像是我 在创建怎样的 cell 的代码 被 layoutsubviews 方法覆盖了一样.于是先在创建怎样的 ...

  3. 华清远见金牌讲师名家大讲堂Android开发篇成功举办

    2014年3月5日.12日华清远见金牌讲师名家大讲堂(以下简称名家大讲堂)在线讲座全新升级开讲,至此拉开了新一年名家大讲堂的序幕! 华清远见名家大讲堂作为业内颇具影响力的公益免 费线上课程,自2009 ...

  4. Hightcharts设置Y轴最大最小值

    有两种方法: 1:是在控件初始化时预设, yAxis: [{ max:}] 2:在程序运行中动态更新设置 thChart.yAxis[].update({ min: , max: });

  5. 复制 VS 复用 -04

    (续上篇)         小菜:“我明白了,他说用任意一种面向对象语言实现,那意思就是要用面向对象的编程方法去实现,对吗?OK,这个我学过,只不过当时我没想到而已.” 大鸟:“所有编程初学者都会有这 ...

  6. Oracle连接超时

    客户机 要想 连接 oracle服务机(装了数据库的机子),只需要在客户机配置一个 本地服务名就行了,不管你用Oracle服务端的配置工具 还是客户端的配置工具,都没有问题. 如果只是客户机连接服务机 ...

  7. ECLIPSE下SVN的创建分支/合并/切换使用

    最近接项目要求,要在svn主干上创建分支,用分支来进行程序的bug修改,而主干上进行新功能的开发.分支上的bug修改完,发布后,可以合并到主干上.项目程序可以在主干和分支之间进行切换,来实现主干和分支 ...

  8. jq最新前三篇文章高亮显示

    /*---------最新前三篇文章高亮显示-------------*/ function latest(){ var color_arr=new Array( "blue", ...

  9. JavaScript基础 DOM的操作

    1.DOM的基本概念 DOM是文档对象模型,这种模型为树模型:文档是指标签文档:对象是指文档中每个元素:模型是指抽象化的东西. 2.Windows对象操作 一.属性和方法: window对象——浏览器 ...

  10. 局域网访问本地localhost页面

    1.关闭防火墙 2.cmd - ipconfig - IPv4 地址 . . . . . . . . . . . . : 192.168.0.34 如果链接的是wifi,请右键确保手机和电脑链接同一个 ...