ES6:JavaScript开发者的速成手册(二)

目录

    • 前言
    • Reflect API
    • Proxy
      • Proxy 与 defineProperty 的区别
    • Symbols
    • Generators
      • generator处理异步代码
    • Promise
    • Async
    • Module
      • API介绍

前言

本教程将分为两大部分深入解读ES6的精髓。将带你领略ES6的基础语法,将深入探讨ES6的高级特性,通过浅显易懂的语言和大量精炼的代码示例,为你揭开现代JavaScript的神秘面纱。帮助你深入理解并掌握ES6的强大功能。无论你是初学者还是资深开发者,本教程都将是了解ES6、提升编程技能的宝贵资源,亦可作为你随时查阅的参考手册。

在这里插入图片描述


Reflect API

优点:

  • 让Object操作都变成函数行为。
    • 比如name in objdelete obj[name],而Reflect.has(obj, name)Reflect.deleteProperty(obj, name)让它们变成了函数行为。
  • Reflect对象的方法与Proxy对象的方法一一对应, 只要是Proxy对象的方法,就能在Reflect对象上找到对应的方法。
  • 有了Reflect对象以后,很多操作会更易读。

常用语 转换成 Reflect语法:

let Obj = {name: "jack",gender: "男",
};
Obj.name; // Reflect.get(Obj,'name')
Obj.name = "proxyName";  // Reflect.set(Obj, 'name', 'proxyName');
"name" in Obj;  // Reflect.has(Obj, 'name');
delete Obj.name;  // Reflect.deleteProperty(Obj, 'name');
Object.keys(Obj) // Reflect.ownKeys(Obj); // ['name','gender']

Proxy

Proxy 可以理解成,在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写。Proxy 这个词的原意是代理,用在这里表示由它来“代理”某些操作,可以译为“代理器”。 , 结合上面Reflect的语法,我们可以函数化所有对象的操作

所有可以用的对象实例操作 , 对应的的代理操作

var handler =
{// target.propget: ...,// target.prop = valueset: ...,// 'prop' in targethas: ...,// delete target.propdeleteProperty: ...,// target(...args)apply: ...,// new target(...args)construct: ...,// Object.getOwnPropertyDescriptor(target, 'prop')getOwnPropertyDescriptor: ...,// Object.defineProperty(target, 'prop', descriptor)defineProperty: ...,// Object.getPrototypeOf(target), Reflect.getPrototypeOf(target),// target.__proto__, object.isPrototypeOf(target), object instanceof targetgetPrototypeOf: ...,// Object.setPrototypeOf(target), Reflect.setPrototypeOf(target)setPrototypeOf: ...,// Object.keys(target)ownKeys: ...,// Object.preventExtensions(target)preventExtensions: ...,// Object.isExtensible(target)isExtensible :...
}

部分代码实例

let target = function (name) {this.name = name;return "I am the target";
};
let handler = {get: function (receiver, key) {console.log("get:", receiver, key);return Reflect.get(receiver, key);},set: function (receiver, key, value) {console.log("set:", receiver, key, value);return Reflect.set(receiver, key, value);},has: function (receiver, key) {console.log("has:", receiver, key);return Reflect.has(receiver, key);},deleteProperty: function (receiver, key) {console.log("deleteProperty:", receiver, key);return Reflect.deleteProperty(receiver, key);},// 函数调用apply: function (receiver, ...args) {console.log("apply:", receiver, args);return Reflect.apply(receiver, ...args);},// 函数newconstruct: function (receiver, ...args) {console.log("construct:", receiver, args);return Reflect.construct(receiver, ...args);},ownKeys: function (receiver) {console.log("ownKeys:", receiver);return Reflect.ownKeys(receiver);},
};
//创建代理对象,后面所有的操作就对代理操作进行操作就行
let p = new Proxy(target, handler);
p.name;
p.name = "proxyName";
"name" in p;
delete p.name;
p("ziyu");
let p1 = new p("ziyu");console.log(Object.keys(p));

在这里插入图片描述

Proxy 与 defineProperty 的区别

可以阅读下我之前写的 Object.defineProperty与Proxy对比【简单易懂】

