牛客JS题(三十四)监听对象

注释很详细,直接上代码

涉及知识点:

  1. defineProperty实现深度监视
  2. 递归终止条件
  3. 引用传值
  4. 闭包与作用域

题干:
在这里插入图片描述

我的答案

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /></head><body><style>ul {list-style: none;}</style><ul></ul><script>/*** 如果只是监视第一层的话也只能应用在这道题上了,咱加大点难度,我们整个可深度监听的函数* 既然是要给原数据设置监听说明我们必须在传值时保证都是引用而非浅拷贝或者深拷贝,否则最后添加监视的属性也不是我们最开始的* 1.首先是递归遍历应该怎么写,终止条件又应该是什么,这里我们可以思考一下,进入下一层递归需要哪些条件?父对象的引用以及当前遍历的子属性键值对吧* 也就是说只要父对象对应的子属性还是对象则它还有层级,也就是需要遍历* 2.终止条件自然是else即可,也就是说当前已经到最后一层了* 3.Object.defineProperty的使用需要注意点细节,稍有不慎容易爆栈,这里说一下为什么会爆栈呢,因为我们是以引用传过来的值,如果在get属性里面访问了obj[key]则会再次触发get,无限循环* 有小友问了,那你最后传入时深拷贝一下呗,传入的不是原值引用绑定的也就不是原值引用了,怎么解决呢,难不难受,难受死了,那怎么办呢,* 小友回忆一下Object.defineProperty在什么情况下会触发监视,当通过父对象访问子属性时才会触发监视对不对,可以直接传子属性的引用不通过父对象访问* 那我们开始直接传obj[key]呗,也就是我的代码里面的value,再寻思一下get使用的value是函数传过来的,岂不是只能用一次,* 并不是的,这里利用了JavaScript中函数作用域和作用域链的特性,使得对象的方法能够访问其定义所在的外部作用域中的变量* 也就是说value的值会保留下来,相当于我们有了一个存储的标志变量* 现在想想set怎么处理呢,给value赋值现在还需要担心爆栈吗,不用啦,咱直接访问地址又没有通过它的父对象,* 赋值以后再调用一次渲染函数,手写深度监视拿下拿下😎*/var ul = document.querySelector("ul");var person = {sex: "男",age: "25",name: "王大锤",height: 28,weight: 32,kkk: {a: 1,b: 2,},};function render(element) {var str = `<li>姓名:<span>${person.name}</span></li><li>性别:<span>${person.sex}</span></li><li>年龄:<span>${person.age}</span></li><li>身高:<span>${person.height}</span></li><li>体重:<span>${person.weight}</span></li><li>test:<span>${person.kkk.a}</span></li>`;element.innerHTML = str;return true;}render(ul);// 补全代码const updateview = (obj) => {//递归遍历const recursiveCall = (obj, key) => {if (typeof obj[key] === "object")Object.keys(obj[key]).forEach((item, index) =>recursiveCall(obj[key], item));else return ListenObject(obj, key, obj[key]);};//设置对象监听const ListenObject = (obj, key, value) => {Object.defineProperty(obj, key, {get: () => value,set: (newValue) => {value = newValue;render(ul);},});};Object.keys(obj).forEach((item, index) => {recursiveCall(obj, item);});};updateview(person);person.name = "小明";//改变了person.kkk.a = 4;//改变了//没有改变,因为aaa直接指向a的地址了,而不是通过它的父对象访问的let aaa=person.kkk.a;aaa.a=5;//测试一下value是变成了全局变量还是只是在作用域保留着,防止污染// console.log(value);//not defined,说明全局没这个变量</script></body>
</html>

博客更新不是很及时,需要看后面内容的可以看看我的gitee仓库

牛客JS题Gitee仓库

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

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

相关文章

ue5正确导入资源 content(内容),content只能有一个

把资源content下的东西&#xff0c;全部拷贝&#xff0c;放在项目的content下 content只能有一个

【HarmonyOS NEXT星河版开发学习】小型测试案例02-华为登录

个人主页→VON 收录专栏→鸿蒙开发小型案例总结​​​​​ 基础语法部分会发布于github 和 gitee上面&#xff08;还未发布&#xff09; 前言 通过此案例&#xff0c;不得不感叹鸿蒙的强大了&#xff0c;仅仅使用了26行代码就构建出来了这个界面&#xff0c;确实特别方便&#…

【git】简易的命令行入门教程

文章目录 1.Git 全局设置2.创建 git 仓库3.已有仓库 1.Git 全局设置 git config --global user.name "******" git config --global user.email "******qq.com"2.创建 git 仓库 mkdir ****** cd ****** git init touch README.md git add README.md git…

如何在notebook中运行nodejs

在 Python 生态系统的推动下&#xff0c;机器学习和人工智能日益流行&#xff0c;这带来了计算笔记本的概念。这些交互式计算平台主要是为以 Python 为中心的数据科学应用而开发的&#xff0c;它们将代码、计算输出、解释性文本和多媒体合并成一个有内聚力的文档。 作为 JavaS…

Liunx---批量安装服务器

目录 一、环境准备 一、环境准备 1.准备一台rhel7的主机并且打开主机图形。 2.配置好可用ip 3.做kickstart自动安装脚本后面需要用到DHCP&#xff0c;关闭VMware DHCP功能 二、安装图形化kickstart自动安装脚本的工具 yum install system-config-kickstart ----安装图形化生…

python模式设计代码之观察者模式

1、观察者模式 话题订阅模式。观察者模式有两个角色&#xff0c;分别是话题发布者和话题订阅者&#xff08;即观察者&#xff09;。发布者就是把消息发送给话题&#xff0c;观察者就是订阅这个话题从而得到最新的资讯。这个模式的作用就拿手机的消息推送来说&#xff0c;app身…

