改变JavaScript对象的rest和spread属性方法js教程

在ES5中,通过使用Lodash的_.extend(target,[sources])(或者其他选项),在ES2015中引入了Object.assign(target,[sources])。

幸运的是,对象的spread语法(ECMAScript第3阶段建议)是如何操作对象,提供了一个简短且易于遵循的语法。

在上面的例子中,...cat将cat对象复制到一个新的dog对象中。.sound属性的值woof放在最后面。

下面对可枚举属性简短的概括,以及如何区分自己与继承属性。这些是理解对象如何spread和rest语法的必要基础。

在JavaScript中,对象是键(key)和值(value)之间的关联。

key的类型通常是string或symbol。值可以是一个基本类型(string、boolean、number、undefined或null),也可以是一个object或function。

下面的对象使用了对象字面符:

属性(property)有几个属性(attribute)来描述值,还有可写的、可枚举的和可配置的状态。有关于这方面更多的细节,请参阅JavaScript中的对象属性。

可枚举属性是一个布尔值,它指的是在枚举对象属性是否可访问。

可以使用Object.keys()来枚举对象属性(有于访问自己的和可枚举的属性)。也可以使用for...in语句(枚举所有可枚举属性),等等。

name和surname是person对象可枚举的属性。

有趣的部分来了。Objectspread从源可枚举属性中克隆过来:

现在我们给person对象创建一个不可枚举的属性age。然后再看看Object的spread行为:

name和surname可枚举属从源对象person复制到clone对象中,但是不可枚举属性age并没有被复制进去。

JavaScript原型可以继承。因此对象属性可是以自己的,也可以是继承的。

接下来创建一个personB对象,并且设置它的属性为person:

Objectspread从自己的源属性中进行复制的时候,会忽略继承的属性。

对象字符符中里的Objectspread可以复制源对象自己的和可枚举的属性,并将其复制到目标对象中。

来看几个示例。下面的对象字面符实例化了一只猫:

同样的规则也适用于对象初始化的规则属性:

现在如果你交换传播对象的相对位置,结果是不同的:

Objectspread的位置和正则性质很重要。这种语法允许实现诸如对象克隆、合并和填充默认值之类的。

下面我们来看看。

使用ObjectSpread语法可以用一个简短而富有表现力的方式来克隆一个对象。下面的例子克隆了bird对象:

虽然克隆对象技术乍一看似乎很简单,但有一些细节的差异还是需要注意的。

ObjectSpread只会做一个对象的浅拷贝。只有对象本身是克隆的,而嵌套的实例不是克隆的。

laptop有一个嵌套的对象screen。如果克隆laptop对象,看看对其嵌套的对象有何影响:

然而,laptop.screen===laptopClone.screen值是true。这意味着,laptop.screen和laptopClone.screen引用相同的嵌套对象,但没有复制。

其实,你可以在任何级别上做传播。只需稍加努力,就可以克隆嵌套的对象:

doomClone是一个普通的JavaScript对象,其原型是Object.prototype,而不是Game.prototype,这是可以预期的。ObjectSpread不保存源对象的原型。

因此,调用doomClone.getMessage()会抛出一个TypeError错误,那是因为doomClone不会继承getMessage()方法。

要修复丢失的原型,需要手动使用__proto__:

不赞成使用__proto__,这里只是用来做演示。

对象传播滞后于调用构造函数创建的实例,因为它不保存原型。其意图是用来浅拷贝源对象自己和可枚举的属性。因此忽略原型的方法似乎也是合理的。

顺便说一下,使用Object.assign()可以更合理的克隆doom:

当一个对象在应用程序的多个地方共用时,直接修改这个对象可能会带来意想不到的副作用。而且跟踪这些修改也是极为蛋疼的事情。

更好的方法是使用操作不可变。不可变能更好的控制对象的修改,有利于编写纯函数。即使在一些复杂的场景中,也更容易确定对象更新的源和原因,因为数据流到一个单一的方向。

ObjectSpread方便以不可变的方式来修改对象。所设你有一个对象描述了一本书的版本信息:

不要忘记,后者会覆盖前者的规则。它给出了合并多个具有相同键对象的理由。

让我们改变一下前面的例子。现在part1和part3具有一个新的属性configuration:

newLine:在行尾添加字符串。默认为

indent:打算的行。默认值为''

