Skip to main content

ES6 新增

Map & WeakMap

  1. Map
    • map对象继承自object,可以通过原型继承去调用object身上原型方法
    • map实例对象能通过for...of , 普通对象实例只能通过 for...in
    • map的key是有序的插入的时间顺序, 普通对象的key是无序的
    • map对象的key可以是任何类型的值, 普通对象的key只能是string 和 symbol
  2. WeakMap
    • 它可用的API功能与map一致, 但是他的key值不能是原始数据类型, 会报错
    • 弱引用键名, 键名的引用一旦消除, weakmap中保存的对应键值对也会自动消失
    const map = new Map([
['key1','val1']
['key2','val2']
])

console.log(map.size) // 2 获取长度
console.log(map.has('key1')) // true // 判断存不存在这个key
console.log(map.get('key1')) // val1 // 获取当前键的值 没有 则返回 undefined
map.set('key3','value3') // 添加一组键值对 map 的key值插入是有序的 object 是无序的
console.log(map.delete('key3')) // 删除 对应的key 操作成功返回true 否则 false
map.clear() // 清空map集合所有键值对

for(const [key,value] of map.entries()) {
console.log(key, value)
}
// 遍历map集合 输出对应key value
map.entries() === map[Symbol.Iterator] // true Iterator 迭代器

Array.from(map) or [...map] // 可以将map集合转为二维数组

map.forEach((value,key,map) => {console.log(key, value, map)})

console.log(map.keys()); // [Map Iterator] { 'key1', 'key2', 'key3' }
console.log(map.values()); // [Map Iterator] { 'val1', 'val2', 'val3' }

Set & WeakSet

  1. Set
    • set 的Api 与 map一致, 但是没有 get(...) 方法
    • 我们一般使用set进行数组去重
  2. WeakSet
    • 与set 的Api 相同
    • 也是弱映射
const s = new Set(["val1", "val2", "val3"]);
s.add(111);
s.delete("val1");

console.log(s.has("val1")); // true
console.log(s.values()); // [Set Iterator] { 'val2', 'val3', 111 }
console.log(s.keys()); // [Set Iterator] { 'val2', 'val3', 111 }

s.forEach((key, value) => {
console.log(key, value);
});
// val2 val2
// val3 val3
// 111 111
const result = [1, 2, 3, 4, 5, 5, 6, 7, 7, 7, 8];

console.log([...new Set(result)]); // [1, 2, 3, 4, 5, 6, 7, 8];

Reflect 反射对象

Proxy 代理对象

Proxy 对目标对象建立一层拦截, 可以对外界的操作进行过滤和改写

Proxy也是存在代理局限性的,因为你操作源对象时,捕获器并不会被触发

下面是 Proxy 支持的拦截操作一览,一共 13 种。

  • get(target, propKey, receiver):拦截对象属性的读取,比如proxy.foo和proxy['foo']
  • set(target, propKey, value, receiver):拦截对象属性的设置,比如proxy.foo = v或proxy['foo'] = v,返回一个布尔值。
  • has(target, propKey):拦截propKey in proxy的操作,返回一个布尔值。
  • deleteProperty(target, propKey):拦截delete proxy[propKey]的操作,返回一个布尔值。
  • ownKeys(target):拦截Object.getOwnPropertyNames(proxy)、Object.getOwnPropertySymbols(proxy)、Object.keys(proxy)、for...in循环,返回一个数组。该方法返回目标对象所有自身的属性的属性名,而Object.keys()的返回结果仅包括目标对象自身的可遍历属性。
  • getOwnPropertyDescriptor(target, propKey):拦截Object.getOwnPropertyDescriptor(proxy, propKey),返回属性的描述对象。
  • defineProperty(target, propKey, propDesc):拦截Object.defineProperty(proxy, propKey, propDesc)、Object.defineProperties(proxy, propDescs),返回一个布尔值。
  • preventExtensions(target):拦截Object.preventExtensions(proxy),返回一个布尔值。
  • getPrototypeOf(target):拦截Object.getPrototypeOf(proxy),返回一个对象。
  • isExtensible(target):拦截Object.isExtensible(proxy),返回一个布尔值。
  • setPrototypeOf(target, proto):拦截Object.setPrototypeOf(proxy, proto),返回一个布尔值。如果目标对象是函数,那么还有两种额外操作可以拦截。
  • apply(target, object, args):拦截 Proxy 实例作为函数调用的操作,比如proxy(...args)、proxy.call(object, ...args)、proxy.apply(...)。
  • construct(target, args):拦截 Proxy 实例作为构造函数调用的操作,比如new proxy(...args)。

var arr = [1,2,3,4]
console.log(arr[-1]) // 我想让他输出 4

function createArray(arr) {
let handle = {
get: function(target, index, recvie) {
index = Number(index)
if(index < 0){
index += target.length
}
return Reflect.get(target,index,recvie)
}
}
return new Proxy(arr, handle)
}

arr[-1]

Promise

  • 三个状态

    1. pendding - 进行中
    2. fufilled - 已成功
    3. rejected - 已失败
  • Promise.prototype.then() 接收两个回调函数 resolve , reject 返回一个新的Promise实例

  • Promise.prototype.catch() 接收一个error对象 , promise 状态如果变成reject就会调用 catch回调, 另外 promise.then()回调中,如果出现的错误也会调用catch()

  • Promise.prototype.finally() 不管promise状态是什么, 再then() 或者 catch() 执行完后会执行

  • Promise.all([p1,p2,p3]).then((res1,res2,res3)) 将多个promise实例放在一起包装成一个新的promise实例, 其中所有的状态都变成fufilled, 或者其中一个变成rejected, 才会去执行回调函数

  • Promise.race([p1,p2,p3]).then((res1,res2,res3)) 同上, 但是其中有一个结果变成fufilled或者rejected ,就会去执行回调函数

  • Promise.AllSettled([1,2,3]) 同上, 但是只有等到着三个请求都结束,不管成功还是失败,才会执行后续的回调函数

  • Promise.any([1,2,3]) 同race(), 只有一点不同,就是Promise.any()不会因为某个 Promise 变成rejected状态而结束,必须等到所有参数 Promise 变成rejected状态才会结束。

  • Promise.resolve() 将现有对象转换为promise对象

    Promise.resolve('foo')
    // 等价于
    new Promise(resolve => resolve('foo'))
  • Promise.reject() 同上

  • Promise.try() 不知道函数内部是同步还是异步执行,或者不想处理, 类似于try...catch

    Promise.try(() => database.users.get({id: userId}))
    .then(...)
    .catch(...)