〖大前端 - 基础入门三大核心之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.hqwc.cn/news/264490.html

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

相关文章

python:五种算法(DBO、WOA、GWO、PSO、GA)求解23个测试函数(python代码)

一、五种算法简介 1、蜣螂优化算法DBO 2、鲸鱼优化算法WOA 3、灰狼优化算法GWO 4、粒子群优化算法PSO 5、遗传算法GA 二、5种算法求解23个函数 &#xff08;1&#xff09;23个函数简介 参考文献&#xff1a; [1] Yao X, Liu Y, Lin G M. Evolutionary programming made…

一文掌握Ascend C孪生调试

1 What&#xff0c;什么是孪生调试 Ascend C提供孪生调试方法&#xff0c;即CPU域模拟NPU域的行为&#xff0c;相同的算子代码可以在CPU域调试精度&#xff0c;NPU域调试性能。孪生调试的整体方案如下&#xff1a;开发者通过调用Ascend C类库编写Ascend C算子kernel侧源码&am…

SQL语句的执行顺序怎么理解?

SQL语句的执行顺序怎么理解&#xff1f; 我们常常会被SQL其书写顺序和执行顺序之间的差异所迷惑。理解这两者的区别&#xff0c;对于编写高效、可靠的SQL代码至关重要。今天&#xff0c;让我们用一些生动的例子和场景来深入探讨SQL的执行顺序。 一、书写顺序 VS 执行顺序 SQ…

为 Compose MultiPlatform 添加 C/C++ 支持(2):在 jvm 平台使用 jni 实现桌面端与 C/C++ 互操作

前言 在上篇文章中我们已经介绍了实现 Compose MultiPlatform 对 C/C 互操作的基本思路。 并且先介绍了在 kotlin native 平台使用 cinterop 实现与 C/C 的互操作。 今天这篇文章将补充在 jvm 平台使用 jni。 在 Compose MultiPlatform 中&#xff0c;使用 jvm 平台的是 An…

邮件营销软件:10个创新邮件营销策略,提升投资回报率(一)

电子商务和电子邮件营销密不可分。尽管电子商务在蓬勃发展&#xff0c;而很多人对邮件营销颇有微词。但是在电子商务中&#xff0c;邮件营销的确是一种有效营销方式。在本文中&#xff0c;我们将讨论一下邮件营销在电子商务中的有效运用&#xff0c;帮助您的企业在今年尽可能地…

layui分页laypage结合Flask+Jinja2实现流程

Layui2.0普通用法<!DOCTYPE html> <html> <head><meta charset"utf-8"><meta name"viewport" content"widthdevice-width, initial-scale1"><title>Demo</title><!-- 请勿在项目正式环境中引用该 …

研表究明,文字的序顺并不定一能响影GPT-4读阅

深度学习自然语言处理 原创作者&#xff1a;yy 很多年前&#xff0c;你一定在互联网上看过这张图&#xff0c;展示了人脑能够阅读和理解打乱顺序的单词和句子&#xff01;而最近东京大学的研究发现&#xff0c;大语言模型&#xff08;LLMs&#xff09; 尤其是 GPT-4&#xff0c…

C++枚举类

枚举 C11有作用域枚举和无作用域枚举 无作用域枚举 特点 全局作用域&#xff1a;无作用域枚举的成员&#xff08;枚举值&#xff09;在包含它们的作用域内是直接可见的&#xff0c;不需要使用枚举类型名称作为前缀。 隐式类型转换&#xff1a;无作用域枚举的成员可以隐式地转换…

C++ 模拟实现vector

目录 一、定义 二、模拟实现 1、无参初始化 2、size&capacity 3、reserve 4、push_back 5、迭代器 6、empty 7、pop_back 8、operator[ ] 9、resize 10、insert 迭代器失效问题 11、erase 12、带参初始化 13、迭代器初始化 14、析构函数 完整版代码 一、…

TCP的滑动窗口机制

网络的错误检测和补偿机制非常复杂。 一、等待超时时间&#xff08;返回ACK号的等待时间&#xff09; 当网络繁忙时会发生拥塞&#xff0c;ACK号的返回变慢&#xff0c;较短的等待时间会导致频繁的数据重传&#xff0c;导致本就拥塞的网络雪上加霜。如果等待时间过长&#xf…

IT新闻资讯系统,使用mysql作为后台数据库,此系统具有显示数据库中的所有信息和删除两大功能。

表的准备&#xff1a; -- MySQL Administrator dump 1.4 -- -- ------------------------------------------------------ -- Server version 5.1.40-community /*!40101 SET OLD_CHARACTER_SET_CLIENTCHARACTER_SET_CLIENT */; /*!40101 SET OLD_CHARACTER_SET_RESULTSCHAR…

【PWN】学习笔记(二)【栈溢出基础】

课程教学 课程链接&#xff1a;https://www.bilibili.com/video/BV1854y1y7Ro/?vd_source7b06bd7a9dd90c45c5c9c44d12e7b4e6 课程附件&#xff1a; https://pan.baidu.com/s/1vRCd4bMkqnqqY1nT2uhSYw 提取码: 5rx6 C语言函数调用栈 一个栈帧保存的是一个函数的状态信息&…