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

news2024/9/30 5:30:23

目录

    • 前言
    • 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.prop
  get: ...,
  // target.prop = value
  set: ...,
  // 'prop' in target
  has: ...,
  // delete target.prop
  deleteProperty: ...,
  // 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 target
  getPrototypeOf: ...,
  // 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);
  },
  // 函数new
  construct: 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://www.coloradmin.cn/o/1913475.html

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

相关文章

视频压缩文件太大了怎么缩小?3个压缩方法分享

视频压缩文件太大了怎么缩小?当视频压缩文件过大时,缩小其大小不仅能节省宝贵的存储空间,还能显著提升文件传输速度,特别是在网络条件有限的情况下。通过专业的视频压缩软件,可以有效减少文件体积,使视频内…

五分钟带你学会Vant 4的使用

前言 本章将从零开始讲解vant组件库的使用方法 对小白极其友好,主打的就是一个读者就是上帝,你只管张嘴,我把饭嚼碎了喂给你(坏笑) 那我们就直接开始吧!!! 效果展示 登录页面展…

多会话 Telnet 日志记录器

创建一个多会话 Telnet 日志记录器可以实现对多个 Telnet 会话进行连接、监控和记录日志。以下是一个基本的 Python 示例,使用 telnetlib 库来实现多会话 Telnet 日志记录器,并使用 threading 模块来处理多个会话。 1、问题背景 我们需要编写一个脚本&a…

一天20MW!天途推出无人机全自主光伏巡检平台

01 光伏电站的运维挑战 光伏发电为人类提供了可持续的清洁能源供给。一般集中式电站建设在空旷的地区,如荒地、沙漠等地区;分布式电站建设在用户的屋顶和建筑物表面,如住宅、商业建筑、工业厂房等地区。 随着光伏电站的大规模的使用&#x…

昇思25天学习打卡营第十七天|文本解码原理--以MindNLP为例

背景 提供免费算力支持,有交流群有值班教师答疑的华为昇思训练营进入第十七天了。 今天是第十七天,从第十天开始,进入了应用实战阶段,前九天都是基础入门阶段,具体的学习内容可以看链接 基础学习部分 昇思25天学习打卡…

IF不降反增!审稿速度,比我家网速还快!3本接受率高的医学期刊,赶紧码住!

🔍 为什么选择这3本期刊? 今天老毕给大家分享3本医学 SCI,分别为Tumori Journal、Adipocyte以及Annals of Medicine。 这3本医学杂志,不仅审稿速度快,录用率还高,其中不乏接受率为48%的“毕业神刊”。2024年…

3D问界—ZBrush最新版本中的旋转Local按钮哪儿去哪儿?