Symbols

  • ES5 的对象属性名都是字符串,这容易造成属性名的冲突。所以我们要保证每个属性的名字都是独一无二就成了发展的目标。
  • ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值。它是 JavaScript 语言的第七种数据类型,前六种是:undefined、null、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)。
  • Symbol 值通过Symbol函数生成。对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的 Symbol 类型
let s = Symbol('foo');
let s1 = Symbol('foo');
console.log(typeof s)   // "symbol"
console.log(s === s1);//有时,我们希望重新使用同一个 Symbol 值,Symbol.for()方法可以做到这一点。
let s1 = Symbol.for('foo');
let s2 = Symbol.for('foo');
console.log(s1 === s2) // true// Symbol.keyFor()方法返回一个已登记的 Symbol 类型值的key。
Symbol.keyFor(s1) // "foo"

内置的 Symbol 值

  • Symbol.hasInstance
  • Symbol.isConcatSpreadable
  • Symbol.species
  • Symbol.match
  • Symbol.replace
  • Symbol.search
  • Symbol.split
  • Symbol.iterator 前文提到的 遍历器
  • Symbol.toPrimitive
  • Symbol.toStringTag
  • Symbol.unscopables

Generators

Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同。首先可以把它理解成,Generator 函数是一个状态机,封装了多个内部状态。,执行 Generator 函数会返回一个遍历器对象, 可以依次遍历 Generator 函数内部的每一个状态。

Generator 函数是一个普通函数,但是有两个特征。一是,function关键字与函数名之间有一个星号;二是,函数体内部使用yield表达式

function* helloWorldGenerator() {yield 'hello';yield 'world';return 'ending';
}
var hw = helloWorldGenerator();
// 这是不是跟前文 遍历器 结构很像
hw.next()
// { value: 'hello', done: false }
hw.next()
// { value: 'world', done: false }
hw.next()
// { value: 'ending', done: true }
hw.next()
// { value: undefined, done: true }

Generator 函数可以不用yield表达式,这时就变成了一个单纯的暂缓执行函数。

function* f() {console.log('执行了!')
}
var generator = f();setTimeout(function () {generator.next()
}, 2000);

generator处理异步代码

这里使用到了 Promise 来让代码拥有异步功能,Promise 概念下面会介绍到

function* asyncGenerator() {yield Promise.resolve(1);yield Promise.resolve(2);yield Promise.resolve(3);
}function useAsyncGenerator() {for  (const value of asyncGenerator()) {value.then(e=>{console.log(e);})}
}useAsyncGenerator();
//1
//2
//3

Promise

Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。

详细介绍见 这篇文章 手写Promise原理全过程【看了就会】

Async

  • ES2017 标准引入了 async 函数,使得异步操作变得更加方便。
  • async 函数是什么?一句话,它就是 Generator 函数的语法糖。
  • async函数就是将 Generator 函数的星号(*)替换成async,将 yield 替换成await,仅此而已。

特点:

  • Generator 函数的执行必须靠执行器,所以才有了co模块,而async函数自带执行器
  • 返回值是 Promise。可以使用then方法添加回调函数
  • 当函数执行的时候,一旦遇到await就会先返回,等到异步操作完成,再接着执行函数体内后面的语句。
