ES6真题合集(二)

ES6真题合集(二)

    • 6. ES6中 Module
      • 6.1 导出(Export)
      • 6.2 导入(Import)
    • 7. ES6中 Generator
      • 7.1 基础用法
      • 7.2 特点
      • 7.3 应用场景
    • 8. ES6中 Decorator
      • 8.1 基础用法
    • 9. ES6新增Set、Map两种数据结构
      • 9.1 Set
      • 9.2 Map
      • 9.3 对比
      • 9.4 案例
    • 10. ES6中 Proxy
      • 10.1 基础用法
      • 10.2 处理器对象

6. ES6中 Module

模块(Module)是一个重要的特性,它允许开发者将代码分割成独立的、可复用的单元,每个单元都有自己的作用域。ES6模块通过import和export关键字来实现模块之间的导入和导出。

6.1 导出(Export)

可以使用export关键字来导出函数、对象、原始值或类。一个模块可以导出多个值。

// math.js  
export function add(x, y) {  return x + y;  
}  export function subtract(x, y) {  return x - y;  
}  // 或者使用花括号({})来导出多个值  
// 这种方式也允许你重命名导出的值  
function multiply(x, y) {  return x * y;  
}  export { multiply as mult };  // 还可以导出整个模块的内容  
export * from 'anotherModule';  // 导出默认值  
const pi = 3.14159;  
export default pi;

6.2 导入(Import)

在另一个模块中,你可以使用import关键字来导入已导出的函数、对象或值。

// main.js  
// 导入命名导出  
import { add, subtract } from './math.js';  console.log(add(1, 2)); // 输出 3  
console.log(subtract(2, 1)); // 输出 1  // 导入重命名的导出  
import { mult as multiply } from './math.js';  console.log(multiply(2, 3)); // 输出 6  // 导入整个模块的内容  
import * as math from './math.js';  console.log(math.add(1, 2)); // 输出 3  // 导入默认值  
import pi from './math.js';  console.log(pi); // 输出 3.14159(注意:这里默认导出的是pi,而不是整个math模块)  // 导入默认值并给它一个别名  
import myPi from './math.js';  console.log(myPi); // 输出 3.14159注意点:
1.ES6模块是静态的,这意味着在编译时(而不是运行时)就确定了导入和导出的内容。
2.ES6模块默认是严格模式(strict mode),即代码在严格模式下运行。
3.ES6模块支持循环依赖,但应该尽量避免,因为它们可能导致难以预料的结果。
4.在浏览器中,可以通过<script type="module">标签来加载ES6模块。在Node.js中,从v12开始,可以使用.mjs文件扩展名或package.json中的"type": "module"字段来启用ES6模块支持。
5.ES6模块提供了一个内置的模块作用域,这意味着模块顶层的变量和函数声明在模块内部是私有的,只有通过export才能被外部访问。

7. ES6中 Generator

Generator(生成器)是一种特殊的函数,它允许你暂停和恢复函数的执行。这主要通过function*语法和yield关键字来实现。Generator函数在执行过程中,遇到yield表达式就暂停执行,并返回一个遍历器对象。这个遍历器对象可以记录当前Generator函数的执行上下文,以便后续再次调用时从该位置继续执行。

7.1 基础用法

Generator函数的声明方式是在function关键字后添加一个星号*。函数体内部使用yield表达式来定义每次返回的表达式。

function* generatorFunction() {  yield 'Hello';  yield 'World';  return 'ending';  
}  const generator = generatorFunction();  console.log(generator.next().value); // 输出 "Hello"  
console.log(generator.next().value); // 输出 "World"  
console.log(generator.next().value); // 输出 "ending"  
console.log(generator.next().value); // 输出 undefined,因为已经执行完毕

7.2 特点

  • 暂停执行:Generator函数在执行过程中,遇到yield表达式就会暂停执行,返回遍历器对象的指针。
  • 恢复执行:通过调用遍历器对象的next()方法,可以恢复Generator函数的执行,并从上次暂停的位置继续执行。
  • 状态可控:由于Generator函数可以暂停和恢复执行,因此可以通过编程来控制其执行状态。
  • 返回值:每次调用next()方法时,会返回一个对象,该对象包含两个属性:value和done。value属性表示当前yield表达式的值,done属性表示Generator函数是否已经执行完毕。当done为true时,value表示返回的最终结果。

