奇怪的行为;删除“;javascript中的关键字
我有一个对象“a”,我把它分配给另一个名为“b”的变量。 现在我使用delete关键字从“b”中删除一些属性值。它从对象“a”和“b”中删除该属性。为什么呢 我是javascript的初学者。对我宽容点 代码:-奇怪的行为;删除“;javascript中的关键字,javascript,Javascript,我有一个对象“a”,我把它分配给另一个名为“b”的变量。 现在我使用delete关键字从“b”中删除一些属性值。它从对象“a”和“b”中删除该属性。为什么呢 我是javascript的初学者。对我宽容点 代码:- a={ 答:1,, b:2, c:3 } 设b=a; console.log(a);//输出{a:1,b:2,c:3} 删除b.a; console.log(a)//预期输出{a:1,b:2,c:3}——实际输出{b:2,c:3}您的问题更多地涉及到这样一个事实,即某些类型是通过值分
a={
答:1,,
b:2,
c:3
}
设b=a;
console.log(a);//输出{a:1,b:2,c:3}
删除b.a;
console.log(a)//预期输出{a:1,b:2,c:3}——实际输出{b:2,c:3}
您的问题更多地涉及到这样一个事实,即某些类型是通过值分配的,而其他类型是通过引用分配的
简而言之
原语类型由值(布尔值、空值、未定义值、数字、字符串、符号)指定(ES 6中新增)
非基本类型通过引用(对象、数组、函数)分配
示例:基本类型 正如您所见,更改
b
不会影响a
,因为数字是按值分配的
示例:非基本类型 正如您所见,更改
b
会影响a
的值,因为它是通过引用分配的,这与您的示例类似,该问题与delete
无关,但它与对象是通过引用分配的事实有关,因此从b
中删除键将影响a
克隆: 在某些情况下,您需要克隆非基元类型的对象,并且不改变当前对象,您可以使用以下方法:
var clone=Object.assign({},obj)代码>或
var clone=JSON.parse(JSON.stringify(obj))代码>
var clone={…obj}代码>
clone
不会影响obj
最后,您可以在本教程中阅读更多有关此主题的内容,这可以让您更好地了解如何使用内存分配插图进行此操作:
let b = a;
只需将对象a的引用传递给b。所以a和b指向同一个参考。因此,其中任何一项的变化都将反映在其他方面
基本上,你的记忆中有这样的东西:
a:ref12345−−−+
|
|
| +−−−−−−−−−−−−−+
+−−−>| (object) |
| +−−−−−−−−−−−−−+
| | prop1: "a" |
| | prop2: "b" |
b :ref12345−−+ | prop3: "c" |
| |
+−−−−−−−−−−−−−+
Java脚本数组是通过引用复制来复制的。因此,如果编辑复制的数组,则会更改原始数组。 你可以用 设b=a。切片() 或 ES6中的扩展运算符。
设b=[…a]这是通过引用传递的,这里
a
和b
都将具有相同的值,因此它从相同的值中删除“b”和“a”都是指向同一对象的变量。可能的重复是指a到b。不将a的值复制到b数组中。可以是b={…a}非常感谢。我明白了。我可以按值分配非基本类型吗?欢迎您。。。可能您正在询问如何克隆您的对象。。。我也编辑了答案来解释这一点:)
let b = a;
a:ref12345−−−+
|
|
| +−−−−−−−−−−−−−+
+−−−>| (object) |
| +−−−−−−−−−−−−−+
| | prop1: "a" |
| | prop2: "b" |
b :ref12345−−+ | prop3: "c" |
| |
+−−−−−−−−−−−−−+