惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
爱范儿
爱范儿
J
Java Code Geeks
L
LangChain Blog
V
V2EX
大猫的无限游戏
大猫的无限游戏
S
SegmentFault 最新的问题
博客园 - Franky
Microsoft Azure Blog
Microsoft Azure Blog
Jina AI
Jina AI
Blog — PlanetScale
Blog — PlanetScale
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The Cloudflare Blog
博客园 - 司徒正美
B
Blog
G
Google Developers Blog
Stack Overflow Blog
Stack Overflow Blog
罗磊的独立博客
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Apple Machine Learning Research
Apple Machine Learning Research
Engineering at Meta
Engineering at Meta
MyScale Blog
MyScale Blog
有赞技术团队
有赞技术团队
Hugging Face - Blog
Hugging Face - Blog

博客园 - linFen

Ubuntu下使用ProcDump ubuntu 20.04 搭建 ProcDump Anaconda 常用命令 记录codesmith 断点调试弹不了vs Vue模板语法——键盘事件修饰符 Vue模板语法——事件修饰符 Vue模板语法——v-on 事件绑定 Vue模板语法——v-model 双向数据绑定 Vue模板语法——v-once 数据响应式 Vue模板语法——数据绑定指令 Vue模板语法——v-cloak vue响应性原理 css其他 JS其他 前端VUE 前端 vue 中slot Vue 之 Mixins (混入) Vue 响应性
ES6其他
linFen · 2024-01-28 · via 博客园 - linFen

1、    es6 symbol

       ES6 引入了一种新的原始数据类型 Symbol ,表示独一无二的值,最大的用法是用来定义对象的唯一属性名。

let sy = Symbol("key1");   let syObject = {};
syObject[sy] = "kk";
console.log(syObject);    // {Symbol(key1): "kk"}

2、    es6 Map对象

Map 对象保存键值对。任何值(对象或者原始值) 都可以作为一个键或一个值。

一个 Object 的键只能是字符串或者 Symbols,但一个 Map 的键可以是任意值:字符串、对象、函数、NaN。包括set(),get()方法。

复制代码

       let myMap=new Map([
              ['(',')'],
              ['[',']'],
              ['{','}']
       ]);
    if (myMap.has(ch)) {
      console.log(myMap.get(ch));
    }

复制代码

3、    es6 Set对象

Set 对象允许存储任何类型的唯一值,无论是原始值或者是对象引用。作用数组去重、数组合并等。

var mySet = new Set([1, 2, 3, 4, 4]);
[...mySet]; // [1, 2, 3, 4]  直接输出mySet,是set对象。

4、    es6 proxy代理

       Proxy代理可以对目标对象的读取、函数调用等操作进行拦截,然后进行操作处理。它不直接操作对象,而是像代理模式。

       Proxy 对象由两个部分组成: target(目标对象), handler(代理的指定行为)。

       作用:拦截读取、拦截函数调用、拦截删除、拦截new、拦截原型等。

       应用场景:1、数据校验。2、设置不可读不可写属性。3、创建通用dom。

5、   es6 Reflect反射  (观察者模式应用)

       Reflect可以用于获取目标对象的行为,它与Object类似,它的方法与Proxy 是对应的。

A、   Reflect.get(target, name, receiver) 查找并返回target对象的name属性。

B、   Reflect.set(target, name, value, receiver) 赋值

C、   Reflect.has(obj, name) 是 name in obj 指令的函数化,用于查找 name 属性在 obj 对象中是否存在。

组合使用(ReflectProxy

复制代码

let exam = {name: "Tom",age: 24}
let handler = {
    get: function(target, key){
        return Reflect.get(target,key); //等同于retrun target[key];
    },
    set: function(target, key, value){
        Reflect.set(target, key, value);
    }
}
let proxy = new Proxy(exam, handler)
proxy.name = "Jerry"  proxy.name // "Jerry"

复制代码

6、    es6 Iterator迭代器

       迭代器是一个接口,只要数据结构暴露了一个iterator的接口,那就可以完成迭代。ES6创造了一种新的遍历命令for...of循环,Iterator接口主要供for...of消费。通过一个键为Symbol.iterator 的方法来实现。

       迭代器是带有特殊接口的对象。含有next()方法,调用返回包括value(当前位置的值)和done(是否迭代完)的对象,当done为true的时候,调用next就无效了。

       可迭代的对象:Array、Map、Set、String、TypedArray、函数中的 arguments 对象、NodeList 对象。普通对象不能迭代。

const items = ["zero", "one", "two"];
const it = items[Symbol.iterator]();
it.next();// >{value: "zero", done: false} 

调用迭代器的场合

1)      解构赋值

