【问题标题】:Strange behavior of "delete" keyword in javascriptjavascript中“删除”关键字的奇怪行为
【发布时间】:2018-12-16 00:04:36
【问题描述】:

我有一个对象“a”并将它分配给另一个名为“b”的变量。 现在我使用 delete 关键字从“b”中删除一些属性值。它从对象“a”和“b”中删除该属性。这是为什么呢?

P.S:我是 javascript 的初学者。对我放轻松。

代码:-

let a = {
  a:1,
  b:2,
  c:3
}

let b = a;
console.log(a);   // output   { a: 1, b: 2, c: 3 }
delete b.a;
console.log(a)   // Expected output { a: 1, b: 2, c: 3 }    -- Actual output { b: 2, c: 3 }

【问题讨论】:

  • 这是通过引用传递的,这里ab 将具有相同的值,因此从相同的值中删除
  • “b”和“a”都是指向same对象的变量。
  • 您指的是 a 到 b。您没有将 a 的值复制到 b 数组中。它可以是 b = {...a}

标签: javascript


【解决方案1】:

您的问题与某些类型按值分配而其他类型按引用分配的事实更相关。

简单总结

原始类型按值分配(Boolean、Null、Undefined、Number、String、Symbol(ES 6 中新增))

非原始类型通过引用分配(对象、数组、函数)


示例:原始类型

let a = 1;
let b = a;

console.log(a); // 1
console.log(b); // 1

b = 2;

console.log(a); // 1
console.log(b); // 2

正如您所见,更改 b 不会影响 a,因为数字是按值分配的。


示例:非原始类型

let a = { name: 'Amr' };
let b = a;

console.log(a); // { name: 'Amr' };
console.log(b); // { name: 'Amr' };

b.name = "John";

console.log(a); // { name: 'John' };
console.log(b); // { name: 'John' };

如您所见,更改 b 影响了 a 的值,因为它是通过引用分配的,这与您的示例类似,问题与 delete 无关,但与对象有关是通过引用分配的,因此从b 删除键将影响a


克隆:

在某些情况下,您需要克隆非原始类型对象而不改变当前对象,您可以使用以下方式进行操作:

  1. ES5 var clone = Object.assign({}, obj);var clone = JSON.parse(JSON.stringify(obj));

  2. ES6 var clone = { ...obj };

现在更新clone不会影响obj


最后,您可以在link 中阅读有关此主题的更多信息,它可以让您更好地了解它如何与内存分配插图一起使用

【讨论】:

  • 非常感谢。我已经明白了。 :)。我可以按值分配非原始类型吗?
  • 不客气......可能你在问如何克隆你的对象......我已经编辑了答案来解释这一点:)
【解决方案2】:

Java 脚本数组通过引用复制进行复制。因此,如果您编辑复制的数组,原始数组将被更改。 你可以使用

让 b = a。切片()

或者

ES6 中的扩展运算符。 让 b = [... a]

【讨论】:

    【解决方案3】:

    当你这样做时:

    let b = a;
    

    您只需将对象 a 的引用传递给 b。所以 a 和 b 指向同一个引用。因此,对其中任何一项所做的更改都会反映在其他项中。

    基本上你的记忆中有这样的东西:

    a:ref12345−−−+
                 |
                 |
                 |    +−−−−−−−−−−−−−+                 
                 +−−−>|  (object)   |                 
                 |    +−−−−−−−−−−−−−+                 
                 |    | prop1: "a"  |                 
                 |    | prop2: "b"  |
    b :ref12345−−+    | prop3: "c"  |
                      |             |
                      +−−−−−−−−−−−−−+                
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-20
      • 1970-01-01
      • 2012-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多