JS【详解】对象(含对象的存储原理,对象的常用操作,判断对象是否为空对象,对象的深拷贝,对象的创建、遍历、合并、拷贝等)

简介

任何事物都可以看作一个对象,用属性描述它的特征,用方法描述它的行为,如下方代码所示:

let obj = {name: "朝阳",sayHi: function () {console.log("你好!");},
};
typeOf obj  // object

变量 obj 被赋值了一个对象,它有属性 name,属性值为 朝阳,方法为 sayHi,具有在控制台打印 你好! 的行为。

JS 内部还定义了很多特殊的对象,如 Function 函数、Array 数组、Date日期、RegExp 正则表达式、Error 报错、Math 数学计算等。

对象的储存原理

对象的值保存在堆内存中,变量 obj 内存储的是对象的引用(对象在堆内存中存储的地址)

常用的对象操作

创建对象

// 创建空对象:自身无任何属性和方法的对象 (因空对象继承自 Object ,所以还具有一些继承来的方法和属性)
let obj1 = {};// 创建自带属性和方法的对象
let obj2 = {// 属性name: "朝阳",//   方法sayHi: function () {console.log("你好!");},
};

ES6 的简写方式

  • 对象名和属性名相同时,name:name 可简写为 name
  • 方法的 :function 可省略不写
let name = "朝阳";
let obj2 = {name,sayHi() {console.log("你好!");},
};

ES6 开始支持动态属性和方法
即用变量作为对象的属性和方法名

let type = "book";
let obj = {[type + "Name"]: "《朝阳传》",[type + "Sale"]: function () {console.log("免费领取啦!");},
};

访问属性

// 属性为字符串时,用 . 
obj.name // 得到属性值 '朝阳'let type = 'hobby'
// 属性为变量时,用 []
obj[type]
  • 访问对象中不存在的属性,返回 undefined

在对象的方法内部访问该对象的属性,可以使用this,此时 this 就是当前对象。

let me = {name: '朝阳',sayName: function() {return this.name;}
};

获取对象所有的属性 Object.keys()

let obj = {a: 1,b: 2
}let keys = Object.keys(obj) // ['a', 'b']

获取对象所有的属性值 Object.values()

let obj = {a: 1,b: 2
}let values = Object.values(obj) // [1, 2]

添加属性

// 属性为字符串时,用 . 
obj.age = 35let type = 'hobby'
// 属性为变量时,用 []
obj[type] = '编程'

删除属性

// 属性为字符串时,用 . 
delete obj.agelet type = 'hobby'
// 属性为变量时,用 []
delete obj[type]

遍历对象 for in

for (let key in obj) {console.log("属性名:" + key );console.log("属性值:" + obj[key ]);
}

合并对象 Object.assign

let a = { gender: "male"}
Object.assign(a, { age: 25 })
console.log(a)  // {"age":25, "gender":"male"}
  • 第一个参数是发起合并的对象
  • 之后的参数是被合并的对象
  • 可以一次合并多个对象
let obj = { a: 1 };
Object.assign(obj, { b: 2 }, { c: 3 });
console.log(obj); // { a: 1, b: 2, c: 3 }
  • Object.assign() 的返回值为合并后的对象
  • Object.assign() 有副作用(会改变原对象)

拷贝对象

浅拷贝

let obj1 = {num:1}
let obj2 = obj1

此时变量 obj2 内存的是对象 {num:1} 的地址,变量 obj1 内存的也是对象 {num:1} 的地址,当变量改变时,obj1 和 obj2 都会改变。

深拷贝
为了避免变量后期改变时,对拷贝后的对象产生影响,经常需要进行深拷贝。

// 简易深拷贝 -- 存在缺陷,但对大部分简单的对象适用
let obj2 = JSON.parse(JSON.stringify(obj1));

更多深拷贝的方法见
https://blog.csdn.net/weixin_41192489/article/details/119633624

【实战】判断变量是否为空对象

if(JSON.stringify(obj)==="{}"){// 是空对象
}

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

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

相关文章

大数据开发中的元数据:从基础到高级应用的全面指南

在大数据开发中,元数据(Metadata)是指描述数据的数据。元数据可以提供有关数据结构、数据类型、数据约束和数据关系的重要信息。合理利用元数据可以显著提高数据建模和管理的效率。本文将详细介绍如何根据元数据建表,并提供一些代…

2024年公司电脑屏幕监控软件推荐|6款好用的屏幕监控软件盘点!

在当今的商业环境中,确保员工的工作效率和数据安全是每个企业管理者的重要任务。屏幕监控软件通过实时监控和记录员工的电脑活动,帮助企业有效地管理和优化工作流程。 1.固信软件 固信软件https://www.gooxion.com/ 主要特点: 实时屏幕监控…

养殖业饲料加工新选择,粉碎机械提升效率

在当今畜牧业快速发展的时代,饲料加工设备成为提升养殖效益的重要一环。其中,饲料加工粉碎机凭借其G效、便捷的特点,成为了养殖场的得力助手。 饲料加工粉碎机作为养殖业的重要设备之一,其主要功能是将各种原料如玉米、豆粕、麦…

Sentinel限流算法:滑动时间窗算法、漏桶算法、令牌桶算法。拦截器定义资源实现原理

文章目录 滑动时间窗算法基本知识源码算法分析 漏桶算法令牌桶算法拦截器处理web请求 滑动时间窗算法 基本知识 限流算法最简单的实现就是使用一个计数器法。比如对于A接口来说,我要求一分钟之内访问量不能超过100,那么我们就可以这样来实现&#xff1…

(一)高并发压力测试调优篇——MYSQL数据库的调优