7.3 应用场景

  • 异步编程:Generator函数常与Promise结合使用,实现异步编程的流程控制。通过yield表达式来等待异步操作的结果,然后恢复执行后续的代码。这种方式可以使异步代码看起来更加同步,易于理解和维护。
  • 控制流程:Generator函数可以用于控制函数的执行流程,例如实现迭代器、协程等。
  • 数据懒加载:由于Generator函数可以暂停和恢复执行,因此可以实现数据的懒加载。即只有在需要时才加载数据,从而节省内存和网络带宽。
  • 简化复杂操作:对于一些复杂的操作,可以将其拆分成多个步骤,并使用Generator函数来组织这些步骤。这样可以使代码更加清晰、易于理解和维护。

案例:

异步编程的同步化表达

function* fetchData(url) {  try {  const response = yield fetch(url); // 发起异步请求  if (!response.ok) {  throw new Error(`HTTP error! status: ${response.status}`);  }  const data = yield response.json(); // 等待异步请求结果并解析为JSON  console.log(data); // 输出获取到的数据  } catch (error) {  console.error('There has been a problem with your fetch operation:', error);  }  
}  // 实例化Generator函数  
const getData = fetchData('https://api.example.com/data');  // 启动Generator函数  
getData.next().value // 返回一个Promise对象  .then(response => getData.next(response).value) // 传入response到下一个yield  .then(data => getData.next(data)) // 如果没有yield,则不需要传入值  .catch(error => getData.throw(error)); // 如果有错误,则抛出异常

控制抽奖次数

function draw() {  // 具体抽奖逻辑  console.log('抽奖一次!');  
}  function* residue(count) {  while (count > 0) {  count--;  yield draw(); // 每次抽奖都yield一个表达式(在这里是draw函数的调用)  }  console.log('抽奖结束!');  
}  // 实例化Generator函数并传入初始抽奖次数  
let star = residue(5);  // 模拟用户点击抽奖按钮  
for (let i = 0; i < 5; i++) {  star.next(); // 每次点击都调用next()方法  
}

8. ES6中 Decorator

在ES6中,Decorator(装饰器)是一个实验性的特性,用于修改类的行为或属性。它本质上是一个用于类声明、方法、属性或参数上的设计模式,它允许你添加额外的功能到类声明、方法、属性或参数上,而无需修改其本身的代码。 要在TypeScript或某些Babel转译的JavaScript环境中使用Decorator,你需要相应的插件或配置。

8.1 基础用法

@decoratorName(parameters)  
class MyClass {  // ...  
}  // 或者用于方法、属性等  
class MyClass {  @decoratorName(parameters)  myMethod() {  // ...  }  
}

示例:用于记录类实例化的次数

function Loggable(target) {  let counter = 0;  return class extends target {  constructor(...args) {  super(...args);  counter++;  console.log(`${this.constructor.name} instantiated ${counter} times`);  }  };  
}  @Loggable  
class MyClass {  // ...  
}  // 实例化MyClass  
new MyClass(); // 输出 "MyClass instantiated 1 times"  
new MyClass(); // 输出 "MyClass instantiated 2 times"

9. ES6新增Set、Map两种数据结构

9.1 Set

Set 对象是一种值的集合,它类似于数组,但成员的值都是唯一的,没有重复的值。Set 本身是一个构造函数,用来生成 Set 数据结构。

  • 创建Set:使用new Set()创建一个空的Set,或者使用new Set(iterable)从一个可迭代对象(如数组)中创建Set。
  • 添加成员:使用add()方法向Set中添加新的成员。
  • 删除成员:使用delete()方法从Set中删除指定的成员。
  • 检查成员:使用has()方法检查Set中是否包含指定的成员。
  • 清除成员:使用clear()方法清除Set中的所有成员。
// 创建一个 Set 实例  
const mySet = new Set();  // 添加元素  
mySet.add(1);  
mySet.add(2);  
mySet.add(2); // 重复添加,Set 中不会有重复值  // 遍历 Set  
for (let item of mySet) {  console.log(item); // 1, 2  
}  // 检查元素是否存在  
console.log(mySet.has(1)); // true  
console.log(mySet.has(3)); // false  // 删除元素  
mySet.delete(2);  
console.log(mySet.has(2)); // false  // 获取集合大小  
console.log(mySet.size); // 1

9.2 Map

Map 对象保存键值对,并且可以记住键的原始插入顺序。任何值(对象或者原始值)都可以作为一个键或一个值。

  • 创建Map:使用new Map()创建一个空的Map,或者使用new Map(iterable)从一个可迭代对象(如数组)中创建Map,其中可迭代对象的元素是键值对数组。
  • 添加键值对:使用set()方法向Map中添加新的键值对。
  • 获取值:使用get()方法通过键获取对应的值。
  • 检查键:使用has()方法检查Map中是否包含指定的键。
  • 删除键值对:使用delete()方法从Map中删除指定的键值对。
  • 清除所有键值对:使用clear()方法清除Map中的所有键值对。
// 创建一个 Map 实例  
const myMap = new Map();  // 添加键值对  
myMap.set('key1', 'value1');  
myMap.set('key2', 'value2');  // 遍历 Map  
for (let [key, value] of myMap) {  console.log(key + ' => ' + value); // "key1 => value1", "key2 => value2"  
}  // 检查键是否存在  
console.log(myMap.has('key1')); // true  // 获取键对应的值  
console.log(myMap.get('key1')); // "value1"  // 删除键值对  
myMap.delete('key1');  
console.log(myMap.has('key1')); // false  // 获取集合大小  
console.log(myMap.size); // 1

9.3 对比

特性/方法SetMap
数据结构值的集合,成员唯一键值对的集合,键唯一
成员类型成员是任意类型的值键和值都是任意类型的值
成员重复性成员的值是唯一的,没有重复键是唯一的,值可以重复
有序性无序(但迭代时按插入顺序)有序(迭代时按插入顺序)
获取大小size 属性返回成员数量size 属性返回键值对数量
添加成员add(value)set(key, value)
删除成员delete(value)delete(key)
检查成员has(value)has(key)
获取成员通过迭代获取值get(key) 获取与键对应的值
清空集合clear()clear()
遍历值迭代Set即可遍历所有值使用 values() 方法或 […map.values()]
遍历键无直接方法,但迭代Set即遍历所有值使用 keys() 方法或 […map.keys()]
遍历键值对无直接方法使用 entries() 方法或 […map.entries()]
默认迭代器迭代Set时默认遍历值迭代Map时默认遍历键值对
应用场景数组去重、交集、并集等集合操作对象存储、缓存、统计数据等需要键值对结构的情况

9.4 案例

数组去重

let arr = [1, 2, 2, 3, 4, 4, 5];  
let uniqueArr = [...new Set(arr)]; // 使用扩展运算符将Set转换回数组  
console.log(uniqueArr); // 输出: [1, 2, 3, 4, 5]

交集、并集、差集

let set1 = new Set([1, 2, 3]);  
let set2 = new Set([2, 3, 4]);  // 交集  
let intersection = new Set([...set1].filter(x => set2.has(x)));  
console.log(intersection); // 输出: Set { 2, 3 }  // 并集  
let union = new Set([...set1, ...set2]);  
console.log(union); // 输出: Set { 1, 2, 3, 4 }  // 差集 (set1中存在于set2中不存在的元素)  
let difference = new Set([...set1].filter(x => !set2.has(x)));  
console.log(difference); // 输出: Set { 1 }

对象存储

let obj1 = { id: 1, name: 'Alice' };  
let obj2 = { id: 2, name: 'Bob' };  
let map = new Map();  
map.set(obj1, 'Alice\'s data');  
map.set(obj2, 'Bob\'s data');  console.log(map.get(obj1)); // 输出: 'Alice\'s data'  
console.log(map.get(obj2)); // 输出: 'Bob\'s data'

缓存

let cache = new Map();  // 存储数据到缓存  
cache.set('key1', 'value1');  
cache.set('key2', 'value2');  // 从缓存中获取数据  
console.log(cache.get('key1')); // 输出: 'value1'  // 检查缓存中是否存在某个键  
console.log(cache.has('key2')); // 输出: true  // 删除缓存中的某个键值对  
cache.delete('key1');  // 遍历缓存中的所有键值对  
for (let [key, value] of cache) {  console.log(key, value); // 输出: 'key2' 'value2'  
}

统计数据

let text = 'hello world hello es6';  
let wordMap = new Map();  // 分割文本为单词数组,并统计每个单词的出现次数  
text.split(' ').forEach(word => {  if (wordMap.has(word)) {  wordMap.set(word, wordMap.get(word) + 1);  } else {  wordMap.set(word, 1);  }  
});  // 遍历Map并打印结果  
for (let [word, count] of wordMap) {  console.log(`${word}: ${count}`); // 输出: hello: 2, world: 1, es6: 1  
}

10. ES6中 Proxy

Proxy 对象用于定义一个自定义的行为,包括基本操作的拦截和自定义(如属性查找、赋值、枚举、函数调用等)。通过使用 Proxy,你可以拦截并修改一个对象上的底层操作。

10.1 基础用法

Proxy 接收两个参数:一个目标对象(即需要被代理的对象)和一个处理器对象(一个定义了各种拦截行为的对象)。

const target = {}; // 目标对象  const handler = {  get(target, propKey, receiver) {  // 拦截 get 操作  console.log(`Getting ${propKey}`);  return Reflect.get(...arguments);  },  set(target, propKey, value, receiver) {  // 拦截 set 操作  console.log(`Setting ${propKey} = ${value}`);  return Reflect.set(...arguments);  },  // ... 可以定义其他陷阱函数  
};  const proxy = new Proxy(target, handler); // 创建一个代理对象  // 现在对 proxy 的操作会触发 handler 中的陷阱函数  
proxy.foo = 'bar'; // "Setting foo = bar"  
console.log(proxy.foo); // "Getting foo", 然后输出 "bar"

10.2 处理器对象

处理器对象定义了各种陷阱函数(trap),用于拦截不同的操作。

陷阱函数参数描述
get(target, propKey, receiver)target: 目标对象
propKey: 属性名(字符串或Symbol)
receiver: 最初被调用的对象(通常是代理对象本身)
拦截对象属性的读取操作
set(target, propKey, value, receiver)target: 目标对象
propKey: 属性名(字符串或Symbol)
value: 要设置的值
receiver: 最初被调用的对象(通常是代理对象本身)
拦截对象属性的设置操作
has(target, propKey)target: 目标对象
propKey: 属性名(字符串或Symbol)
拦截 in 操作符的行为
deleteProperty(target, propKey)target: 目标对象
propKey: 属性名(字符串或Symbol)
拦截 delete 操作符删除属性的行为
defineProperty(target, propKey, desc)target: 目标对象
propKey: 属性名(字符串或Symbol)
desc: 属性描述符
拦截 Object.defineProperty 的行为
getOwnPropertyDescriptor(target, propKey)target: 目标对象
propKey: 属性名(字符串或Symbol)
拦截 Object.getOwnPropertyDescriptor 的行为
getPrototypeOf(target)target: 目标对象拦截 Object.getPrototypeOf 的行为
setPrototypeOf(target, proto)target: 目标对象
proto: 新的原型对象
拦截 Object.setPrototypeOf 的行为
isExtensible(target)target: 目标对象拦截 Object.isExtensible 的行为
preventExtensions(target)target: 目标对象拦截 Object.preventExtensions 的行为
ownKeys(target)target: 目标对象拦截 Object.keys、Object.getOwnPropertyNames、Object.getOwnPropertySymbols 以及 for…in 循环的行为
apply(target, thisArg, argumentsList)target: 目标函数
thisArg: 函数调用时使用的 this 值
argumentsList: 函数的参数数组
拦截函数调用或 Function.prototype.apply 调用
construct(target, argumentsList, newTarget)target: 目标构造函数
argumentsList: 构造函数的参数数组
newTarget: 最初被 new 操作符调用的构造函数
拦截 new 操作符的行为

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

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

相关文章

用户体验至上:Vatee万腾平台的界面设计之道

在数字化时代&#xff0c;用户体验&#xff08;UX&#xff09;已经成为决定产品成功与否的关键因素之一。Vatee万腾平台深知此理&#xff0c;将用户体验置于首要位置&#xff0c;通过精心设计的界面为用户提供了便捷、舒适且高效的交易体验。 一、以用户为中心的设计理念 Vatee…

用canvas整个烟花效果

闲来无事&#xff0c;想着随便捣鼓一点东西玩玩 说说思路&#xff1a; 一 需要一个粒子类 模拟每一个烟花粒子&#xff0c;粒子有横坐标&#xff0c;纵坐标&#xff0c;半径&#xff0c;速度&#xff0c;颜色等属性&#xff0c;以及绘制的方法。 颜色这里我加了个初始化的方法…

Python读取字节数组

读取和处理bytearray中的值 # 输出&#xff1a;Combined 16-bit value: 1234 python-can发送和接收CAN报文 import can # 创建一个CAN总线对象&#xff08;这取决于你的硬件和驱动程序&#xff09; bus can.interface.Bus(channelcan0, bustypesocketcan) # 定义一个CAN…

【设计模式】JAVA Design Patterns——Proxy(代理模式)

&#x1f50d;目的 为另一个对象提供代理或占位符以控制对其的访问。 &#x1f50d;解释 真实世界例子 想象有一个塔&#xff0c;当地的巫师去那里学习他们的法术。象牙塔只能够通过代理来进入以此来保证只有首先3个巫师才能进入。这里的代理就代表的塔的功能并添加访问控制。 …

Web网站攻击技术

文章目录 Web应用体系结构脆弱性分析HTTP协议安全问题Cookie的安全问题 常见Web应用攻击及防范SQL注入攻击及防范SQL注入原理 防御注入漏洞跨站脚本(XSS)攻击及防范跨站脚本(XSS)攻击原理 跨站脚本攻击类型储存式XSS反射式XSSDOM式XSS Cookie欺骗及防范CSRF攻击及防范防御CSRF攻…

【数据结构】排序(直接插入、折半插入、希尔排序、快排、冒泡、选择、堆排序、归并排序、基数排序)

目录 排序一、插入排序1.直接插入排序2.折半插入排序3.希尔排序 二、交换排序1.快速排序2.冒泡排序 三、选择排序1. 简单选择排序2. 堆排序3. 树排序 四、归并排序(2-路归并排序)五、基数排序1. 桶排序&#xff08;适合元素关键字值集合并不大&#xff09;2. 基数排序基数排序的…

SpringCloud 服务调用 spring-cloud-starter-openfeign

spring-cloud-starter-openfeign 是 Spring Cloud 中的一个组件&#xff0c;用于在微服务架构中声明式地调用其他服务。它基于 Netflix 的 Feign 客户端进行了封装和增强&#xff0c;使其与 Spring Cloud 生态更好地集成。 1. Feign Feign 是一个声明式的 Web Service 客户端…

大功率回馈式负载:行业竞争态势

随着科技的不断发展&#xff0c;大功率回馈式负载在各个行业中的应用越来越广泛。大功率回馈式负载是一种能够将电能回馈到电网的设备&#xff0c;具有节能、环保、高效等优点。然而&#xff0c;随着市场竞争的加剧&#xff0c;大功率回馈式负载行业也面临着诸多挑战。 首先&am…

【HashMap】链表和红黑树互相转换的几种情况和数组的扩容机制

在Java的HashMap实现中&#xff0c;链表转换为红黑树的条件包括链表长度和HashMap的容量&#xff08;桶数组大小&#xff09;。具体规则如下&#xff1a; 链表长度阈值&#xff1a;当单个桶中的链表长度达到8时&#xff0c;该链表会被转换为红黑树。最小树化容量&#xff1a;H…

第二证券:A股重磅调整!富时中国A50指数将纳入中远海控中国中车

重要的音讯有哪些 A股&#xff0c;重磅调整&#xff01; 6月5日&#xff0c;富时罗素宣布对富时我国50指数、富时我国A50指数、富时我国A150指数、富时我国A200指数、富时我国A400指数的季度审阅变更。该变更将于2024年6月21日星期五收盘后&#xff08;即2024年6月24日星期一…

055、Python 关于全局变量和局部变量

定义&#xff1a; 全局变量&#xff1a;在函数外部定义的变量&#xff0c;可以在整个程序中访问。 局部变量&#xff1a;在函数内部定义的变量&#xff0c;只能在其定义的函数内部访问。 作用域优先级&#xff1a; 在 Python 中&#xff0c;作用域的查找顺序是&#xff1a;…

【Linux之·readelf工具·二进制程序处理工具】

系列文章目录 文章目录 前言一、使用readelf工具查看程序代码变量的内存空间布局情况1.1 源程序与程序的映射1.2 程序到进程的映射 二、readelf指令2.1 节头信息2.2符号表段中的项 总结 前言 在现代软件开发中&#xff0c;了解和理解可执行文件和共享库的结构变得越来越重要。而…

免费,C++蓝桥杯比赛历年真题--第14届蓝桥杯省赛真题(含答案解析和代码)

C蓝桥杯比赛历年真题–第14届蓝桥杯省赛真题 一、选择题 答案&#xff1a;A 解析&#xff1a; C中 bool 类型与 char 类型一样&#xff0c;都需要1 byte。一些其他类型的占用字节数:short:2 byte&#xff0c;int:4byte&#xff0c;long long:8 byte&#xff0c;double:8byte&…

探究MySQL中的“树”结构

1 引言 树高千丈,叶落求索 – 唐代杜牧 树结构在MySQL中常用于表示层次关系,如组织结构或分类体系。引入树结构可使数据之间建立父子关系,便于查询和管理。益处包括快速检索子节点、方便展示层次关系、支持递归查询等。 2 基础概念 2.1 名词解析 程序就像是一张有向图,你…

Linux操作系统:Spark在虚拟环境下的安装及部署

将Spark安装到指定目录 // 通过wget下载Spark安装包 $ wget https://d3kbcqa49mib13.cloudfront.net/spark-2.1.1-bin-hadoop2.7.tgz // 将spark解压到安装目录 $ tar –zxvf spark-2.1.1-bin-hadoop2.7.tgz –C /usr/local/ // 重命名 $ mv /usr/local/spark-2.1.1-bin-hado…

面试 Redis 八股文十问十答第三期

面试 Redis 八股文十问十答第三期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01;关注专栏后就能收到持续更新&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1&#xff09;redis 的 lua 脚本用过吗&…

前端怎么debugger排查线上问题

前端怎么debugger排查线上问题 1.问题背景2.问题详细说明3.处理方案a.开发环境怎么找&#xff0c;步骤一样的&#xff1a;b.生产环境怎么找&#xff0c;步骤一样的&#xff1a;还有一种情况就是你的子盒子是使用csshover父盒子出来的&#xff0c; 4.demo地址&#xff1a; 1.问题…

OOP 下一个排列(函数模板)

题目描述 输入一个序列&#xff0c;输出其下一个字典序的排列 如&#xff1a;输入1 2 3&#xff0c; 下一个为1 3 2&#xff0c; 下一个为2 1 3&#xff0c; 下一个为2 3 1&#xff0c; 下一个为3 1 2&#xff0c; 下一个为3 2 1&#xff08;最大的字典序排列&#xff0…

C++基础-编程练习题和答案(数组2)

文章目录 前言一、植树二、校门外的树三、排除第一个异形基因四、比身高五、supercell做核酸 前言 在C中&#xff0c;数组是一种数据结构&#xff0c;它允许在内存中连续存储相同类型的元素。数组是静态的&#xff0c;这意味着它们在编译时必须指定大小&#xff0c;并且在程序…

java版MES系统全套源码,支持 SaaS 多租户,管理后台的 Vue3 版本采用 :vue-element-plus-admin

MES生产制造执行系统源码&#xff0c;有演示&#xff0c;自主研发&#xff0c;多个项目应用案例&#xff0c;成熟稳定。支持二次开发&#xff0c;商业授权后可商用。 MES系统是面向制造企业车间执行层的生产信息化管理系统&#xff0c;能实时监控生产过程、管理制造数据、优化生…