3、proxy、for...of、iterator遍历器以及原理

一、proxy:

1、proxy的作用:(重点)

  • 代理
  • 解决跨域

2、proxy代理格式:

// target:要代理的对象   property:对象里的方法
let proxy = new Proxy(target, property);

3、代理里面的方法

get(target,property)

  • 创建代理

set(target,property,value)

ownKeys拦截操作

has( )拦截操作:拦截key in object的操作,结果会返回一个布尔值。

proxy.revocable方法

  • 会返回一个对象,对象中含有一个proxy属性,它就是Proxy的代理实例对象;
  • 还有一个revoke属性,它是一个方法,用于取消代理。
let car = {
    price: 100000,
    color: "white",
    power: "v8"
}
//1、创建一个Proxy代理实例------------------------
let proxyCar = new Proxy(car, {
//参数1:要代理的对象 参数2:对象的方法
get(target, property) {
    if (property == "price") {
        return "车是120000,但是可以给你优惠,给你15000的优惠,车就是105000"
    } else {
        return target[property]
    }
},
//2、修改属性的值--------------------------------
//value:需要更改的值
set(target, property, value) {
    target[property] = value
},
// 3、ownKeys拦截操作,拦截过滤拦截过滤Object.keys()对对象的属性遍历-----------
ownKeys() {
    return ['price', 'color']
},
// 4、has( )拦截操作:拦截key in object的操作,结果会返回一个布尔值。
has(target, property) {
    // 输出:{price: 100000, color: 'black', power: 'v8'} 'price'
    if (target[property] === undefined) {
        return false
    }
    return true
}
//输出:车是120000,但是可以给你优惠,给你15000的优惠,车就是105000
console.log(proxyCar.price);//1、get()输出

console.log(proxyCar.color);//white
proxyCar.color = "black"  //2、set()输出
console.log(proxyCar.color);//black
//3、ownKeys()拦截操作-----------
console.log(Object.keys(proxyCar));//['price', 'color'] 
// key in object  判断属性是否存在对象中
console.log('price' in proxyCar);//false
//5、revocable()返回一个对象  包括两个属性-----------------
let carProxy = Proxy.revocable(car, {
    get(target, property) {
        return target[property]
    }
})
console.log(carProxy);//{proxy: Proxy(Object), revoke: ƒ}
console.log(carProxy.proxy.price);//10000
//6、revok()取消代理 会返回一个对象,
carProxy.revoke()------------------
console.log(carProxy.proxy.price);//报错 代理被取消

除了对象类型的变量可以被代理,函数也可以被代理。

  • 如果被代理的变量是一个函数,那么还会支持一个拦截程序:apply调用。

二、for…of

  • 可以跳出当前循环

1、可遍历对象:可以被for…of遍历的对象

  • 数组、字符串、伪数组、Set、Map(不包括对象)
var arr = [1,2,3,4]
for (let [key,value] of arr.entries()) {
	console.log(key,value)//键和值都可以输出
}
for (let key of arr) {//获取索引  
    if (key == 2) {
        continue//索引为2  可以跳出当前循环
    }
    console.log(key);//1 3 4
}
  • 支持字符串的遍历
let word = "我是前端君"
for(let w of word){
	console.log(w)//我 是 前 端 君
}
  • 用for of输出值 索引
var arr = [1, 2, 3, 4, 5]
for (let key of arr.keys()) {
    console.log(key);//索引
}
for (let value of arr.values()) {
    console.log(value);//值
}
for (let [key, value] of arr.entries()) {
    console.log(key, value);//输出值和索引
}

2、iterator遍历器

为什么不能遍历对象

  • 因为对象上面没有(Symbol.iterator)方法
console.log(Array.prototype);
console.log(String.prototype);
console.log(Set.prototype);
console.log(Map.prototype);
console.log(Object.prototype);//没有有(Symbol.iterator)方法

image-20240308190027305

iterator原理

  • 当可遍历对象被for…of遍历的时候,[Symbol.iterator]()就会被调用,返回一个iterator对象。
var arr =[1,2,3]
let item = arr[Symbol.iterator]()//唯一值要加【】
console.log(item);//Array Iterator {}

for…of原理

  • 当可遍历对象被for…of遍历的时候,[Symbol.iterator]()就会被调用,返回一个iterator对象。
  • iterator对象里面有一个next()方法,调用next()方法,返回一个对象,对象里面有value和done属性,一直到done为true的时候结束执行
var arr =[1,2,3]
let item = arr[Symbol.iterator]()//唯一值要加【】
console.log(item);//Array Iterator {}
console.log(item.next());//{value: 1, done: false}
console.log(item.next());//{value: 2, done: false}
console.log(item.next());//{value: 3, done: false}
console.log(item.next());//{value: undefined, done: true}
console.log(item.next());//{value: undefined, done: true}

image-20240308192157464

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

对simplex算法的时间复杂度进行分析

对于simplex算法,如果每进行一次pivot变换,目标函数所得到的结果都会有可能出现增加的情况,所以得到的结论中,可以肯定它的值是一定不会出现减少的情况的,每次从目标函数中找到一个系数大于0的变量,然后再在约束条件中选取能够让它的增值最少的那个来继续进行pivot变换。…

代码随想录day16 栈与队列:前 K 个高频元素(leetcode347)

题目要求:给定一个非空的整数数组,返回其中出现频率前 k 高的元素。 思路:我们需要使用map来统计整个数组中元素出现的频率,然后再根据统计好的频率去排序,取得频率前K高的元素。我们不必使用快排实际上我们使用优先级…

【Web前端】Vue核心基础

文章目录 1. Vue简介2. Vue官网使用指南3. 初识Vue3.1 搭建Vue开发环境3.2 HelloWorld案例3.3 el与data的两种写法3.4 MVVM模型3.5 模板语法 4. 数据绑定4.1 v-bind单向数据绑定4.2 v-model双向数据绑定 5. 事件处理5.1 v-on绑定事件5.2 事件修饰符5.3 键盘事件 6. 计算属性6.1…

2024最新版短剧小程序

仿抖音滑动小短剧影视微信小程序源码,带支付收益等模式、支持无限滑动;高性能滑动、预加载、视频预览,支持剧情介绍,集合壁纸另外仿抖音滑动效果;支持会员模式,支持用户单独购买等等多功能。 丰富的后台设…

【C++】C++11---右值引用和移动语义

目录 1、什么是左值引用和右值引用2、左值引用与右值引用比较3、右值引用使用场景和意义4、右值引用引用左值的分析5、完美转发 1、什么是左值引用和右值引用 传统的C语法中就有引用的语法,而C11中新增了的右值引用语法特性,所以从现在开始我们之前学习…

读《文明之光》第1册总结

人类几千年的文明史和地球的历史相比,实在是太短暂了,大约相当于几分钟和一年的关系。人类已经走过的路,相比今后要走的漫漫长路,只能算是刚刚起步。如果跳出一个个具体事件,站在历史的高度去看,我们会发现…

3DES算法的起源与演进:保障信息安全的重要里程碑

title: 3DES算法的起源与演进:保障信息安全的重要里程碑 date: 2024/3/8 21:25:19 updated: 2024/3/8 21:25:19 tags: 3DES算法起源安全性增强三次迭代加密密钥管理复杂效率对比AES应用场景广泛Python实现示例 一、3DES算法的起源与演进 3DES算法是DES算法的增强版…

JAVA缓存:小工具

一、google.guava 用到的包 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>20.0</version><scope>compile</scope></dependency>写法 单位 代码 Component publi…

‘ jupyter ‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。

安装anaconda后&#xff0c;在 Dos黑窗口 运行 jupyter notebook 的两个问题 原因&#xff1a;没配置环境变量 解决方法&#xff1a; 在 系统环境变量Path 中 添加两个地址 这里以anaconda安装在 D:\anaconda\install 下为例 &#xff08;根据个人安装具体位置而定&#xff…

【OJ比赛日历】快周末了,不来一场比赛吗? #03.09-03.15 #13场

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号会推送最新的比赛消息&#xff0c;欢迎关注&#xff01; 以下信息仅供参考&#xff0c;以比赛官网为准 目录 2024-03-09&#xff08;周六&#xff09; #6场比赛2024-03-10…

docker部署若依项目

目录 目录 一、搭建局域 二、redis安装 1.创建目录 2. redis.conf修改 三、MySQL安装 1. 安装 2. 设置远程连接 3. 创建数据库 四、若依后端项目搭建 1. 切换到家目录 2. 上传jar包 3. 上传Dockerfile文件 4. 构建镜像 5. 运行容器 6. 查看运行情况 7. 测试(自己…

day17_订单(结算,提交订单,支付页,立即购买,我的订单)

文章目录 订单模块1 结算1.1 需求说明1.2 获取用户地址1.2.1 UserAddress1.2.2 UserAddressController1.2.3 UserAddressService1.2.4 UserAddressMapper1.2.5 UserAddressMapper.xml 1.3 获取购物项数据1.3.1 CartController1.3.2 CartService1.3.3 openFeign接口定义 1.4 环境…

LVS集群(Linux Virtual server)介绍----及LVS的NAT模式部署(一)

群集的含义 ●Cluster&#xff0c;集群、群集由多台主机构成&#xff0c;但对外只表现为一个整体&#xff0c;只提供访问入口(域名或IP地址)&#xff0c;相当于一台大型计算机 问题&#xff1a; 互联网应用中&#xff0c;随着站点对硬件性能、响应速度、服务稳定性、数据可靠…

15. C++泛型与符号重载

【泛型编程】 若多组类型不同的数据需要使用相同的代码处理&#xff0c;在C语言中需要编写多组代码分别处理&#xff0c;这样做显然太过繁琐&#xff0c;C增加了虚拟类型&#xff0c;使用虚拟类型可以实现一组代码处理多种类型的数据。 虚拟类型是暂时不确定的数据类型&#…

uniapp在页面中中获取pages.json下pages设置navigationBarTitleText这个值?uniapp获取页面标题

一、问题描述 有个需求就是,在app.vue页面中首先会隐藏所有页面的title,然后在相应的页面会判断当前环境是否是在微信浏览器内&#xff0c;如果不是&#xff0c;则还原标题。 二、解决方法 在 pages.json 文件中设置 navigationBarTitleText&#xff0c;例如&#xff1a; {&qu…

OpenCascade源码剖析:Handle类

Handle其实就是智能指针的上古版本&#xff0c;了解一点C11的应该对shared_ptr非常熟悉&#xff0c;那么你就把Handle当做shared_ptr来理解就没有任何问题了。 不过OCCT的Handles是侵入式的实现&#xff0c;前面讲过Standard_Transient类提供了引用计数机制&#xff0c;这个就…

Missing type map configuration or unsupported mapping

今天开发的时候突然遇到这么一个问题&#xff0c;可以确定的是不是AutoMap的问题&#xff0c;因为项目中其他接口都是好好的&#xff0c;只有新加的这个控制器不行&#xff0c;排查了一下&#xff0c;少了映射配置&#xff0c;在这里加上映射关系即可&#xff0c;大意了。

egg如何写单元测试

优秀的代码需要有单元测试进行质量保证&#xff0c;每个测试用例都给应用的稳定性提供了一层保障。 测试目录结构 我们约定 test 目录为存放所有测试脚本的目录&#xff0c;测试所使用到的 fixtures 和相关辅助脚本都应该放在此目录下。 测试文件的目录和我们需要测试的文件目…

HTML—常用标签

常用标签&#xff1a; 标题标签&#xff1a;<h1></h1>......<h6></h6>段落标签&#xff1a;<p></p>换行标签&#xff1a;<br/>列表&#xff1a;无序列表<ul><li></li></ul> 有序列表<ol>&…

Python的数据库编程基础知识

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd;如果停止&#xff0c;就是低谷&#xf…