es6(ECMAscript 2015)有哪些新特性
一、let和const
1. 没有变量提升
console.log(a); let a = 4; // a is not defined console.log(a); const a = 4; // a is not defined
2. 不能重复申明
let a = 4; let a = 5; console.log(a); // Identifier 'a' has already been declared const b = 4; const b = 5; console.log(b);// Identifier 'b' has already been declared
3. 具有块级作用域(JS中作用域有:全局作用域、函数作用域。没有块作用域的概念。ECMAScript 6(简称ES6)中新增了块级作用域。块作用域由 { } 包括,if语句和for语句里面的{ }也属于块作用域。)
1)var定义的变量,没有块的概念,可以跨块访问, 不能跨函数访问。
2)let定义的变量,只能在块作用域里访问,不能跨块访问,也不能跨函数访问。
3)const用来定义常量,使用时必须初始化(即必须赋值),只能在块作用域里访问,而且不能修改。
var a = 5; function foo(){ console.log(a); // undefined if(false){ var a = 6; } } foo()
//因为 var 定义得变量可以跨块访问, 不能跨函数访问,所以输出得是undefined。
var a = 5; function foo(){ console.log(a); // 5,注意输出结果不是6 if(false){ const a = 6; } } foo();
//因为 const定义得变量不可以跨块访问
var a = 5; function foo(){ console.log(a); //5
if(false){ let a = 6; }
}
foo();
//因为 let定义得变量不可以跨块访问
4. 临时失效区(暂时性死区)
var a = 5; function fn(){ console.log(a);//a is not defined const a = 4; } fn();
var a = 5; function fn(){ console.log(a);// a is not defined const a = 4; } fn();
二、for of 值遍历
我们都知道for in 循环用于遍历数组,类数组或对象,ES6中新引入的for of循环功能相似,不同的是每次循环它提供的不是序号而是值。
var someArray = [ "a", "b", "c" ]; for (v of someArray) { console.log(v);//输出 a,b,c } for (v in someArray) { console.log(v);//输出 0,1,2 }
三、箭头操作符
ES6中新增的箭头操作符=>,它简化了函数的书写。操作符左边为输入的参数,而右边则是进行的操作以及返回的值Inputs=>outputs。
var array = [1, 2, 3]; //传统写法 array.forEach(function(v, i, a) { console.log(v, i, a); }); //ES6 array.forEach((v,i,a) => console.log(v,i,a));
输出
写法
var arr=[2,3] var fn = (item) => {console.log(item)}; var fn2 = item => {console.log(item)}; var fn3 = item => (item); var fn4 = item => item; fn(arr);//(2) [2, 3] fn2(arr);//(2) [2, 3] fn3(arr); fn4(arr);
// =>后使用小括号() 表示将结果作为返回值,单行结果时还可以省略当参数唯一时,还可以将前面的() 省略
注意:箭头函数不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。