2)      扩展运算符

3)      Generator 函数中的 yield* 表达式

4)      or..of

5)      Array.from

6)      Map()、Set()、WeakMap()、WeakSet()

7)      Promise.all()//任务并行

8)      Promise.race()//任务竞赛

for of的特点

1)      有着同 for...in 一样的简洁语法,但是没有 for...in 那些缺点

2)      不同于 forEach 方法,它可以与 break、continue 和 return 配合使用

3)      提供了遍历所有数据结构的统一操作接口

7、    es6 Promise对象

这种“承诺将来会执行”的对象在JS中称为Promise对象。

复制代码

       function test(resolve, reject) {
              var timeOut = Math.random() * 2;
              setTimeout(function () {
                     if (timeOut < 1) {resolve(‘timeOut’);}
                     else {reject(‘error’);}
              }, timeOut * 1000);
       }

       new Promise(test).then(function (result) {
               console.log('成功:' + result);
       }).catch(function (reason) {
               console.log('失败:' );
       });

复制代码

在使用JavaScript时,为了实现某些逻辑经常会写出层层嵌套的回调函数,如果嵌套过多,会极大影响代码可读性和逻辑,这种情况也被成为回调地狱。代码阅读性差。

Promise.all()  这两个任务是可以并行执行的

Promise.race() 多个异步任务是为了容错,只需要获得先返回的结果即可。

8、    es6 Generator(生成器)

Generator函数,可以通过yield关键字,把函数的执行流挂起。Generator有两个区分于普通函数的部分:

一是在 function 后面,函数名之前有个 * ;

二是函数内部有yield表达式。

调用 Generator 函数和调用普通函数一样,在函数名后面加上()即可,但是 Generator 函数不会像普通函数一样立即执行,而是返回一个指向内部状态对象的指针,所以要调用遍历器对象Iterator 的 next 方法,指针就会从函数头部或者上一次停下来的地方开始执行。

复制代码

function* func(){
    yield '1';
    yield '2';
    return '3';
}
var f=new func();
f.next();// {value: "1", done: false}
f.next();// {value: "2", done: false}
f.next();// {value: "3", done: true}
f.next();// {value: undefined, done: true}

复制代码

应用:1、逐行读取文本文件;2、控制流管理;3、利用 Generator 函数,可以在任意对象上部署 Iterator 接口。

9、    es6 async/await函数

async/await使得异步代码看起来像同步代码。

async 函数返回一个Promise对象,可以使用then方法添加回调函数。

复制代码

async function helloAsync(){
    return "helloAsync";
  }
console.log(helloAsync())  // Promise {<resolved>: "helloAsync"}
helloAsync().then(v=>{
   console.log(v);         // helloAsync
})

复制代码

async 函数执行时,如果遇到 await 就会先暂停执行,等到触发的异步操作完成后,恢复 async 函数的执行并返回解析值。await关键字只能用在async定义的函数内。

await针对所跟不同表达式的处理方式:

  • Promise 对象:await会暂停执行,等待 Promise 对象 resolve,然后恢复 async 函数的执行并返回解析值。
  • 非 Promise 对象:直接返回对应的值。

Promise的区别

1)      Promise的出现解决了传统callback函数导致的“地域回调”问题,但它的语法导致了它向纵向发展行成了一个回调链,遇到复杂的业务场景,这样的语法显然也是不美观的。而async await代码看起来会简洁些,使得异步代码看起来像同步代码。

2)      async await与Promise一样,是非阻塞的。

3)      async函数就相当于自执行的Generator函数。遵循的是Generator 函数的语法糖。它不能用于普通的回调函数。

async必须以一个Promise对象开始 ,所以async通常是和Promise结合使用的。直接将参数从then里取出来,相比promise的链式调用,传参更加方便,异步顺序更加清晰。

复制代码

function testAwait(){
   return new Promise((resolve) => {
       setTimeout(function(){
          console.log("testAwait");
          resolve();
       }, 1000);
   });
}

async function helloAsync(){
await testAwait();
     await testAwait();
     console.log("helloAsync");
 }
helloAsync();

复制代码

10、 es6 字符串扩展

       includes(), startsWith(), endsWith() 返回布尔值,都支持第二个参数,表示开始搜索的位置。

       repeat方法返回一个新字符串,表示将原字符串重复n次。

       padStart()用于头部补全,padEnd()用于尾部补全。

       trimStart()消除字符串头部的空格,trimEnd()消除尾部的空格,返回的都是新字符串