ECMAScript 6 新特性


1.let 与 const

同其他语言一样,JS中的变量作用域是函数域而不是块级分割的,但涉及到变量提升和闭包等问题时, var 并不能很方便地满足我们的需求,于是出现了 let 与 const 这两个定义变量的关键词;

我们来看一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    var a = 5;
if(true){
var a = 10;
}
console.log(a);//10
```
此时变量 a 输出的值为 10 ,我们可以在这段代码中看到,在 if block 内外都有一个关于 a 的定义,而事实上,他们公用一个内存,为此,ECMAScript 用 let 关键词修复了这一个问题。

```js

let a = 5;
if(true){
let a = 10;
}
console.log(a); //5

当 let 作用域块级作用域中,只要是 let 定义的变量,他就只能在所定义的那个花括号内起作用 。此外 ECMAScript 还添加了另外一个关键词 const ,这个关键词一旦定义了一个变量,这个变量就不能再被修改了。

例如:

1
2
3
4
const aa = 11;
alert(aa) //11
aa = 22;
alert(aa) //11

2.类

原来的版本里说过,ECMAscript 是没有类的概念的,但在 ECMAScript 6 里面增添了一个 class 的关键词,我们可以把属性和方法定义在一个类里面,而且有类之后,继承那些问题就不用那么麻烦了

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
var Animal = (function () {
function Animal(name) {
this.name = name;
}
// Methods
Animal.prototype.doSomething = function () {
console.log("I'm a " + this.name);
};
return Animal;
})();

var lion = new Animal("Lion");
lion.doSomething();//I'm a Lion

在这段代码我们可以看到,lion 这个对象继承了 Animal 原型对象的 doSomething 方法,最后输出了 I’m a Lion

3.解构赋值

通常来说,我们访问数组里面的元素形式可能是这样的:

1
2
3
var first = someArray[0];
var second = someArray[1];
var third = someArray[2];

但使用了解构赋值的话就可以简便地写成:

1
var [first, second, third] = someArray;

还有另外一些解构赋值的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    //数组
var [a,b,c] = [1,2,3];//按顺序

//对象
var {a,b} ={a:1,b:2};
var {a,b} ={b:2,a:1};//不用按顺序

//函数

function test(){
return [a,b,c];
}
var [a1,b1,c1] = test();

//默认值

function test(a=1,b=2){
return [a,b];
}
var [a1,b1] = test(a);// b1 会是默认值 2

4.对象方法

在 ECMAScript 中还新增了几个 object 对象方法,分别是:

  • Object.is()//比较严格相等,与 === 相似

Object.is() 与 === 非常相似,不同点在于:

1
2
3
4
+0 === -0 //true
NaN === NaN //false
Object.is(+0, -0) //false
Object.is(NaN, NaN) //true

  • Object.assign(target,source1,source2)//复制对象可枚举属性
1
2
3
4
5
6
Object.assign(target,source1,source2);
var a = new Object();
a.name = '';
a.age = '';
a.sex
Object.defineProperty
  • Object.defineProperty

  • Object.setPrototypeof(a,null)//(裸对象)设置一个对象的prototype对象

    1
    2
    3
    4
    5
    6
    7
    8
    9
    var Person = {
    name: '张三',
    birth, //birth: birth
    hello(){console.log('hello');}
    // hello: function(){console.log('hello');}
    };
    function(){
    return {a,b}
    }

5.属性名表达式

在 ECMAScript 6 之前是要用字符串来表示节点,现在可以用本来的属性名去调用它。例如:

1
2
3
4
5
6
var lastWord = 'last word';
var a = {
'first word': 'hello',
[lastWord]: 'world'
};
a['last word'] == a[lastWord];

6. Set

想要得到没有重复成员的数组,可以用Set去去除重复的数组成员。

例如:

var a = new Set[1,2,3,5,3,4,3];

在这一数组中重复的3会被去掉。

7.Map

var a = {name:2,age:3};
var b = {a:4};

用对象或函数当做属性名

8.for-of 循环

在 ECMAScript 还没出来之前,我们要拿到数组里面的数值时,有人会用 for-each 的方法:

得到的结果:

虽然这一种方法能帮助我们得到数组里面的内容,但它有两个小缺点:

  • 不能用return语句返回到外层函数
  • 不能使用break语句中断循环

或许有人会用另外一种 for-in 的方法:

但这样写返回的结果是它的索引值:

要写成这样才能得到数组里面的值:

但 for-in 是为普通对象设计的,你可以遍历得到字符串类型的键,因此不适用于数组遍历。
用 for-of 时:

会直接得到结果为:

而 for-of 出现之后不但解决了 for-each 的两个缺陷还解决了 for-in 的所有的缺点。

9.Generator

ES6生成器(可以做游戏对话框)

10.Promise

主要是异步请求

1
2
3
4
5
6
7
ajax

$.ajax({
url:
method:
data:
}).success().error();

参考资料:
let 与 const 关键字:
http://www.geekcome.com/content-10-2520-1.html
Class 类:
http://www.sitepoint.com/understanding-ecmascript-6-class-inheritance/
ES 资料:
http://www.infoq.com/cn/ecmascript/