遇到了要写出es6新特性的题目,所以查阅了资料来总结一下,点击查看原文

进入正题,最常用的ES6特性有:let, const, class, extends, super, arrow functions, template string, destructuring, default, rest arguments。

1.let,const

针对目标:块级作用域

关于这两个特性,可以先查看我的博客:js中const,var,let区别

在之前的基础上,进行补充:ES5只有全局作用域和函数作用域,没有块级作用域,这让var带来很多不合理的场景,比如下面的例子——用来计数的循环变量泄露为全局变量。

 var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); //

上面代码中,变量i是var声明的,在全局范围内都有效。所以每一次循环,新的i值都会覆盖旧值,导致最后输出的是最后一轮的i的值。而使用let则不会出现这个问题。

 var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); //

再来一个例子(使用了闭包):预期结果是点击不同的clickBox,显示不同的 i

 var clickBoxs = document.querySelectorAll('.clickBox')
for (var i = 0; i < clickBoxs.length; i++){
clickBoxs[i].onclick = function(){
console.log(i);//事实是无论我们点击哪个clickBox,输出的都是5
}
}

所以我们用闭包搞定它

 function iteratorFactory(i){
var onclick = function(e){
console.log(i);
}
return onclick;
}
var clickBoxs = document.querySelectorAll('.clickBox');
for (var i = 0; i < clickBoxs.length; i++){
clickBoxs[i].onclick = iteratorFactory(i);
}

2.class, extends, super

针对目标:原型、构造函数,继承

 class Animal {
constructor(){
this.type = 'animal';
}
says(say){
console.log(this.type + ' says ' + say);
}
} let animal = new Animal();
animal.says('hello'); //animal says hello class Cat extends Animal {
constructor(){
super();
this.type = 'cat';
}
} let cat = new Cat();
cat.says('hello');//cat says hello

上面代码首先用class定义了一个“类”,可以看到里面有一个constructor方法,这就是构造方法,而this关键字则代表实例对象。简单地说,constructor内定义的方法和属性是实例对象自己的,而constructor外定义的方法和属性则是所有实例对象可以共享的。

Class之间可以通过extends关键字实现继承,这比ES5的通过修改原型链实现继承,要清晰和方便很多。上面定义了一个Cat类,该类通过extends关键字,继承了Animal类的所有属性和方法。

super关键字,它指代父类的实例(即父类的this对象)。子类必须在constructor方法中调用super方法,否则新建实例时会报错。这是因为子类没有自己的this对象,而是继承父类的this对象,然后对其进行加工。如果不调用super方法,子类就得不到this对象。

ES6的继承机制,实质是先创造父类的实例对象this(所以必须先调用super方法),然后再用子类的构造函数修改this。

P.S 如果你写react的话,就会发现以上三个东西在最新版React中出现得很多。创建的每个component都是一个继承React.Component的类。

3.箭头函数

针对目标:函数简洁,this问题

 //传统写法
function(x, y) {
x++;
y--;
return x + y;
}
//ES6箭头函数写法
(x, y) => {x++; y--; return x+y}

传统写法会出现的this问题:

 class Animal {
constructor(){
this.type = 'animal';
}
says(say){
setTimeout(function(){
console.log(this.type + ' says ' + say);
}, 1000);
}
} var animal = new Animal();
animal.says('hi'); //undefined says hi
//代码会报错,这是因为setTimeout中的this指向的是全局对象。

为了让上面代码能够正确的运行,传统的解决方法有两种:

 //第一种是将this传给self,再用self来指代this
