〖大前端 - 基础入门三大核心之JS篇㊿〗- 面向对象之对象的方法、遍历、深浅克隆

  • 说明:该文属于 大前端全栈架构白宝书专栏,目前阶段免费如需要项目实战或者是体系化资源,文末名片加V!
  • 作者:哈哥撩编程,十余年工作经验, 从事过全栈研发、产品经理等工作,目前在公司担任研发部门CTO。
  • 荣誉:2022年度博客之星Top4、2023年度超级个体得主、谷歌与亚马逊开发者大会特约speaker全栈领域优质创作者

  • 🏆 白宝书系列
    • 🏅 启示录 - 攻城狮的自我修养
    • 🏅 Python全栈白宝书
    • 🏅 ChatGPT实践指南白宝书
    • 🏅 产品思维训练白宝书
    • 🏅 全域运营实战白宝书
    • 🏅 大前端全栈架构白宝书


文章目录

  • ⭐ 对象的方法
  • ⭐ 对象的遍历
  • ⭐ 对象的深浅克隆
    • 🌟 对象的浅克隆
    • 🌟 对象的深克隆

⭐ 对象的方法

如果某个属性值是函数,则它被称为对象的“方法”

示例代码:下面的对象中,byeBye这个属性的值是一个函数,那么这个属性是这个对象的方法

var xiaomumu = {name: '小沐沐',age: 2,sex: '男',hobbies: ['秋千', '滑梯'],'favorite-books': ['抱抱', '我的爸爸'],byeBye: function () {                 console.log('挥手再见');}
};

方法的调用

可以通过打点的方式调用对象的方法

示例代码:

var xiaomumu = {name: '小沐沐',age: 2,sex: '男',hobbies: ['秋千', '滑梯'],'favorite-books': ['抱抱', '我的爸爸'],byeBye: function () {                 console.log('挥手再见');}
};
xiaomumu.byeBye();   // 在控制台输出 挥手再见

学到这里,我们可以总结出方法和函数的区别了:方法也是函数,只不过方法是对象的“函数属性”,它需要打点调用,比如以前我们学过的一些方法有console.log()Math.ceil()等,log就是console对象的方法,ceil是Math对象的方法

⭐ 对象的遍历

和遍历数组一样,我们也可以对对象进行遍历,其实就是使用循环的方式来访问对象中的每个属性

遍历对象需要使用for...in...循环,for…in…循环可以遍历对象的每个

语法如下:

for (var k in obj) {      // k是循环变量,它会依次成为对象的每一个键;obj是对象的名字consloe.log(k);        consloe.log(obj[k]);   // obj[k]是k对应的属性值,注意必须使用方括号,不能使用打点
};

下面我们来遍历xiaomumu这个对象,把它的属性名和属性值输出到控制台:

var xiaomumu = {name: '小沐沐',age: 2,sex: '男',hobbies: ['秋千', '滑梯'],'favorite-books': ['抱抱', '我的爸爸'],byeBye: function () {console.log('挥手再见');}
};// 变量xiaomumu对象
for (var k in xiaomumu) {console.log('属性名' + k + '对应的属性值' + xiaomumu[k]);
}

image-20230508150053947

⭐ 对象的深浅克隆

先来复习一下基本类型值和引用类型值

举例当var a = b变量传值时当用=比较时
基本类型值数字、字符串、布尔、undefined、null内存中产生新的副本比较的是"值"是否相等
引用类型值对象、数组等内存中不产生新的副本,而是让新变量指向同一个对象比较的是“内存地址”是否相同,即比较是否为同一个对象

因为对象是引用类型值,所以:

  • 对象不能通过var obj2 = obj1的方式来克隆一个对象,这样“克隆”出来的变量会和原变量指向同一个堆内存区域,当改变一个对象的值时,另一个值也会发生改变
  • 使用或者=进行比较时,比较的是它们是否为内存中的同一个对象,而不是比较值是否相同

我们实际敲一些代码来证明对象是引用类型值:

var obj1 = {a: 10
}var obj2 = obj1;obj1.a++;
console.log(obj2.a);   // 11(改变obj1的值,obj2的值也会改变)console.log({} == {});    //false  (用==比较,答案是false,因为两个空数组指向的内存地址不同)
console.log({ a: 1 } === { a: 1 });  //false  (用===比较,答案也是false)

image-20230508152808708

🌟 对象的浅克隆

浅克隆,只克隆对象的“表层”,如果对象的某些属性值又是引用类型值,则不进一步克隆它们,只是传递它们的引用

使用for…in…循环既可以实现对象的浅克隆

示例代码:

