以下为个人理解,如有错误之处,欢迎指出。
1.变量声明let和const
在ES6以前,var关键字声明变量。无论声明在何处,都会被视为声明在函数的最顶部(不在函数内即在全局作用域的最顶部),这就是函数变量提升。
ES6,我们通常用let和const来声明,let表示变量、const表示常量,let和const都是块级作用域,避免变量提升的问题。
console.log(str1);//undefined
console.log(str2);//报错:str2 is not defined
var str1=1;
let str2=2;
const声明的是常量,值不可被改变:
const str3=3;
const str3=4;//报错:Identifier 'str3' has already been declared
2.,模版字符串
更简便的实现字符串拼接:
const str3='the';
console.log(`Hello ${str3} world!`);//Hello the world!
`就是键盘‘~’键,在英文输入法下直接打出。
3.箭头函数
这是个伟大的创举,既简化了写法,又避过了函数的this指针问题,例如:
const person={
'sex':'male',
'say':function(){
setTimeout(function(){
console.log(this.sex);//undefined
})
}
}
person.say();
因为此时this指向的不是person了,而是window(匿名函数this都指向window),以前的解决办法一般是:在say()方法里声明一个变量that来接收this,需要调用person对象时就以that代替,不方便。有了箭头函数就可以这样写:
const person={
'sex':'male',
'say':function(){
//ES5的写法
//var that=this;
//setTimeout(function(){
// console.log(that.sex);//male
//})
//ES6的写法
setTimeout(()=>console.log(this.sex))//male
}
}
person.say();
4.import 和 export
import导入模块、export导出模块
1.当用export default people导出时,就用 import people 导入(不带大括号)。
2.一个文件里,有且只能有一个export default。但可以有多个export。
3.当用export name 时,就用import { name }导入(记得带上大括号)。
4.当一个文件里,既有一个export default people, 又有多个export name 或者 export age时,导入就用 import people, { name, age } 。
5.当一个文件里出现n多个 export 导出很多模块,导入时除了一个一个导入,也可以用import * as example。
5.Promise
语法:
new Promise( function(resolve, reject) {...} /* executor */ )
Promise构造函数执行时立即调用executor 函数, resolve 和 reject 两个函数作为参数传递给executor(executor 函数在Promise构造函数返回新建对象前被调用)。resolve 和 reject 函数被调用时,分别将promise的状态改为fulfilled(完成)或rejected(失败)。executor 内部通常会执行一些异步操作,一旦完成,可以调用resolve函数来将promise状态改成fulfilled,或者在发生错误时将它的状态改为rejected。
new Promise(function(resolve, reject) {
let timeOut = Math.random() * 2;
console.log(timeOut);//随机数
setTimeout(function() {
if(timeOut < 1) {
resolve('200 OK');
} else {
reject('timeout in ' + timeOut + ' seconds.');
}
}, timeOut * 1000);
}).then(function(r) {
console.log('Done: ' + r);//若timeOut<1,输出
}).catch(function(reason) {
console.log('Failed: ' + reason);//若timeOut>1,输出
});
6.生成器generator
生成器是一种返回迭代器的函数,通过function关键字后的星号(*)来表示,函数中会用到新的关键字yield。星号可以紧挨着function关键字,也可以在中间添加一个空格。生成器每当执行完一条yield语句后函数就会自动停止执行,直到再次调用迭代器的next()方法。
function *createIterator(items) {
for (let i = 0; i < items.length; i++) {
yield items[i];
}
}
let iterator = createIterator([1, 2, 3]);
console.log(iterator.next()); // "{ value: 1, done: false }"
console.log(iterator.next()); // "{ value: 2, done: false }"
console.log(iterator.next()); // "{ value: 3, done: false }"
console.log(iterator.next()); // "{ value: undefined, done: true }"
// 之后的所有调用
console.log(iterator.next()); // "{ value: undefined, done: true }"
7.函数默认参数值
ES6支持对函数设置默认参数值,在调用函数时如没有给相应参数赋值,则使用默认值:
let ab=(a=1,b=2)=>a+b;
console.log(ab());//3
也可强制要求参数必须,比如我们写了一个require()函数作为参数的默认值,如果没有传参,则默认require(),然后抛出错误:
const require=()=>{throw new Error('Missing parameter!')};
let ab=(a=require(),b=require())=>a+b;
console.log(ab(1,2));//3
console.log(ab(1));//报错:Missing parameter!
8.reduce
reduce可以对数组进行操作,接受4个参数,第一个为返回参数,第二个为数组每一项,第三个为索引,第四个为数组本身:
let numbers=[10,20,30,40];
//finalList为返回参数,num为数组每一项,index为索引
let doubleOver50=numbers.reduce((finalList,num,index,arr)=>{
console.log(index);//0 1 2 3
console.log(arr);//[10,20,30,40]
num=num*2;
if(num>50){
finalList.push(num)
}
return finalList
},[])
console.log(doubleOver50); [60, 80]
9.展开运算符(…)
可用来解构数组:
let numbers=[10,20,30,40];
console.log(...numbers);//10 20 30 40
展开运算符还可以用来合并对象,相同部分后者覆盖前者:
let obj1={a:1,b:2,c:3};
let obj2={b:20,c:30,d:40};
console.log({...obj1,...obj2});//{a: 1, b: 20, c: 30, d: 40}
10.Set对象
Set的值具有唯一性,因此可以用来做数组去重:
let numbers2=[1,2,2,2,3,6,6,8,8,9];
console.log(new Set(numbers2));{1, 2, 3, 6, 8, 9}
Set有一系列方法:
console.log(new Set(numbers2).add(10));//{1, 2, 3, 6, 8, 9, 10} 添加操作
console.log(new Set(numbers2).delete(3));//true 删除操作,此处返回布尔值,表示删除成功
console.log(new Set(numbers2).has(3));//true 查找操作,返回布尔值
console.log(new Set(numbers2).clear());//undefined 清空所有成员,没有返回值
console.log(new Set(numbers2).forEach((item)=>console.log(item)));
//1 2 3 6 8 9 undefined 在回调函数里遍历每一项,本身没有返回值
11.数组的结构赋值
ES6允许按照一定的模式,从数组和对象中提取值,对变量进行赋值:
let [foo,[[bar],baz]] = [1,[[2],[3,6]]];
console.log(foo,bar,baz);//1 2 [3, 6]
let [,,third] = ["foo","bar","baz"];
console.log(third);//baz
let [head,...tail] = [1,2,3,4];
console.log(head,tail);//1 [2, 3, 4]
let [x,y,...z] = ['a'];
console.log(x,y,z);//a undefined []