前言
ECMAScript6相对于以前的JS来说是一个重要的版本更新,以下内容只节选了其中比较常用的语法更新
let、const、global
let
用来申明变量,只在申请的代码块中生效,且在使用时必须先声明.
const
为常量申明,申明后不可改变
global
浏览器中,顶层对象是window,但 Node环境下为global(window为undefine).
解构语法
只要是可遍历(Iterator)对象,就可对其解构
let arr = [1,2,3]
let [a, b, c, d=2] = arr // a= 1, b = 2,c = 3 .d = 2
let dict = { 'age': 123, 'name': 112 }
let { name, age } = dict //name = 112 , age = 123
let str = '1df32sdfs'
let [a, b, c] = str //a = 1 b = d c = f
函数扩展
默认参数
function (a, b = 3) {
}
rest参数
function add(...values) {
let sum = 0;
for (var val of values) {
sum += val;
}
return sum;
}
add(2, 5, 3) // 10
箭头函数
箭头函数中的this为定义时所在的对象,不可使用yield命令
let add = ( x, y ) => { return x + y }
add(2, 3) //5
对象扩展
方法简写
var o = {
method() {
return "Hello!";
}
};
// 等同于
var o = {
method: function() {
return "Hello!";
}
};
导出模块和导入模块
module.exports = { getItem, setItem, clear };
// 等同于
module.exports = {
getItem: getItem,
setItem: setItem,
clear: clear
};
Set & Map
set
可以理解为值唯一的数组
let a = new Set([1,2,3,4,1,'1']) //a 含有 1 2 3 4 '1'
Map
相对于对象,其中的key不止用字符串
let a = ['1']
let map1 =new Map()
map.set(a:'value')
map.get(a)
size
let map1 =new Map()
let b = map1.size // 0
map.set('a':'value')
let c = map1.size // 1
let isHas = map1.has('a') //true
添加属性
for ( let a in dict)
obj[a] = dict[a]
Proxy
外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写,但是不适用箭头函数时 this会指向代理对象,所以可以将proxy指向对象自身. new Proxy(obj, obj)
obj对象在调用set get has时会打印详情
var obj = new Proxy({}, {
get: function (target, key, receiver) {
console.log(`getting ${key}!`);
return Reflect.get(target, key, receiver);
},
set: function (target, key, value, receiver) {
console.log(`setting ${key}!`);
return Reflect.set(target, key, value, receiver);
}
has: function (target, propKey){
console.log('has$(propKye)')
return Reflect.has(target,proKey)
}
});
Reflect
提供函数,使得对于对象的属性或方法的的操作都变成函数行为
old
name in obj
delete obj[name]
new
Reflect.has(obj, name)
Reflect.deleteProperty(obj, name)
提供方法
Reflect.get(target, name, receiver) //get属性/方法
Reflect.set(target, name, value, receiver) //set属性/方法
Reflect.has(obj, name) //判断属性方法
Reflect.construct(target, args) //new方法
Reflect.getPrototypeOf(obj) //get属性
Reflect.setPrototypeOf(obj,value) //set 属性
Reflect.apply(func, thisArg, args) //调用方法
Promise
Promise 是异步编程的一种解决方案,创建一个Promise对象,然后在对应操作完成时return resolve或者reject来回调结果
function getData () {
return new Promise(resolve, reject) {
//get date
if (isSuccess){
return resolve(data)
} else {
return reject(err)
}
}
}
});
getDate().then((data)=>{}).catch((err)=>{})
Iterator
js可遍历的类型主要是数组(Array)和对象(Object),ES6 又添加了Map和Set.
Iterator 的遍历过程是这样的。
- 创建一个指针对象,指向当前数据结构的起始位置。也就是说,遍历器对象本质上,就是一个指针对象。
- 第一次调用指针对象的next方法,可以将指针指向数据结构的第一个成员。
- 第二次调用指针对象的next方法,指针就指向数据结构的第二个成员。
- 不断调用指针对象的next方法,直到它指向数据结构的结束位置。
自定义对象只需要实现next
方法,返回值或者终止判定(如:undefine,-1,null)则可具有遍历属性,return
throw
可以在遍历完成/错误时进行操作(清空资源,输出错误信息)
Generator
Generator 函数是 ES6 提供的一种异步编程解决方案,Generator 函数是一个普通函数,但是有两个特征。一是,function关键字与函数名之间有一个星号;二是,函数体内部使用yield表达式,定义不同的内部状态(yield在英语里的意思就是“产出”)。
function* helloWorldGenerator() {
yield 'hello';
let c = yield 'world';
return 'ending';
}
var func = helloWorldGeneratot() //在定义时不执行任何代码
let step1 = func.next() //'hello'
let step2 = func.next('!') // 'world' c = '!'
let step3 = func.next() //'ending'