问题提出:ZBrush最新版本中的Local按钮哪儿去哪儿? 目前我使用的是Zbrush2024.0.1版本,但是当我想要取消锁定局部旋转的时候死活找不到local功能。 1. 注意:Local功能挪到这里了 2. 关于local功能的使用(Local Trans…

Flink ui 本地flink ui 报错 {“errors“:[“Not found: /“]}

在学习flink 的过程中&#xff0c;伊始的flink 版本是1.17.2 报题目的错误 &#xff0c;百思不得其解&#xff0c;尝试更替了1.19.1 然后就成功了 &#xff0c;期间未做任何的修改 。 ui 默认地址 &#xff1a; http://localhost:8081 pom 文件 如下 <?xml version&qu…

Vue 3 与 TypeScript:最佳实践详解

大家好,我是CodeQi! 很多人问我为什么要用TypeScript? 因为 Vue3 喜欢它! 开个玩笑... 在我们开始探索 Vue 3 和 TypeScript 最佳实践之前,让我们先打个比方。 如果你曾经尝试过在没有 GPS 的情况下开车到一个陌生的地方,你可能会知道那种迷失方向的感觉。 而 Typ…

clean code-代码整洁之道 阅读笔记(第十七章 终章)

大纲 第十七章 味道与启发 17.1 注释 C1&#xff1a;不恰当的信息 C2&#xff1a;废弃的注释 C3&#xff1a;冗余注释 C4&#xff1a;糟糕的注释 C5&#xff1a;注释掉的代码 17.2 环境 E1&#xff1a;需要多步才能实现的构建 E2&#xff1a;需要多步才能做到的测试 …

极狐GitLab亮相世界人工智能大会,开启开源大模型赋能软件研发新时代

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab &#xff1a;https://gitlab.cn/install?channelcontent&utm_sourcecsdn 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署…

IEC62056标准体系简介-3.IEC62056-62接口类(IC)

IEC62056-62接口类将IEC 62056-61对象标识系统中的数据项进行分类、归整&#xff0c;采用对象建模的方法构造了计量仪表通信的接口模型&#xff0c;规定了计量仪表的功能、数据显示和数据交换方式等&#xff0c;是COSEM核心组成部分。COSEM把计量仪表看成是公共事业部门商业过程…

包装器 std::function

使用前&#xff0c;包头文件&#xff1a;#include <functional> std::function 是 C标准库 中的一个通用函数包装器&#xff1b; 它可以储存、复制、调用任何可调用的对象&#xff0c;包括&#xff1a;函数指针、成员函数、绑定的成员函数、lambda表达式、仿函数等。 1…

Windows 网络重置及重置网络可能出现的问题( WIFI 没有了 / WLAN 图标消失)

netsh int ip reset 命令是用于重置 Windows 操作系统中的网络设置和配置的命令。 在网络故障排除、修复网络连接问题以及清除可能存在的网络配置冲突时非常有用。 命令详解&#xff1a; netsh: 用于配置各种网络设置 int: 用于管理网络接口 ip: 用于管理网络接口的 IP 配…

【C++】———— 多态

作者主页&#xff1a; 作者主页 本篇博客专栏&#xff1a;C 创作时间 &#xff1a;2024年7月8日 一、什么是多态 什么是多态呢&#xff1f;通俗的来讲&#xff0c;就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会产生不同的状态。 举…

AI推荐系统落地的实现与应用

目录 一、推荐系统的基础二、推荐系统的设计与实现三、推荐系统落地的挑战四、推荐系统的成功案例五、结语 AI推荐系统近年来在各个领域得到了广泛应用&#xff0c;从电子商务到娱乐&#xff0c;再到个性化学习平台。它们通过分析用户行为、偏好和历史数据&#xff0c;为用户提…

一举跃升!Cancer Discovery修正后IF30.6!

在科学出版界&#xff0c;影响因子&#xff08;IF&#xff09;被广泛认为是衡量期刊学术影响力的重要指标。每年6月&#xff0c;科睿唯安会发布期刊引证报告&#xff08;JCR&#xff09;&#xff0c;但这并不是最终结果。在10月份&#xff0c;JCR会进行统一的更新&#xff0c;包…

HTML+CSS+JS 实现3D风吹草动效果(B站视频)

效果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>3D effect&…

一句话彻底搞懂Java的编译和执行过程

编译和运行可以在不同的计算机上实现。 编译阶段&#xff1a;由Javac编译器将 .Java 的源文件编译为 .class 的字节码文件&#xff1b; 运行阶段&#xff1a; jvm中Java编译器运行 .class 的字节码文件&#xff0c;运行过程中&#xff0c;类加载器从硬盘中找到该字节码文件并…

【LLM之Agent】ReAct论文阅读笔记

研究背景 论文介绍了 “ReAct” 范式&#xff0c;该范式旨在融合推理和行动的功能&#xff0c;通过让大型语言模型&#xff08;LLMs&#xff09;生成既包括言语推理轨迹又包括行动序列的输出&#xff0c;解决多种语言推理和决策任务。这种方法允许模型在与外部环境&#xff08…