elasticsearch的学习(四):elasticsearch的一些基本概念

简介 elasticsearch的一些基本概念。 核心概念 索引&#xff1a;一个拥有相似特征的文档的集合。 类型&#xff1a;在索引中定义&#xff0c;是索引的一个逻辑上的分类&#xff0c;版本7以上已经弃用了。 文档&#xff1a;可被索引的基础信息单元&#xff0c;即一条数据&a…

Linux 错误码

目录 一、概述二、含义三、错误处理函数1、IS_ERR2、strerr、perror 一、概述 在 Linux 系统中&#xff0c;错误码是用来表示操作系统运行过程中发生的错误的数字代码。错误码通常由负数表示&#xff0c;0 表示成功&#xff0c;正数表示警告或其他非致命错误。 为了开发者更好…

【Linux基础】Linux基本指令(二)

目录 &#x1f680;前言一&#xff0c;mv指令二&#xff0c;more & less指令2.1 more 指令2.1 less指令 三&#xff0c;重定向技术(重要)3.1 echo指令3.2 输出重定向 >3.3 追加重定向 >>3.4 输入重定向 < 四&#xff0c;head & tail指令4.1 head 指令4.2 t…

【经验分享】ShardingSphere+Springboot-04:自定义分片算法(COMPLEX/STANDARD)

文章目录 3.4 CLASS_BASED 自定义类分片算法3.4.1 复杂分片自定义算法&#xff08;strategyCOMPLEX &#xff09;3.4.2 STANDARD 标准分片自定义算法## 进阶:star: 自定义算法范围查询优化 3.4 CLASS_BASED 自定义类分片算法 3.4.1 复杂分片自定义算法&#xff08;strategyCOM…

VUE结合elementui实现分页器列表

<template><div>外贸知识<div class"art-box"><div class"art-item-box"><div class"art-item" v-for"(art, index) in paginatedArtList" :key"index"><a :href"art.artsrc"&g…

离开SD的大佬们另组战队,开源新品牌冲击MJ王座

FLUX.1强势登场&#xff0c;秒杀Midjourney&#xff1f; Midjourney 6.1 才发表几天&#xff0c;FLUX.1立刻就来踢馆了 离职四个月&#xff0c;Stability AI 核心成员 Robin Rombach 前几日官宣成立了 Black Forest Labs&#xff0c;公司推出的第一个产品 FLUX.1&#xff0c;…

GStreamer 简明教程(一):环境搭建,运行 Basic Tutorial 1 Hello world!

文章目录 前言一、源码环境搭建二、Basic Tutorial 1 Hello world三、开启更多日志参考 前言 本系列文章将纪录学习 [GStreamer] 的过程。 为什么想学习 [GStreamer]&#xff0c;有这么几个原因&#xff1a; 多媒体处理是一个复杂的任务&#xff0c;[GStreamer] 的管道架构可…

Docker最佳实践(七):安装MinIO文件服务器

大家好&#xff0c;欢迎各位工友。 Minio是一个开源免费的高性能对象存储服务器&#xff0c;专为大规模数据集和高并发访问而设计。它具有出色的读写性能和低延迟&#xff0c;可以满足对数据速度和效率要求较高的应用场景。本篇呢我们就来演示一下如何在Docker中搭建Minio容器&…

Java的线程实现

我们知道&#xff0c;线程是比进程更轻量级的调度执行单位&#xff0c;线程的引入&#xff0c;可以把一个进程的资源分配和执行调度分开&#xff0c;各个线程既可以共享进程资源&#xff08;内存地址、文件I/O等&#xff09;&#xff0c;又可以独立调度。目前线程是Java里面进行…

智能分析,安全无忧:AI视频分析技术在安全生产中的深度应用

在当今快速发展的科技时代&#xff0c;视频智能分析技术&#xff08;Intelligent Video Analysis&#xff0c;简称IV&#xff09;已经成为提升安全生产水平的重要手段。这一技术通过计算机图像视觉分析技术&#xff0c;实现了对场景中目标的自动识别和追踪&#xff0c;有效提升…

【层归一化用于单个样本适合于序列建模,通俗】

层归一化&#xff08;Layer Normalization&#xff09;&#xff0c;简称 LayerNorm&#xff0c;会将神经网络层的激活值规范到均值为0&#xff0c;并将其方差归一化为1。尤其是在循环神经网络&#xff08;RNNs&#xff09;和自注意力模型&#xff08;如 Transformers&#xff0…

【学习笔记】Day 8

写在开头&#xff1a; 最近老板突然提出一个全新的组会主题&#xff0c;是关于 “最近我犯的傻”&#xff0c;其目的在于提供乐子的同时引以为戒。本来我还在愁到底去哪里找干的啥事儿&#xff0c;结果今天直接拉了个大的。什么叫无心插柳柳成荫啊&#xff0c;悲。 一…

【C++进阶】红黑树

目录 什么是红黑树&#xff1f;红黑树红黑树的性质 定义红黑树红黑树的操作insertinorderfindheightsize构造函数析构函数赋值拷贝判断红黑树 全部代码总结 什么是红黑树&#xff1f; 红黑树 红黑树&#xff08;Red-Black Tree&#xff09;是一种自平衡的二叉搜索树&#xff…

lora通信模块工作模式(半双工)

一&#xff0c;工作模式 1&#xff0c;透明模式 2&#xff0c;定点模式 3&#xff0c;广播模式 测试结果 1&#xff0c;定点模式下两个必须都是定点模式才能通信 2&#xff0c;广播模式可以发送到透明模式 3&#xff0c;定点模式发送不了透明模式