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/ 主要特点: 实时屏幕监控…

ConditionalOnSingleCandidate注解使用介绍、应用场景以及示例代码

概述 ConditionalOnSingleCandidate 是Spring Framework中的一个条件注解,它用于根据特定类型的 bean 是否有且仅有一个候选者来决定是否创建一个 bean 或者配置一个类。 应用场景 依赖特定类型的唯一bean: 当需要依赖一个特定类型的 bean,并且这种类型…

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

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

简单的网页压力测试

要进行简单的网页压力测试,可以使用Python的requests库来发起请求,并结合time模块来控制请求频率。以下是一个基本的实现,它会每分钟发送指定次数的请求到目标网址。 import requests import time# 目标网址 url ***# 每分钟请求的次数 req…

【GameFramework扩展应用】6-3、GameFramework框架增加日志保存功能

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址QQ群:398291828大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 【GameFramework框架】系列教程目录: https://blog.csdn.net/q764424567/article/details/1…

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编写的软件的情况&…

termux 安装 rockylinux

centos已经被“招安”了,取而代之的是rockylinux,本文记录我自己的配置,主要需求是使用termux安装rockylinux文件系统,并使用supervisor自启动code-server 安装termux 从https://github.com/termux/termux-app/releases/获取最新…

常用视觉分类、目标检测模型性能测试

说明 测试常用CV模型在单张图像上的识别速度,不包含图像读取时间,但包含图像预处理。可以在以后的应用中根据硬件配置选取合适的模型,达到最佳效果。其中推理速度为正常推理的速度,加速CPU使用openvino加速,GPU使用te…

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

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

docker运行nginx挂载前端html页面步骤

1.常用docker命令 1.docker ps -a 查看所有容器 2.docker ps查看存活的容器 3.docker rm 删除容器 4.docker stop 停止容器运行 5.docker logs 容器id 查看容器日志 6.docker images 查看镜像 7.docker rmi 删除镜像 8.docker exec nginx nginx -s reload 重新加载conf文件…

H3C MSR2600路由器IPv6地址显示TENTATIVE的故障

有一MSR2600路由器,系统软件版本为5.2 R2516P28,使用电信PON PPPoE拨号上网。 在全局启用IPv6,并在Dialer接口上配置了如下IPv6命令: ipv6 address auto ipv6 address auto link-local 使用display ipv6 interface brief命令查看…

Java中的volatile关键字有什么作用?

Java中的volatile关键字是一种轻量级的同步机制,它主要有两个作用: 保证可见性(Visibility): 当多个线程访问某个类的共享变量时,如果没有适当的同步机制,一个线程对变量的修改可能对其他线程不…

闲来无事,论茴香豆的茴有几种写法

一、引言 以下是几行浅薄而简洁的代码,聊聊add函数有哪几种写法。抛砖引玉,也许在你实际的项目中会带来些许的收益。 二、知识点 知识点比较简单: 左值和右值引用,std::move 的移动语义,模版等 三、代码&#xff0…

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…

C++ PImpl模式、指向实现的指针、PImpl Idiom、隐藏实现细节

C PImpl模式、指向实现的指针、PImpl Idiom、隐藏实现细节 flyfish PImpl 全称是 “Pointer to Implementation”,在中文中通常翻译为“指向实现的指针”或者“指向实现”。PImpl 是一种编程技巧,通常用于 C 中,通过这种技术,可…

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

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