ES6新特性,小技巧

以下为个人理解,如有错误之处,欢迎指出。

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。但可以有多个export3.当用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 []
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值