ECMAScript 6.0(以下简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了。它的目标,是使得JavaScript语言可以用来编写复杂的大型应用程序,成为企业级开发语言。标准的制定者有计划,以后每年发布一次标准,使用年份作为版本。因为ES6的第一个版本是在2015年发布的,所以又称ECMAScript 2015(简称ES2015)。
2016年6月,小幅修订的《ECMAScript2016标准》(简称ES2016)如期发布。由于变动非常小(只新增了数组实例的includes方法和指数运算符),因此 ES2016 与 ES2015 基本上是同一个标准,都被看作是ES6。根据计划,2017年6月将发布ES2017。—以上内容来自W3Cschool

使用let声明变量

在es6中我们使用let声明变量,但是为什么要使用let声明变量?下面来比较一下用var声明变量跟使用let声明变量的区别

使用var 声明变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 使用var 声明变量  
var bVariable = "变量";

// 存在的问题:
// 1.var命令会发生”变量提升“现象,即变量可以在声明之前使用,值为undefined
console.log(name); // 此时输出undefined
var name = "张三";


// 2.var命令允许我们重复声明变量,并且不会报错
var name = "jerry";
var name = "tom";
console.log(name);// 此时输出tom

// 3.通过 var 定义的变量,它的作用域是全局作用域或者函数作用域
function varvslet() {
console.log(i); // 此时输出undefined
for (var i = 0; i < 3; i++) {
console.log(i); // 0, 1, 2
};
}

使用let 声明变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//1.声明的变量仅在块级作用域有效
{
let name = "zhangsan";
}

console.log(name); // 此时name不会被访问到,因为let会构成块级作用域

{
var name1 = "lisi";
}

console.log(name); // 此时name会被访问到,因为var会构成全局作用域
//2.不存在变量提升,不存在预解析
console.log(family);
var family = "张三";
// 上面的代码实际上会发生预解析,解析成下面的代码,会先定义family
var family;
console.log(family);// 此时输出undefined
family ="张三";
//但是使用let,则不会出现这种情况
console.log(name); //不会输出undefined,直接出现暂时性死区
let name="张三";
//3.暂时性死区
//指程序报错终止执行
//4.不允许重复声明
let name="张三";
let name="李四"; //此时不允许重复定义: Identifier 'name' has already been declared

image

使用const声明常量

js中并没有声明常量的关键字,在es6中,出现了可以声明常量的关键字,const

1
const name="张三";
  1. 声明时必须赋值,否则报错
  2. 只在块级作用域有效
  3. 存在暂时性死区
  4. 不可重复声明
  5. 当常量是对象时,对象本身是可变的,依然可以添加新属性
  6. 了解基本数据类型以及复杂数据类型

image

ES6中的字符串

ES6之前:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// 1.需要使用拼接字符串

var html = '<header>' +
'<a class="back" href="javascript:;">' +
'<i></i>' +
'<span>优惠活动</span>' +
'</a>' +
'</header>';


// 2.如果上面的"优惠活动"是变量
var title = "优惠活动";

var html = '<header>' +
'<a class="back" href="javascript:;">' +
'<i></i>' +
'<span>' + title + '</span>' +
'</a>' +
'</header>';


// 3.如果有一个字符串"Hello World",如何遍历

var str = "Hello World";

for (var i = 0; i < str.length; i++) {
console.log(str[i]);
}

ES6之中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 1.不需要使用拼接字符串,直接使用模板字符串
let html = `
<header>
<a class="back" href="javascript:;">
<i></i>
<span>优惠活动</span>
</a>
</header>`;


// 2.如果上面的'优惠活动'是变量,也不需要使用拼接字符串的方式 只需要把变量写在这样的格式中 ${变量}
var title = "优惠活动";

let html = `
<header>
<a class="back" href="javascript:;">
<i></i>
<span>${title}</span>
</a>
</header>`;

// 3. 使用for...of
var str = "HelloWorld";

for(let i of str) {
console.log(i);
}

ES6中的函数

rest参数

ES6之前:

1
2
3
4
5
6
7
// 1.函数接受任意个数的参数并排序
var sortNumber = function () {
return Array.prototype.slice.call(arguments).sort();
//此时arguments是类数组,可以遍历 可以有length属但是不能有数组的方法
//Array.prototype.slice.call()就是把类数组转换成数组
}
console.log(sortNumber(2,3,1,4,5,9,0));

ES6之中:

1
2
3
4
5
6
7
8
9
10
11
// 1.函数接受任意个数的参数并排序
function add(...rest) {
console.log(rest);//此时rest是数组
red.sort();
console.log(rest);
}
add(1,4,3,5,2,7,9,0,6);

<!--注意:arguments是类数组,rest是数组,-->
<!--rest参数之后不能再有其他参数(即只能是最后一个参数),-->
<!--否则会报错。-->

箭头函数

ES6之前:

1
2
3
4
//匿名函数写法
var add = function (x,y) {
return x + y;
}

ES6之中:

1
2
3
//匿名函数写法
var add = (x,y) => {return x+y};
//注意: 箭头函数不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。

解构赋值

ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。

1
2
3
4
5
6
7
8
9
//数组解构赋值
var [a,b,c] = [1,2];
console.log(a,b,c);
var [a,b] = [1,2,4];

//对象解构赋值
var obj = {a: 1,b: 2}
var {a,b} ={a:1, b:2}
console.log(a,b);

image