当前位置: 首页 > 知识库问答 >
问题:

在javascript中使用delete关键字和将未定义的值赋给对象文字有什么区别?[重复]

阎善
2023-03-14

我满足了一些深度复制原始对象文字的需求,除了一些键。我知道扩展运算符不会深度复制整个嵌套对象,但这不是这个问题的要点,所以让我们通过这个问题。

所以,回到原来的问题,我看不出使用delete关键字和将undefined分配给我要删除的目标属性之间有什么区别。

const original = {
   a: 1,
   b: 2,
}

const copied = {
  ...original,
  b: undefined
}

const explicitDelete = {
 ...original
}
delete explicitDelete["b"]

似乎复制的方式没有那么冗长,但这样完全可以吗?

共有3个答案

太叔景曜
2023-03-14

删除删除条目,这就是区别

孔阳炎
2023-03-14

肯定有区别。当您使用delete时,对象将根本不再具有属性名称。运算符中的将表明这一点。将属性值设置为未定义不会有这种效果。

方博
2023-03-14

我认为使用删除关键字和将未定义分配给目标属性没有区别

不同之处在于该属性仍然以值未定义存在:

"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中的和关键字有什么区别?