我满足了一些深度复制原始对象文字的需求,除了一些键。我知道扩展运算符不会深度复制整个嵌套对象,但这不是这个问题的要点,所以让我们通过这个问题。
所以,回到原来的问题,我看不出使用delete关键字和将undefined分配给我要删除的目标属性之间有什么区别。
const original = {
a: 1,
b: 2,
}
const copied = {
...original,
b: undefined
}
const explicitDelete = {
...original
}
delete explicitDelete["b"]
似乎复制的
方式没有那么冗长,但这样完全可以吗?
删除删除条目,这就是区别
肯定有区别。当您使用delete
时,对象将根本不再具有属性名称。运算符中的将表明这一点。将属性值设置为
未定义
不会有这种效果。
我认为使用删除
关键字和将未定义
分配给目标属性没有区别
不同之处在于该属性仍然以值未定义
存在:
"b" in copied // true
"b" in explicitDelete // false
如果您不喜欢delete
的冗长,可以使用helper函数
function omit(obj, ...keys) {
const res = {};
for (const p in obj)
if (!key.includes(p))
res[p] = obj[p];
return res;
}
omit(orignal, "b")
或使用rest语法进行对象分解:
const {b:_, ...withoutB} = original;
另请参见如何在JavaScript中省略对象的特定属性,如何从JavaScript对象中移除属性?,除了一个键,怎么克隆一个JavaScript对象?
定义String对象直接使用“=”赋值和new 创建对象赋值有什么区别? 在研究String直接赋值与new String的区别之前我们需要先了解java中的字符串常量池的概念。 字符串常量池 String类是我们平常项目中使用频率非常高的一种对象类型,jvm为了提升性能和减少内存开销,避免字符的重复创建,其维护了一块特殊的内存空间,即字符串池
问题内容: 看这两个简单的程序: 程序1: 程式2: 我想知道在Program-1 的最后一行和Program-2 的最后一行之间是否有区别?(任何区别!) 问题答案: 在第二个程序中,are不是数组定界符,它们是块定界符;在这种情况下,它们用于提供所谓的初始化块,该初始化块在实例化类的新实例时执行。 创建初始化数组的“正确”方法是: 在初始化引用,使用现有引用或将数组传递给方法时,都可以始终使用
问题内容: 我正在阅读“学习节点”这本书,但陷入了一个非常简单的问题,这个问题我并没有考虑太多:javascript中的赋值。 作者指出,我们应该意识到,通过使用Node的REPL,以下内容将返回undefined: 而以下代码将在REPL中返回“ 2”: 这是为什么?上面的代码不是归因吗?怎么会?如果var’a’直到代码中的那个点才存在,那么为什么它不存在并归因于此? 问题答案: 根据ECMA-
问题内容: 有人可以告诉我使用 对象文字表示法 定义的JavaScript对象与 JSON对象 之间的主要区别是什么吗? 根据一本JavaScript书,它说这是使用 Object Notation 定义的 对象 : 为什么在这种情况下不是JSON对象?只是因为它不是通过使用引号定义的? 问题答案: 首先让我们澄清一下 JSON 到底是什么。JSON是一种 文本形式的 ,与语言无关的数据交换格式,
问题内容: 什么是Java中的以下关键字的区别:,? 问题答案: an 是a的行为的抽象规范,而a 是此类规范的具体实现。 因此,当您撰写本文时,是在说您已经在实现的实现中满足了一些抽象规范。 意味着您可以采用实现()或规范(),并使用其他功能或新功能对其进行添加(或更改其行为的规范),从而修改其行为并对其进行_扩展_ 。
Dart中的和关键字有什么区别?