says(say){
var self = this;
setTimeout(function(){
console.log(self.type + ' says ' + say);
}, 1000);
 //第二种方法是用bind(this)
says(say){
setTimeout(function(){
console.log(this.type + ' says ' + say);
}.bind(this), 1000);

使用箭头函数的写法:(不会出现代码报错)

 class Animal {
constructor(){
this.type = 'animal';
}
says(say){
setTimeout( () => {
console.log(this.type + ' says ' + say);
}, 1000);
}
}
var animal = new Animal();
animal.says('hi'); //animal says hi

当我们使用箭头函数时,函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。并不是因为箭头函数内部有绑定this的机制,实际原因是箭头函数根本没有自己的this,它的this是继承外面的,因此内部的this就是外层代码块的this。

4.模板字符串(用反引号(\来标识起始,用${}`来引用变量)

 //传统写法
$("#result").append(
"There are <b>" + basket.count + "</b> " +
"items in your basket, " +
"<em>" + basket.onSale +
"</em> are on sale!"
); //模板字符串写法
$("#result").append(`
There are <b>${basket.count}</b> items
in your basket, <em>${basket.onSale}</em>
are on sale!
`);

5.解构(按照一定模式,从数组和对象中提取值,对变量进行赋值)

 //传统写法
let cat = 'ken';
let dog = 'lili';
let zoo = {cat: cat, dog: dog};
console.log(zoo); //Object {cat: "ken", dog: "lili"} //ES6解构
let cat = 'ken';
let dog = 'lili';
let zoo = {cat, dog};
console.log(zoo); //Object {cat: "ken", dog: "lili"} //反过来也可以求一个对象的属性值
let dog = {type: 'animal', many: 2};
let { type, many} = dog;
console.log(type, many); //animal 2

6.default(默认值)

举例说明:调用animal()方法时忘了传参数

 //传统的做法就是加上这一句type = type || 'cat' 来指定默认值。
function animal(type){
type = type || 'cat';
console.log(type);
}
animal(); //ES6写法
function animal(type = 'cat'){
console.log(type);
}
animal();

7.rest(剩余参数,是一个真的数组)&&arguments(取到全部实参,而且是一个伪数组)

写法: ...rest(三个小圆点+rest)

取值:除了开始参数的剩余参数,而且之后不能再取参,会报错。但是,剩余参数之前也可以没有其他参数。

 function func(r, ...rest) {
console.log(r);
console.log(rest);
}
func(1);//会输出:第一行:1 ; 第二行: [] 因为除了1没有其他值
func(1, 2, 3, 4);//会输出:第一行:1 ; 第二行: [2,3,4]
 //rest前面有两个参数的情况
function func(r, e, ...rest) {
console.log(r,e);
console.log(rest);
}
func(1,2);//会输出:第一行:1 2 ; 第二行: []
func(1, 2, 3, 4);//会输出:第一行:1 2 ; 第二行: [3,4]
 //rest后面有参数的情况
function func(r, ...rest, e) {//报错,...rest不能有后面的参数
console.log(r,e);
console.log(rest);
}
func(1,2);
 //rest前面没有参数
function func(...rest) {
console.log(rest);
}
func(1, 2, 3, 4);//[1,2,3,4]

注意:(1)使用rest剩余参数后,函数的length属性会发生一些变化(不包括剩余参数)。

 function func(a, b, ...rest) {
}
console.log(func.length); //

(2)arguments和剩余参数的区别:

arguments是一个伪数组(Array-like);

剩余参数是一个真正数组(Array),具有Array.prototype上的所有方法;

arguments上有callee,callee上有caller;

注:rest不能和arguments一起使用不会报错。(参考资料中显示报错,应该是之前的版本,我测试了360,Firefox都可以使用)。

如有错误,请您指正!

参考文档:

30分钟掌握ES6/ES2015核心内容(上)

ES6函数剩余参数(Rest Parameters)

最常用的ES6特性的更多相关文章

  1. 最常用的ES6特性(转)

    最常用的ES6特性 let, const, class, extends, super, arrow functions, template string, destructuring, defaul ...

  2. 【ES6】最常用的es6特性(一)

    参考链接: http://www.jianshu.com/p/ebfeb687eb70 http://www.cnblogs.com/Wayou/p/es6_new_features.html 1.l ...

  3. 【ES6】最常用的es6特性(二)

    1.for of 值遍历 for in 循环用于遍历数组,类数组或对象,ES6中新引入的for of循环功能相似,不同的是每次循环它提供的不是序号而是值. var someArray = [ &quo ...

  4. 10 个常用的 es6 特性

    1. const  and let 除了函数作用域之外,增加了块级作用域和常量.const 定义的绑定不可以修改,let定义的绑定在{ }不能访问.之前的 var 如果不在函数作用域内,相当于定义了一 ...

  5. 常用es6特性归纳-(一般用这些就够了)

    之前做vue和react的时候,发现文档什么的最新版本都建议用es6写法,对es6友好度更高,加之现在es6也越来越普及,兼容性问题直接用babel转码就好了,特别方便,于是我开始学着用es6写代码, ...

  6. ES6系列之项目中常用的新特性

    ES6系列之项目中常用的新特性 ES6常用特性 平时项目开发中灵活运用ES6+语法可以让开发者减少很多开发时间,提高工作效率.ES6版本提供了很多新的特性,接下来我列举项目中常用的ES6+的特性: l ...

  7. 9个常用ES6特性归纳(一般用这些就够了)

    ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了.它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应 ...

  8. ES6特性

    一.ES6特性: let, const, class, extends, super, arrow functions, template string, destructuring, default ...

  9. 开发中常用的es6知识

    结合实际开发,开发中常用的es6的知识: 1.新增let和const命令: ES6 新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效: cons ...

随机推荐

  1. 如何修改MyEclipse项目的web context-root

    修改一个MyEclipse项目的名称很容易,右键点项目->rename就行了. 但此时项目的web context-root 还没有改变,需要右键点项目->properties->M ...

  2. mysql和CSV

    1.mysql导入和导出数据可以通过mysql命令或者mysqldump来完成.mysqldump可以导入和导出完整的表结构和数据.mysql命令可以导入和导出csv文件. 1.mysql支持导入和导 ...

  3. itellij idea导入web项目并部署到tomcat

    概述 主要分为项目配置和tomcat配置两大步骤. 一.项目配置 打开idea,选择导入项 选择将要打开的项目路径后,继续选择项目的原本类型(后续引导设置会根据原本的项目类型更新成idea的项目),此 ...

  4. JavaScript:异步 setTimeout

    setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式. function showDate(){ var date=new Date(); console.log(date); } ...

  5. [CC]手动点云分割

    CloudCompare中手动点云分割功能ccGraphicalSegmentationTool, 点击应用按钮后将现有的点云分成segmented和remaining两个点云, //停用点云分割功能 ...

  6. ASP.NET corrupt assembly “Could not load file or assembly App_Web_*

    以下是从overFlow 复制过来的问题 I've read through many of the other questions posted on the same issue, but I s ...

  7. vpn打通结果ping不通

    A 是一台服务器 B 是一台openvpn A 设置路由 route add -net 172.16.1.0/24 gw 192.168.125.228 B 设置伪装 -A POSTROUTING - ...

  8. noi 04:求整数的和与均值

    04:求整数的和与均值 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 读入n(1 <= n <= 10000)个整数,求它们的和与均值. 输入 ...

  9. DIY PIXHAWK APM等飞控用的声纳

    代码: SR04 + ApmSonar.ino 打包下载 注意,使用到了SR04的类库. ApmSonar.ino // sr04 to apm I2c sonar // by panxu mail: ...

  10. HDU 5053 the Sum of Cube(简单数论)

    http://acm.hdu.edu.cn/showproblem.php?pid=5053 题目大意: 求出A^3+(A+1)^3+(A+2)^3+...+B^3和是多少 解题思路: 设f(n)=1 ...