JavaScript中“删除”关键字的奇怪行为

时间:2018-07-07 19:25:25

标签: javascript

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

P.S:我是javascript的初学者。对我好一点。

代码:-

foo

3 个答案:

答案 0 :(得分:2)

您的问题与以下事实有关:某些类型是通过值分配的,而其他类型是通过引用分配的。

快速摘要

原始类型由值(布尔值,空值,未定义,数字,字符串,符号(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中阅读有关此主题的更多信息,它可以使您更好地了解此方法与内存分配图例如何工作

答案 1 :(得分:0)

操作时:

let b = a;

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

基本上,您的内存中包含以下内容:

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

答案 2 :(得分:0)

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

让b = a。 slice()

ES6中的传播算子。 让b = [... a]

相关问题