var xiaomumu = {name: '小沐沐',age: 2,sex: '男',hobbies: ['秋千', '滑梯'],
};var muxiaomu = {};// 浅克隆,只克隆表层
for (var k in xiaomumu) {muxiaomu[k] = xiaomumu[k];  // 把xiaomumu的键值赋值给muixiaomu的键值
}console.log(muxiaomu);   // 和原对象看起来完全相同console.log(muxiaomu == xiaomumu);    //false,证明指向的堆内存地址不同了,对象被成s功克隆
console.log(muxiaomu.hobbies == xiaomumu.hobbies);  // true,证明这个hobbies属性没有被正在的克隆,所以这种克隆方式是“浅克隆”

image-20230508160031222

🌟 对象的深克隆

深克隆,克隆对象的全部,不论对象的属性值是否又是引用类型值,都能将它们实现克隆

和数组的深克隆类似,对象的深克隆也需要使用递归面试常考

示例代码:

var xiaomumu = {name: '小沐沐',age: 2,sex: '男',hobbies: ['秋千',{'吃水果': ['蓝莓', '香蕉', '西瓜']},'滑梯']
};// 深克隆
function deepClone(o) {//判断o是对象还是数组if (Array.isArray(o)) {// 数组var result = [];for (var i = 0; i < o.length; i++) {result.push(deepClone(o[i]));   // 递归}} else if (typeof o == 'object') {//对象var result = {};for (var k in o) {result[k] = deepClone(o[k]);   // 递归}} else {// 基本类型var result = o;}return result;   // 绝对不能忘记书写
};var muxiaomu = deepClone(xiaomumu);   //深克隆一个对象console.log(muxiaomu);

image-20230509112405632

一定要注意,在使用typeof判断是否是对象时,数组类型也会被判断为object,所以在写判断条件时,一定要注意书写的顺序。

image-20230509100508437

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

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

相关文章

iOS使用CoreText完成txt阅读器

CoreText是一个高效处理字符和字形转换和进行文字排版的框架&#xff0c;API基于C语言。 常见的CoreText类介绍 &#xff08;1&#xff09;、CFAttributedStringRef 属性字符串&#xff0c;用于存储需要绘制的文字字符和字符属性 &#xff08;2&#xff09;、CTFramesetterR…

JVM 内存分析工具 Memory Analyzer Tool(MAT)的深度讲解

目录 一. 前言 二. MAT 使用场景及主要解决问题 三. MAT 基础概念 3.1. Heap Dump 3.2. Shallow Heap 3.3. Retained Set 3.4. Retained Heap 3.5. Dominator Tree 3.6. OQL 3.7. references 四. MAT 功能概述 4.1. 内存分布 4.2. 对象间依赖 4.3. 对象状态 4.4…

鸿蒙前端开发-构建第一个ArkTS应用(Stage模型)

创建ArkTS工程 若首次打开DevEco Studio&#xff0c;请点击Create Project创建工程。如果已经打开了一个工程&#xff0c;请在菜单栏选择File > New > Create Project来创建一个新工程。 选择Application应用开发&#xff08;本文以应用开发为例&#xff0c;Atomic Serv…

docker-compose安装教程

1.确认docker-compose是否安装 docker-compose -v如上图所示表示未安装&#xff0c;需要安装。 如上图所示表示已经安装&#xff0c;不需要再安装&#xff0c;如果觉得版本低想升级&#xff0c;也可以继续安装。 2.离线安装 下载docker-compose安装包&#xff0c;上传到服务…

人工智能原理复习--机器学习

文章目录 上一篇机器学习概述归纳(示例)学习ID3决策树算法K近邻算法下一篇 上一篇 人工智能原理复习–搜索策略&#xff08;二&#xff09; 机器学习概述 学习系统的基本结构&#xff1a; #mermaid-svg-JMjIZHjVOirLolvu {font-family:"trebuchet ms",verdana,ari…

辨析旅行商问题(TSP)与车辆路径问题(VRP)

目录 前言旅行商问题 (TSP)问题介绍数学模型符号定义问题输入约束条件目标函数问题输出 解的空间解空间大小计算解释 车辆路径问题 (VRP)问题介绍TSP到VRP的过渡数学模型符号定义问题输入约束条件优化目标问题输出 解空间特殊情况一般情况 TSP 与 VRP 对比 前言 计划是通过本文…

基于JavaWeb+SSM+Vue助农扶贫微信小程序系统的设计和实现

基于JavaWebSSMVue助农扶贫微信小程序系统的设计和实现 源码获取入口Lun文目录前言主要技术系统设计功能截图 源码获取入口 Lun文目录 目 录 第一章 绪论 1 1.1 研究背景 1 1.2 研究意义 1 1.3 研究内容 2 第二章 开发环境与技术 3 2.1 JSP技术 3 2.2 MySQL数据库 3 2.3 Java…

基于Solr的全文检索系统的实现与应用

文章目录 一、概念1、什么是Solr2、与Lucene的比较区别1&#xff09;Lucene2&#xff09;Solr 二、Solr的安装与配置1、Solr的下载2、Solr的文件夹结构3、运行环境4、Solr整合tomcat1&#xff09;Solr Home与SolrCore2&#xff09;整合步骤 5、Solr管理后台1&#xff09;Dashbo…