async function f() {try {await Promise.reject('出错了'); // 类似同步代码,异常能被捕获} catch(e) {}return await Promise.resolve('hello world');
}
f().then(v => console.log(v)) // hello world

Module

  • 在 ES6 之前,最主要的有 CommonJSAMD 两种。前者用于服务器,后者用于浏览器。
  • ES6 模块的设计思想是尽量的静态化使得编译时就能确定模块的依赖关系,以及输入和输出的变量。CommonJS 和 AMD 模块,都只能在运行时确定这些东西。比如,CommonJS 模块就是对象,输入时必须查找对象属性。
// CommonJS模块
let { stat } = require('fs');
// 等同于
let _fs = require('fs');
let stat = _fs.stat;
// ES6模块
import { stat } from 'fs';

上面代码的实质是从fs模块加载 stat 方法,其他方法不加载。这种加载称为“编译时加载” 或者 静态加载,即 ES6 可以在编译时就完成模块加载,效率要比 CommonJS 模块的加载方式高。由于 ES6 模块是编译时加载,使得静态分析成为可能。

API介绍

模块功能主要由两个命令构成:exportimport export命令用于规定模块的对外接口,import命令用于输入其他模块提供的功能。
特点:

  • importexport 命令只能在模块的顶层,不能在代码块之中 ,但是 import()函数 可以在代码块中,支持动态加载模块
if (condition) {import('moduleA').then(...);
} else {import('moduleB').then(...);
}
// profile.js
let firstName = 'Michael';
let lastName = 'Jackson';
let year = 1958;
//变量导出
export { firstName, lastName, year };
//默认导出
export default function () {console.log('foo');
}
//index.js 
import defaultFn , { firstName, lastName, year } from './profile.js'
//这些导出的变量都是只读的不能修改// firtName = "zs" // error 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3225703.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

UML建模案例分析-时序图和类图的消息传递

概念 类图和时序图之间的交互是通过消息,即成员函数的调用体现的。但要遵循一定的原则,可参见: 面向对象原则之一,面相对象原则之二。 例子 一个电子商务系统,会员可通过电子商务系统购买零件。具体功能需求如下&am…

防火墙组网实验配置

一、实验拓扑图: 二、实验要求: 1,DMZ区内的服务器,办公区仅能在办公时间内(9:00-18:00)可以访问,生产区的设备全天可以访问. 2,生产区不允许访问互联网,办公区和游客区允许访问互联网 3,办公区设备10.0.2.10不允许访问DMz区的FTP服务器和HTTP服务器,仅能…

分享一下我简陋的SRC兵器库

之前经常有些朋友问我挖SRC一般都用什么工具或插件,其实我之前多多少少都有分享过,今天汇总一下吧,基本上都是我目前使用率比较高的工具或插件。 0x00 首先是信息收集的攻击,我在【我挖SRC是怎么做信息收集的?】中其…

RocketMQ-六大场景实操指南

RocketMQ-六大场景实操指南 普通消息创建Topic创建Group测试消息收发 定时消息创建Topic创建Group消息发送 事务消息创建Topic创建Group消息收发 顺序消息创建Topic创建Group消息收发 另外两大场景消息异常运维体验感受初次体验给小白新手的建议进阶体验应用场景 关于云消息队列…

捷配浅谈PCB基板的导热系数如何影响性能

PCB基板的导热性重要性不言而喻,有许多材料可用作 PCB 基板,除了不同的导热性外,还提供许多其他好处。PCB 基板材料也会影响高温下对导体引起的热应力和高速/高频下的损耗。在选择超出导热系数的基板时,应考虑许多设计权衡&#x…

大模型时代:人工智能与大数据平台的深度融合

在当今的大数据时代,数据已经成为驱动业务增长和创新的关键因素。与此同时,随着人工智能技术的不断进步,AI在大规模数据处理和分析方面的能力日益强大。因此,将人工智能与大数据平台相结合,可以为企业带来巨大的商业价…

《简历宝典》07 - 发布3天就有百人订阅的《简历宝典》,做个第一阶段总结

目录 1 本篇概要 2 最初输出了糟糕的简历模板 3 简历文档名的注意事项 4 “个人信息”模块必须写的内容 5 “个人信息”模块那些非必须写的内容 5.1 校招 - 本科生 - 个人信息的展现 5.2 社招 - 专科生 - 个人信息的展现 6 最后 1 本篇概要 《简历宝典》已经输出了一…

基于Unity3D的发布第一个Rokid AR眼镜应用

发布AR眼镜Demo 一、发布配置二、快速开发第一个AR Demo场景1.创建新场景2.替换Main Camera3. 创建Capsule 三、打包apk应用四、将apk安装到Rokid Master Pro 眼镜1.WiFI-ADB连接AR Studio 与PC2.USB直连Rokid眼镜安装3.运行查看应用 五、Rokid AR系列教程 一、发布配置 UXR2.…

Github Action 自动部署更新静态网页服务

本文首发于 Anyeの小站,点击跳转 获得更优质的阅读体验 前言 贴一段胡话 在用过 应用:静态网页服务 之后,事实证明: 总而言之,自动化是一个很令人着迷的东西,摆脱重复繁琐的工作,解放了双手的…

MES:连接计划与执行的桥梁

想象一下,你的企业拥有一份完美的生产计划,但如何将这份计划准确无误地转化为实际生产中的每一步操作?这就是MES大展身手的地方。MES作为ERP(企业资源计划)与车间自动化控制之间的桥梁,确保生产计划能够顺畅…

校准报告可以引用数据与加盖CNAS章吗?

在咨询校准机构在给他们出具校准报告/证书时,是否可以引用数据,引用数据部分是不是可以加盖CNAS章? 首先,了解一下报告中带CNAS的含义:CNAS-CL01:2018 文件第一章中提出“本准则规定了实验室能力、公正性以及一致运作的…

超越单兵作战:多智能体 Multi-Agent System (MAS)

超越单兵作战:多智能体 Multi-Agent System (MAS) Multi-Agent System 是指一个系统中有多个智能体同时工作的情况。在这样的系统中,每个智能体都具有一定程度的自主性,可以独立执行任务、做决定,并且能够与其他智能体进行交互&a…

为什么贷款都看大数据信用?怎么查大数据报告?

在当今数字化时代,大数据的应用已经深入到各个领域,其中金融行业尤为突出。很多朋友都有疑问,为什么贷款总会查自己的大数据信用?去哪里查?本文就为大家详细的分析一下,一起去看看吧。 一、贷款查大数据信用的几个原因&#xff…

哪些行业更需要TPM管理咨询公司?

当下,TPM(全面生产维护)作为一种旨在提高设备效率、降低维护成本的管理理念,已经被越来越多的行业所认可和采纳。然而,不同行业因其特性和需求的不同,对TPM管理咨询公司的需求也各有侧重。下面将探讨哪些行…

3年经验的B端产品经理,应该是什么水平?

问你一个问题:你觉得3年经验的B端产品经理,应该是什么水平?很多朋友可能也没有仔细想过,自己3年后应该达到一个什么水平?能做什么体量的业务?要能拿多少薪资? 前几天和一个B端产品经理聊天&…

二手市场遗落的上古神器:蜗牛星际NAS J1900和Think Pad X230的三代超值CPU

二手市场有几件神器,比如蜗牛星际NAS套件,从2019年到现在,价格一直稳定小幅攀升,彻底打破了电脑产品价格连年下降的常规印象。 Think Pad X230配置的三代CPU,性能吊打4代、5代CPU,一直到7代,才被…

Codeforces Round 956 F. array-value 【01Trie查询异或最小值】

题意 给定一个非负整数数组 a a a 对每个长度至少为 2 2 2 的子数组&#xff0c;定义其权值为&#xff1a;子数组内两两异或值最小值 即 b ⊂ a [ l , r ] , w ( b ) min ⁡ l ≤ i < j ≤ r { a i ⨁ a j } b \subset a[l, r], \quad w(b) \min_{l \leq i < j \le…

WPF的UI布局

WPF 的 UI 布局 XAML的优点 ui和动画更专业-好用 简单易懂&#xff0c;结构清晰-易学 使设计师直接参与软件开发&#xff0c;随时沟通无需二次转化-高效 真正实现了UI和逻辑的剥离(ui集中在ui层、逻辑代码集中在程序逻辑层&#xff0c;形成高内聚低耦合的结构) XAML是一种…

Paimon下载使用和基础操作说明

简介 Apache Paimon 是一种湖格式&#xff0c;支持使用 Flink 和 Spark 构建实时湖仓一体架构 用于流式处理和批处理操作。Paimon创新性地将湖格式与LSM&#xff08;Log-structured merge-tree&#xff09;相结合 结构&#xff0c;将实时流式更新引入 Lake 架构。 Paimon提供以…

AGE agtype 简介

AGE 使用一种名为 agtype 的自定义数据类型&#xff0c;这是 AGE 返回的唯一数据类型。agtype 是 Json 的超集&#xff0c;也是 JsonB 的自定义实现。 简单数据类型 Null 在Cypher中&#xff0c;null用于表示缺失或未定义的值。概念上&#xff0c;null表示“缺失的未知值”&…