multiline()函数几个示例:

使用ObjectSpread会非常简单,可以用默认值填充config对象。在对象字面符中首先展开默认对象,然后是config对象:

...defaultConfig从默认值中提取属性,然后...config配置将会覆盖以前的默认值和自定义属性值。

因此,safeConfig具有multiline()函数可以使用的全部属性。无论输入的配置是否会遗漏一些属性,safeConfig都会具备必要的值。

ObjectSpread能非常直观的使用默认值。

ObjectSpread非常酷的地方在于可以在嵌套对象上使用。当更新一个大对象时,这是一个很好的优势,具有很好的可读性。但还是推荐使用Object.assign()来替代。

下面的box对象定义了box的标签:

通过增加box.size.height使box变高。只需要在嵌套对象上扩展height属性:

...box可以确保biggerBox接收来自box源的属性。

更新嵌套对象box.size的height,只需要额外的一个对象字面量{...box.size,height:200}。这样一来,box.size的height属性就得到了一个新值,其值更新为200。

我喜欢通过一个语句执行多个更新的可能性。

如何将颜色改为黑色,将宽度增加到400,并添加一个新的项目ruler到items中(使用扩展数组)?这很简单:

当扩展undefined、null或原始值时,不会提取任何属性,也不会抛出任何错误。中会返回一个空的对象:

使用结构赋值将对象的属性提取到变量之后,剩余的属性可以被收集到rest对象中。

这就是对象rest属性的好处:

Objectrest只收集自己的和可枚举的属性。

注意,Objectrest必须是结构性赋值中的最后一个元素。因此const{...margin,width}=style将会报错:SyntaxError:Restelementmustbelastelement。

Objectspread有一些规则要记住:

它从源对象中提取自己的和可枚举的属性

扩展的属性具有相同键的,后者会覆盖前者

与此同时,Objectspread是简短而且富有表现力的,同时在嵌套对象上也能很好的工作,同时也保持更新的不变性。它可以轻松的实现对象克隆、合并和填充默认属性。

在结构性赋值中使用Objectrest语法,可以收集剩余的属性。

实际上,Objectrest和Objectspread是JavaScript的重要补充。

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