微服务学习:Nacos配置中心

先打开Nacos&#xff08;详见微服务学习&#xff1a;Nacos微服务架构中的服务注册、服务发现和动态配置&Nacos下载&#xff09; 1.环境隔离&#xff1a; 新建命名空间&#xff1a; 记住命名空间ID&#xff1a; c82496fb-237f-47f7-91ed-288a53a63324 再配置 就可达成环…

docker-centos中基于keepalived+niginx模拟主从热备完整过程

文章目录 一、环境准备二、主机1、环境搭建1.1 镜像拉取1.2 创建网桥1.3 启动容器1.4 配置镜像源1.5 下载工具包1.6 下载keepalived1.7 下载nginx 2、配置2.1 配置keepalived2.2 配置nginx2.2.1 查看nginx.conf2.2.2 修改index.html 3、启动3.1 启动nginx3.2 启动keepalived 4、…

【HarmonyOS开发】控件开发过程中,知识点记录

1、问题记录及解决方案 1.1 资源&#xff08;Icon&i18n&#xff09;问题 控件&#xff1a;只有一个JS文件&#xff0c;不会将任何资源型文件&#xff08;图片、字体、默认文字等&#xff09;打包到SO中。因此&#xff0c;当我们开发控件时&#xff0c;需要将需要使用到的资…

【机器学习】042_迁移学习

一、概述、定义 目的&#xff1a; 迁移学习的目的是将某个领域或任务上学习到的模式、知识应用到不同但相关的领域里&#xff0c;获取更多数据&#xff0c;而不必投入许多时间人力来进行数据的标注。 举例&#xff1a; 已经会下中国象棋&#xff0c;就可以类比着来学习国际…

Navicat连接Oracle数据库

Navicat连接Oracle数据库 打开服务里面找到Oracle服务 OracleServerXE或者OracleServerTTL 创建数据库连接 连接名默认自己起 主机选择本地 端口默认 服务名在服务中可以找到输入后缀 用户名默认都是system 密码是创建oracle时候填写的口令 点击测试连接即可

Spring Boot中的事务是如何实现的?懂吗?

SpringBoot中的事务管理&#xff0c;用得好&#xff0c;能确保数据的一致性和完整性&#xff1b;用得不好&#xff0c;可能会给性能带来不小的影响哦。 基本使用 在SpringBoot中&#xff0c;事务的使用非常简洁。首先&#xff0c;得感谢Spring框架提供的Transactional注解&am…

【金融数据分析】计算沪深300指数行业权重分布并用饼图展示

前言 前面的文章我们已经介绍了如何获取沪深300成分股所述行业以及权重的数据&#xff0c;想要了解这部分内容的小伙伴可以阅读上一篇文章 springbootjdbcTemplatesqlite编程示例——以沪深300成分股数据处理为例-CSDN博客 那么有了上文获取的数据&#xff0c;我们实际上可以…

【rabbitMQ】rabbitMQ控制台模拟收发消息

目录 1.新建队列 2.交换机绑定队列 3.查看消息是否到达队列 总结&#xff1a; 1.新建队列 2.交换机绑定队列 点击amq.fonout 3.查看消息是否到达队列 总结&#xff1a; 生产者&#xff08;publisher&#xff09;发送消息&#xff0c;先到达交换机&#xff0c;再到队列&…

期末速成数据库极简版【存储过程】(5)

目录 【7】系统存储过程 【8】用户存储过程——带输出参数的存储过程 创建存储过程 存储过程调用 【9】用户存储过程——不带输出参数的存储过程 【7】系统存储过程 系统存储我们就不做过程讲解用户存储过程会考察一道大题&#xff0c;所以我们把重点放在用户存储过程。…

U4_1 语法分析之自顶向下分析

文章目录 一、定义1、任务2、对比3、方法4、自顶向下面临问题 二、自顶向下分析1、概念2、特点3、二义性问题4、左递归问题1&#xff09;概念2&#xff09;消除3&#xff09;间接左递归 5、回溯问题1&#xff09;概念2&#xff09;消除3&#xff09;解决方法 6、总结 三、递归子…

【Proteus仿真】【51单片机】光照强度检测系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使共阴数码管&#xff0c;PCF8591 ADC模块、光敏传感器等。 主要功能&#xff1a; 系统运行后&#xff0c;数码管显示光传感器采集光照强度值&#xff…

Gitzip插件【Github免翻下载】

今天给大家推荐一个github下载的插件&#xff0c;平常大家下载应该无外乎就是以下两种&#xff1a; Download zip利用git clone 但是这两种各有各的弊端&#xff0c;前者一般需要科学上网才可以&#xff0c;后者下载不稳定经常中途断掉。 今天给推荐一个款浏览器插件-Gitzip.大…