02-ES6新语法

1. ES6 Proxy与Reflect

1.1 概述

Proxy 与 Reflect 是 ES6 为了操作对象引入的 API 。

Proxy 可以对目标对象的读取、函数调用等操作进行拦截,然后进行操作处理。它不直接操作对象,而是像代理模式,通过对象的代理对象进行操作,在进行这些操作时,可以添加一些需要的额外操作。

Reflect 可以用于获取目标对象的行为,它与 Object 类似,但是更易读,为操作对象提供了一种更优雅的方式。它的方法与 Proxy 是对应的。

1.2 基本用法

1.2.1 Proxy(代理)

proxy,代理,使用代理,我们可以操作对象时,需要先经过代理,才能到达对象,这样就可以起到‘拦截’的作用。

一个 Proxy 对象由两个部分组成: target 、 handler 。在通过 Proxy 构造函数生成实例对象时,需要提供这两个参数。 target 即目标对象, handler 是一个对象,声明了代理 target 的指定行为,拦截过滤代理操作的。

let target = {name: 'zhangmeili',age: 24
}
let handler = {get: function(target, key) {console.log('getting '+key);return target[key]; // 不是target.key},set: function(target, key, value) {console.log('setting '+key);target[key] = value;}
}
let proxy = new Proxy(target, handler)
proxy.name     // 实际执行 handler.get
proxy.age = 25 // 实际执行 handler.set
总结proxy的用处:

实现拦截和监视外部对对象的访问。

降低函数和类的复杂度,优雅的写出代理代码。

在复杂操作前对操作进行校验或对所需资源进行管理。

场景:
  1. 抽离校验模块。

  2. 私有属性。

  3. 预警和拦截。

  4. 过滤操作。

  5. 中断代理。

1.2.2 Reflect(反射)

ES6 中将 Object 的一些明显属于语言内部的方法移植到了 Reflect 对象上(当前某些方法会同时存在于 Object 和 Reflect 对象上),未来的新方法会只部署在 Reflect 对象上。

Reflect 对象对某些方法的返回结果进行了修改,使其更合理。

Reflect 对象使用函数的方式实现了 Object 的命令式操作。

静态方法

Reflect.get(target, key, receiver)

查找并返回 target 对象的 key属性。

let person = {name: "zhangmeili",age: 24,get info(){return this.name + this.age;}
}
Reflect.get(person, 'name'); // "zhangmeili"// 当 target 对象中存在 name 属性的 getter 方法, getter 方法的 this 会绑定 // receiver
let receiver = {name: "wangshuai",age: 20
}
Reflect.get(person, 'info', receiver); // wangshuai// 当 name 为不存在于 target 对象的属性时,返回 undefined
Reflect.get(person, 'birth'); // undefined// 当 target 不是对象时,会报错
Reflect.get(1, 'name'); // TypeError
​
​
let person = {name: "zhangmeili",age: 24,get info() {return this.name + this.age;}
};
Reflect.set(person,'sex','男');
console.log(person);
总结reflect的用处

reflect有的方法object都有,es6希望数据和逻辑代码分离,那么object就是纯数据,所有的逻辑都放到reflect上,对象对某些方法的返回结果进行了修改,使其更合理。

场景:
  1. 当object的工具类来用。

1.2.3 组合使用

Reflect 对象的方法与 Proxy 对象的方法是一一对应的。所以 Proxy 对象的方法可以通过调用 Reflect 对象的方法获取默认行为,然后进行额外操作。

let person = {name: "zhangmeili",age: 24
}
let handler = {get: function(target, key){console.log("getting "+key);return Reflect.get(target,key);},set: function(target, key, value){console.log("setting "+key+" to "+value)Reflect.set(target, key, value);}
}
let proxy = new Proxy(person, handler)
// 设置
proxy.name = "wangshuai"
//获取
console.log(proxy.name);

2. ES6 字符串

2.1 子串的识别

ES6 之前判断字符串是否包含子串,用 indexOf 方法,ES6 新增了子串的识别方法。

  • includes():返回布尔值,判断是否找到参数字符串。

  • startsWith():返回布尔值,判断参数字符串是否在原字符串的头部。

  • endsWith():返回布尔值,判断参数字符串是否在原字符串的尾部。

以上三个方法都可以接受两个参数,需要搜索的字符串,和可选的搜索起始位置索引。

let string = "apple,banana,orange";
string.includes("banana");     // true
string.startsWith("apple");    // true
string.endsWith("apple");      // false
string.startsWith("banana",6)  // true

注意:

  • 这三个方法只返回布尔值,如果需要知道子串的位置,还是得用 indexOf 和 lastIndexOf 。

  • 这三个方法如果传入了正则表达式而不是字符串,会抛出错误。而 indexOf 和 lastIndexOf 这两个方法,它们会将正则表达式转换为字符串并搜索它。

2.2 字符串重复

repeat():返回新的字符串,表示将字符串重复指定次数返回。

console.log("Hello,".repeat(2));  // "Hello,Hello,"

2.3 字符串补全

  • padStart(targetLength [, padString]):返回新的字符串,表示用参数字符串从头部(左侧)补全原字符串。

  • padEnd(targetLength [, padString]):返回新的字符串,表示用参数字符串从尾部(右侧)补全原字符串。

以上两个方法接受两个参数,第一个参数是指定生成的字符串的最小长度,第二个参数是用来补全的字符串。如果没有指定第二个参数,默认用空格填充。

console.log("h".padStart(5,"o"));  // "ooooh"
console.log("h".padEnd(5,"o"));    // "hoooo"
console.log("h".padStart(5));      // "    h"

2.4 模板字符串

模板字符串相当于加强版的字符串,用反引号 `,除了作为普通字符串,还可以用来定义多行字符串,还可以在字符串中加入变量和表达式。

let string = `Hello'\n'world`;
console.log(string); 
// "Hello'"
// "'world"
​
//模板字符串  ``反引号
var num = 123
var fn = function () {return "hello"
}
let str66 = "hello \n everyone"
console.log(str66);
​
let str666 = `hello everyone ${num + 10} ${fn()}`
console.log(str666);
​
let str2=`hello`

3. ES6 数值

3.1 数值的表示(了解)

二进制表示法新写法: 前缀 0b 或 0B 。

console.log(0b11 === 3); // true
console.log(0B11 === 3); // true

八进制表示法新写法: 前缀 0o 或 0O 或0。

console.log(0o11 === 9); // true
console.log(0O11 === 9); // true

3.2 Number对象新方法

  • Number.isNaN():用于检查一个值是否为 NaN 。

console.log(Number.isNaN(NaN));      // true
console.log(Number.isNaN('true'/0)); // true// 在全局的 isNaN() 中,以下皆返回 true,因为在判断前会将非数值向数值转换
// 而 Number.isNaN() 不存在隐式的 Number() 类型转换,非 NaN 全部返回 false
Number.isNaN("NaN");      // false
Number.isNaN(undefined);  // false
Number.isNaN({});         // false
Number.isNaN("true");     // false

3.2 指数运算符(了解)

1 ** 2; // 1
// 右结合,从右至左计算
2 ** 2 ** 3; // 256
// **=
let power  = 2;
power  **= 3; // 8

3.3 parseInt(string, radix)方法补充

parseInt(string, radix)
string必需。要解析的字符串。
radix可选。代表要使用的数字系统的数字(从 2 到 36)。如果是0,radix被假定10(十进制)

面试题:

["1", "2", "3"].map(parseInt) 为何返回[1,NaN,NaN]?
//解析:
arr.map(function(value,index){})  
​
parseInt('1',0); //1
​
parseInt('2',1);//NaN
​
parseInt('3',2);//NaN
​
​
//例如
parseInt('11',16);//17

4. ES6 对象(重点)

4.1 属性的简洁表示法

const age = 18;
const name = "zhangmeili";
const person = {age, name};
console.log(person) //{age: 18, name: "zhangmeili"}
//等同于
const person = {age: age, name: name}

4.2 方法名也可以简写

const person = {sayHi(){console.log("Hi");}
}
person.sayHi();  //"Hi"
//等同于
const person = {sayHi:function(){console.log("Hi");}
}
person.sayHi();//"Hi"

4.3 属性名表达式

ES6允许用表达式作为属性名,但是一定要将表达式放在方括号[ ]内。

const obj = {["he"+"llo"](){return "Hi";}
}
obj.hello();  //"Hi"

注意点:属性的简洁表示法和属性名表达式不能同时使用,否则会报错。

const hello = "Hello";
const obj = {[hello]
};
​
//SyntaxError: Unexpected token }
console.log(obj);const hello = "Hello";
const obj = {[hello+"2"]:"world"
};
​
//{Hello2: "world"}
console.log(obj);
​

4.4 扩展运算符-对象中的用法(重点)

扩展运算符(...)用于取出参数对象所有可遍历属性然后拷贝到当前对象。

  • 基本用法-拷贝对象

let person = {name: "zhangmeili", age: 18};
let pcopy = { ...person };
console.log(pcopy); //{name: "zhangmeili", age: 15}
  • 可用于合并两个对象

let age = {age: 18};
let name = {name: "zhangmeili"};
let person= {...age, ...name};
console.log(person) //{age: 18, name: "zhangmeili"}

注意:

自定义的属性和扩展运算符对象里面属性的相同的时候:自定义的属性在扩展运算符后面,则扩展运算符对象内部同名的属性将被覆盖掉。

4.5 对象的新方法

Object.is(value1, value2) 用来比较两个值是否严格相等,与(===)基本类似。

Object.is("q","q");      // true
Object.is(1,1);          // true
Object.is([1],[1]);      // false
Object.is({q:1},{q:1});  // false
Object.is(NaN, NaN);// true

5. ES6 数组

5.1 数组创建

  • Array.of()将参数中所有值作为元素形成数组。

console.log(Array.of(1, 2, 3, 4)); // [1, 2, 3, 4]
 
// 参数值可为不同类型
console.log(Array.of(1, '2', true)); // [1, '2', true]
 
// 参数为空时返回空数组
console.log(Array.of()); // []
  • Array.from()将类数组对象或可迭代对象转化为数组。

 // 浅拷贝数组
var arr=[1,2,3];
console.log(Array.from(arr)); //[1,2,3]
​
// 参数为数组,返回与原数组一样的数组
console.log(Array.from([1, 2])); // [1, 2]

5.2 数组的新方法

  • arr.findIndex(callback)查找数组中符合条件的元素索引,若有多个符合条件的元素,则返回第一个元素索引。

let arr = Array.of(2,5,6,-7,2);
console.log(arr.findIndex(function(value,index){if(value < 0){return index;}
}));
  • arr.flat([depth]) 嵌套数组转指定深度的数组。

let arr = [1,2,4,[5,6,77,[2,3,45,'你好啊']]];
arr2 = arr.flat(1);
console.log(arr2);

5.3 扩展运算符-数组中的用法(重点)

  • 复制数组

let arr1 = [1, 2];
let arr2 = [...arr1];
console.log(arr2); // [1, 2]
  • 合并数组

let arr = [1,2,4];
let arr2 = ["你好","world",'qqqq',true];
let arr3 = [...arr,...arr2];
console.log(arr3);
  • 将伪数组转换为数组

var boxes = document.querySelectorAll('div');
console.log(boxes);
console.log([...boxes]);

5.4 剩余运算符和扩展运算符的区别

剩余运算符收集这些集合数据,扩展运算符是将数组或对象拆分成元素的集合,它们是相反的

//剩余运算符收集数据
function fun1(a, b, ...arr1) {console.log(arr1.length);
}
fun1(1,23,4);
​
//扩展运算符--合并对象/数组
let age = {age: 18};
let name = {name: "zhangmeili"};
let person= {...age, ...name};
console.log(person) //{age: 18, name: "zhangmeili"}

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

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

相关文章

WEB3-众筹合约

构建众筹合约的框架&#xff0c;包括定义 IERC20 接口&#xff0c;并通过构造函数初始化代币合约。 By:HackQuesthttps://www.hackquest.io/zh

如何用Vue3和ApexCharts打造引人注目的3D径向条形图

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 使用 ApexCharts 构建美观的 Vue.js 径向条形图 应用场景 径向条形图是一种用于可视化单一数据点及其与目标或理想值的关系的图表类型。它在显示进度、完成率或其他类似度量时非常有用。 基本功能 这段代码…

同三维T80002JEHV H.265高清解码器

同三维T80002JEHV H.265高清解码器 1路HDMI1路VGA解码输出&#xff0c;1/2/4画面分割或16路轮询显示 产品简介&#xff1a; 同三维T80002JEHV解码器使用Linux系统&#xff0c;支持VGA/HDMI二种接口同时输出&#xff0c;支持多流输入多流解码及多屏显示&#xff0c;具有完善的…

Django REST framework数据展示技巧:分页、过滤与搜索的实用配置与实践

系列文章目录 Django入门全攻略&#xff1a;从零搭建你的第一个Web项目Django ORM入门指南&#xff1a;从概念到实践&#xff0c;掌握模型创建、迁移与视图操作Django ORM实战&#xff1a;模型字段与元选项配置&#xff0c;以及链式过滤与QF查询详解Django ORM深度游&#xff1…

【修复Win11错误 0x80010135: 路径太长】

1. 问题现象&#xff1a; 一个意外错误使你无法复制该文件。如果你继续收到此错误&#xff0c;可以使用错误代码来搜索有关此问题的帮助。 错误 0x80010135: 路径太长 或者这样 2. 分析问题 造成这个问题的主要原因包括&#xff1a; 文件路径长度超过 260 个字符&#xf…

Qt利用Coin3D(OpenInventor)进行3d绘图

文章目录 1.安装1.1.下载coin3d1.2.下载quarter1.3.解压并合并 2.在Qt中使用3.画个网格4.加载wrl模型 1.安装 1.1.下载coin3d 首先&#xff0c;到官网下载[coin3d/coin] 我是Qt5.15.2vs2019的&#xff0c;因此我选择这个coin-4.0.2-msvc17-x64.zip 1.2.下载quarter 到官网…

【信息资源组织与管理】【开卷考】如何准备 期末考试复习必备

索引篇 先去xhs找了开卷考有什么准备技巧&#xff0c;来自Prozac ❗️首先&#xff0c;适用于考试范围为课本内容或者课堂内容&#xff0c;如果有那种拓展题&#xff0c;脱离课本的&#xff0c;那我就没办法了。 ✅一定要熟悉熟悉熟悉课本 1. 第一遍略看课本&#xff0c;可以不…

万界星空科技QMS质量管理介绍

产品的生产质量是企业发展之根本&#xff0c;对所有企业来说&#xff0c;建立完善质量控制体系&#xff0c;对企业生产经营以及发展竞争具有至关重要的影响&#xff0c;可以说是企业质量保证的防火墙。QMS质量管理系统对任何一家企业都具有重要意义&#xff0c;可帮助企业提高生…

shell脚本监控docker容器和supervisor 运行情况

1.ASR服务 需求: 在ASR服务器中 docker 以下操作中 忽略容器名字叫 nls-cloud-mongodb 的容器 在ASR服务器中 docker ps 查看正在运行的容器 docker stats -a --no-stream 可以监控容器所占资源 确认是否有pid且不等于0 docker inspect -f “{{.RestartCount}}” 容器名称 可…

为何Proteus用户争相拥抱SmartEDA?揭秘背后的强大吸引力!

在电路设计与仿真领域&#xff0c;Proteus一度以其稳定性能和丰富功能赢得了众多用户的青睐。然而&#xff0c;近年来&#xff0c;越来越多的Proteus用户开始转向SmartEDA&#xff0c;这一新兴电路仿真软件正迅速崭露头角&#xff0c;成为行业内的翘楚。那么&#xff0c;究竟是…

【Java】已解决java.util.ConcurrentModificationException异常

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决java.util.ConcurrentModificationException异常 一、分析问题背景 java.util.ConcurrentModificationException异常是Java集合框架中常见的一个运行时异常。这个异常通常会…

llama-factory微调工具使用入门

一、定义 环境配置案例&#xff1a; https://zhuanlan.zhihu.com/p/695287607chatglm3 案例多卡训练deepspeedllama factory 案例Qwen1.5报错 二、实现 环境配置 git clone https://github.com/hiyouga/LLaMA-Factory.git conda create -n llama_factory python3.10 conda …

适合企业的TTS文本转语音接口:微软TTS最新模型,发布9种更真实的AI语音

微软对Azure Al语音服务的Personal Voice功能进行了升级&#xff0c;引入了新的零样本学习(zero-shot)的文本到语音(TTS)模型。与初始模型相比&#xff0c;这些新模型提高了合成语音的自然度&#xff0c;并更好地模仿了提示语音中的语音特征。 微软提供了超过400种神经语音&am…

视频监控管理平台智能边缘分析一体机安防监控平台离岗检测算法

在工业自动化和智能制造的背景下&#xff0c;智能边缘分析一体机的应用日益广泛。这些设备通常在关键岗位上执行监控、分析和数据处理任务。然而&#xff0c;设备的稳定运行至关重要&#xff0c;一旦发生故障或离岗&#xff0c;可能会导致生产线停滞甚至安全事故。因此&#xf…

llama-factory微调chatglm3

一、定义 案例/多卡 二、实现 案例 1. 下载chatglm3-6b-32k模型 2. 配置数据集微调指令 CUDA_VISIBLE_DEVICES0,1 llamafactory-cli train \--stage sft \--do_train True \--model_name_or_path /home/chatglm3-6b-32k \--finetuning_type lora \--template chatglm3 \--d…

LeetCode 算法:回文链表 c++

原题链接&#x1f517;&#xff1a;回文链表 难度&#xff1a;简单⭐️ 题目 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head…

1:25万基础电子地图(重庆版)

我们为你分享过四川版、江西版和贵州版的1:25万基础电子地图&#xff0c;现在再为你分享重庆版的电子地图。 现在我们再为你分享重庆的1&#xff1a;25万基础电子地图&#xff0c;你可以在文末查看该数据的领取方法。 基础电子地图重庆版 下载后可以看到该数据由14个压缩包所…

Windows11电脑在使用GPU的时候有时候会卡顿

原来我一直以为是电脑的某些组件可能坏掉了 但是后来发现通过更新gpu的驱动可以让它变好&#xff1a; NVIDIA GeForce 驱动程序 - N 卡驱动 | NVIDIA 下载好以后&#xff0c;然后安装最新的驱动就可以了&#xff0c;感觉可能是因为win11和某些需要显卡的驱动不支持的原因吧 …

Flash基础知识

1、Flash发展历程 存储器通常分为两类型&#xff0c;即随机存取的RAM&#xff08;内存&#xff09;与只读的ROM&#xff08;外存&#xff09;。 RAM&#xff0c;也称随机存取存储器&#xff0c;数据可以被读取和修改。它主要用于存储正在运行的程序和临时数据&#xff0c;是计…

CarService的构成和初始化分析

以下分析&#xff0c;基于安卓13的AAOS。 代码构成 packages/services/Car CarService相关代码&#xff0c;主要是在这个目录下 frameworks/opt/car/services 主要是carservice启动相关。 其它目录&#xff1a;audio_policy_configuration.xml和car_audio_configuration.xm…