[就像曾经使用python和C ++的人那样,通过引用而不是值来复制对象=根本不直观。不仅如此,而且似乎没有直接复制对象的直接方法。 JSON.parse(JSON.stringify)
是最接近的选项(如果我知道的话),即使那样也有问题。
a)在将所有变量都视为对象的语言中,为什么=
运算符区分要通过值复制还是引用复制的原始数据类型和非原始数据类型?
b)为什么对象无法按值复制?
c)哪些技术对初学者有用,可用于按值将对象复制为没有值的代码?
a)在所有变量都被视为对象的语言中,为什么=运算符可以区分[...]?
=
(assign)运算符不区分原始数据类型和非原始数据类型。考虑到分配后保留了相等性(排除例外,例如NaN
,...),这对两者都一样。
b)为什么对象无法按值复制?
a)中的错误假设导致了这一点。分配是无副本,并且对象的副本不会保留相等性。
或考虑:var obj = {a: {b: 1}}
。
obj.a
的值
{b:1}
的reference。c)哪些技术对用于复制对象的初学者有用?按值编码没有它?
[有很多方法。还有两个小案例。
作为第一种情况,我们知道对象的布局。因此,创建一个模板或构造函数,并将所有值传递到相应的属性中。
作为第二种情况,我们假设一个循环对象包含深度为n的javascript中所有可能的东西(函数,正则表达式,符号,未定义等等),并构建某种东西(不是json.stringify
)。
对于初学者:possible duplicate