前言 在实际项目开发中,很多业务场景下都需要考虑接口的性能要求,追求高并发、高吞吐量。那么对于此类问题如何入手呢?关注作者,不迷路。本节内容主要介绍在数据库db方面的优化,以mysql数据库为例。 关于db的优化&am…

7、matlab实现SGM/BM/SAD立体匹配算法计算视差图

1、matlab实现SGM/BM/SAD立体匹配算法计算视差图简介 SGM(Semi-Global Matching)、BM(Block Matching)和SAD(Sum of Absolute Differences)都是用于计算立体匹配(Stereo Matching)的…

远程帮客户解决“应用程序无法正常启动0xc000007b,请单击确定关闭应用程序”的问题

今天收到反馈,SmartPipe软件,在客户机器上报错,无法正常运行,采用远程控制软件进入客户电脑,发现电脑报错如下: 因为客户的电脑是win7,而之前发生过win7电脑上无法运行OCC编写的软件的情况&…

产品经理-一份标准需求文档的8个模块(14)

一份标准优秀的产品需求文档包括: ❑ 封面; ❑ 文档修订记录表; ❑ 目录; ❑ 引言; ❑ 产品概述:产品结构图 ❑ 详细需求说明:产品逻辑图、功能与特性简述列表、交互/视觉设计、需求详细描述&am…

Java实现数据结构——双链表

目录 一、前言 二、实现 2.1 类的创建 三、对链表操作实现 3.1 打印链表 3.2 插入数据 3.2.1 申请新节点 3.2.2 头插 ​编辑 3.2.3 尾插 3.2.4 链表长度 3.2.5 任意位置插入 3.3 删除数据 3.3.1 头删 3.3.2 尾删 3.3.3 删除指定位置数据 3.3.4 删除指定数据 3…

涉案财物管理系统|八大模块可视化展示

涉案财物管理系统DW-S405系统基于物联网技术规范涉案财物管理流程,确保涉案财物的安全性、完整性和合法性;可以提高办案效率,减少办案成本,实现资源共享。 涉案财物管理系统DW-S405主要分为 8 大模块数据展示。 1、案件信息&…

Linux C | 管道open打开方式

Linux C | 管道open打开方式 1.参考 1. 管道 2.现象 是的,这段代码在调用 open(AUDIOIN_FIFO, O_RDONLY) 时可能会被阻塞。原因是 FIFO(命名管道)在以只读模式打开时,如果没有其他进程以写模式打开该 FIFO,open 调用将…

防火墙综合实验二

目录 实验要求 IP地址配置 需求七 需求八 需求九 需求十 需求十一 实验要求 接防火墙综合实验一! 7,办公区设备可以通过电信链路和移动链路上网(多对多的NAT,并且需要保留一个公网IP不能用来转换)。 8,分公司设备可以通过…

美无定论,娜扎亦菲各自绽放你更爱哪一款?

娜扎亦菲各自绽放你更爱哪一款? 哎呀,这个问题可真是让我头疼呢, 就像让我在两个糖果店里选择最甜的那一颗一样难! 古力娜扎和刘亦菲,两位都是娱乐圈里璀璨的明珠, 美得各有千秋,让人怎么舍得…

C++基础入门(上)

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 C基础入门(上) 收录于专栏【C语法基础】 本专栏旨在分享学习C的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 1. C发展历史 2. C版本…

Goland 通道

channel通道 目录 channel通道 channel介绍 channel基本使用 有缓存通道和无缓存通道的区别 通道的初始化,写入数据到通道,从通道读取数据及基本的注意事项 channel的关闭和遍历 channel的关闭 为什么关闭 如何优雅地关闭通道 channel的遍历 chan…

小众好玩的赛车游戏:环道巨星 CIRCUIT SUPERSTARS中文安装包

《环道巨星》(Circuit Superstars)是一款由赛车迷亲手为其他赛车迷打造的俯视角赛车游戏。荟集史上各类赛车运动,旨在提供刺激好玩的驾驶体验;而游戏自带的高技术难度将促使玩家长时间磨砺技巧,以达成完美的一圈。 游戏…

【系统架构设计师】九、软件工程(面向对象方法|逆向工程)

目录 六、面向对象方法 6.1 基本概念 6.2 面向对象的分析 6.2.1 用例关系 6.2.2 类之间的关系 6.3 面向对象的设计 6.4 面向对象设计原则与设计模式 6.5 面向对象软件的测试 七、逆向工程 历年真题练习 六、面向对象方法 面向对象的分析方法 (Object-Oriented Analys…

【Linux网络】数据链路层【上】{初识数据链路层/以太网/路由表/MAC地址表/ARP表/NAT表}

文章目录 1.初识数据链路层2.认识以太网2.0前导知识以太网帧和MAC帧CMSA/CD以太网的最小帧长限制是64字节IP层和MAC层 2.1以太网帧格式 3.预备知识计算机网络通信以太网和wifi路由表/MAC地址表/ARP表/NAT表/ACL表 用于同一种数据链路节点的两个设备之间进行信息传递。 1.初识数…

Apache AGE 聚合函数

简介 一般来说,聚合函数 aggr(expr) 会处理每个聚合键在传入记录中找到的所有匹配行(键使用等价性进行比较)。 在常规聚合(即形式为 aggr(expr) 的情况下),聚合值列表是候选值列表,其中所有空…

Clion 使用gdbserver调试FreeSWITCH源码

1.准备环境 window安装clion安装好gdb、ssh、已经编译好的freeswitch可执行文件的docker镜像2.配置clion Settings -> Tools ->SSH Configurations Settings-Build, Execution, Deployment-Toolchains(其实设不设置都行,用默认也行的) Settings-Build, Execution, Depl…