THE END
1.聊聊人际传播这个考点如何做笔记的专题进阶版 未知的陌生人:人际传播对象的不确定性 互联网的特点之一就是匿名性。网络空间的虚拟属性允许个人创造出与现实世界全然不同的角色特征,打破传统交往所依托的社会背景和个人真实信息是数字化生存的重要表征。随意设置和精心策划让网络中人际传播的对象相比于传统交往而言充斥了强烈的不确定性。交往双方的所有信息均可能...https://www.360doc.cn/article/75354099_977768036.html
1.Spring编程技术的经典面试题OXM(O/X Mapper,Object XML 映射),O/X 映射器这个概念并不新鲜,它的目的是在 Java 对象(几乎总是一个 plain old Java object,或简写为 POJO)和 XML 文档之间来回转换。例如有一个带有几个属性的简单 bean,且您的业务需要将那个 Java 对象转换为一个 XML 文档(编组,序列化),Spring 的 O/X Mapper 能够...https://blog.mimvp.com/article/46158.html
2.传媒观察认知传播学,从“认知”和“传播”入手从认知传播的应用范围上看,其研究有四项基本议题,分别是:传播渠道研究、传播内容研究、传播对象研究以及传播者研究。 (一)传播渠道研究:媒介介质差异对认知方式的塑造作用 随着技术的发展,媒介形态日新月异,其以一种“浸透”的方式存在人们生活的方方面面。 https://www.yangtse.com/zncontent/2707208.html
3.SSM框架练习题ssm选择题9.当数据表中的列和需要返回的对象的属性不完全一致, MyBatis是不会自动赋值的。此时,就可以使用【】元素进行处理。 答案:resultMap 10.SQL语句中,where后直接跟and,这在运行时肯定会报【】错误。 答案:SQL语法 二、判断题 11.当Bean的作用域为singleton时,Spring容器就只会存在一个共享的Bean实例,并且所有对Be...https://blog.csdn.net/qq_42009262/article/details/106140276
4.一份完整有效的活动策划方案!青瓜传媒一个有效的活动方案是活动策划的最核心的东西了,所以这里我们要加大篇幅重点说一下方案,我们再把“活动方案”再变成一个对象,看看它又有什么属性? 对象:活动方案 属性: 创意性 可操作性 对用户的吸引性 用户的传播性 接下来我们开始分析以上几个属性,并开始寻找相应的方法: ...https://www.opp2.com/134831.html
5.2022年10月自考00182公共关系学真题试卷自考A.知觉对象本身的特征 B.对象和背景的差别 C.对象的组合 D.需要 E.知识 25.传播的对象分析主要包括 A.传播对象的心理 B.传播对象的劝服 C.传播的媒介环境 D.传播的效果类型 E.传播的宣传方法 26.广告的商业功能有 A.沟通产销,刺激需求 B.了解心态,掌握需要 C.扩大销售,加速流通 D.加强沟通,传播文化 E...https://www.educity.cn/zikao/5016504.html
6.Netty核心知识总结(含部分源码解析)第二个子接口 ChannelOutBoundHandler 是处理写数据的逻辑,它是定义我们一端在组装完响应之后,把数据写到对端的逻辑,比如,我们封装好一个 response 对象,接下来我们有可能对这个 response 做一些其他的特殊逻辑,然后,再编码成 ByteBuf,最终写到对端,它里面最核心的一个方法就是 write()。 https://www.51cto.com/article/683699.html
7.原来这么多题都讲过,真的不会做都难!2021级「成都理工传播学...5.为什么同一传播者,用同一方法,传播同一内容讯息,对不同对象的传播效果不同,传播对象的哪些属性会影响传播效果? 简析: 传播效果的形成是一个多种因素交互作用的过程,不仅传播主体、内容和技巧会对效果产生影响,传播对象自身的属性也起着同样重要的制约作用。传播对象的属性通常包含以下几个方面:性别、年龄、文化程度...https://www.douban.com/note/790274852/
8.知识问答甲子研究院力总说:在命理学的视角,所谓「报应」这种事情不存在,因为违背了时间周期律,很不客观。比如,你见过狮子因为吃羊而被雷劈死的麽?没有。生来是狮子,像狮子一样活着,而已。 网友问:三合局的五行属性如果与身主本命是相生的,是不是会特别好? 力总说:从格局角度来讲,三合局代表一种生生不息的能量流转,比较吉利...http://www.jiazimao.cn/7
9.《数字影像设计与制作》复习资料32.定位策略:定位就是将广告作为一种传播活动,为了提高传播效果,从市场出发,确立传播对象:从消费者的信息心理与品牌认知实况出发,确立诉求点,投消费者之所好,从而在消费者心目中的产品阶梯上占据有利的位置,这个位置一旦确立起来,就会使人们在产生某一特定需求时,首先考虑该品牌。 【注释】:第5章第2节第111-112...https://www.wjx.cn/xz/260643709.aspx
10.愚公系列2023年03月其他Web前端基础面试题(VUE专项28、Vue 改变数组有时候无法触发视图更新是什么原因 Vue是通过Object.defineProperty()来实现双向数据绑定的。把一个普通 JavaScript 对象传给 Vue 实例的 data 选项,Vue 将遍历此对象所有的属性,并使用 Object.defineProperty 把这些属性全部转为 getter/setter,当使用push(), pop(), shift(), unshift(), splice(...https://cloud.tencent.com/developer/article/2240868
11.JavaScript事件流之事件处理和传播机制深入理解javascript技巧JavaScript中的事件流是一种机制,用于描述和处理事件在DOM树中的传播过程。了解事件流的属性和工作原理对于编写高效的事件处理代码和实现复杂的交互功能至关重要。 1. 事件流的发展流程 事件流在前端的发展过程中经历了一些变化和演进。 1.1 传统的DOM0级事件 ...https://www.jb51.net/javascript/298154icd.htm
12.西方新政治经济学的含义和性质四川省社会科学院天府智库理论研究新政治经济学是新自由主义经济学的一个组成部分,不过,与新自由主义经济学的主体相比,新政治经济学的新自由主义属性并不明显,因为它以政府和政策为研究对象,从而看似与排斥政府干预、宣称政策无效的新自由主义经济学不相干。然而这只是表面现象。 首先,新政治经济学对政府和政策的研究所持的是新自由主义的市场原教旨...http://www.sass.cn/109001/42226.aspx