对于习惯使用 python 和 C++ 的人来说,使用 = 通过引用而不是值复制对象根本不直观。不仅如此,似乎还没有直接的方法来复制对象。 JSON.parse(JSON.stringify) 是最接近的选项(如果我没记错的话),即使这样也有问题。
a) 在所有变量都被视为对象的语言中,为什么 =
运算符要区分原始数据类型和非原始数据类型来决定是按值复制还是按引用复制?
b) 为什么对象不能按值复制?
c) 对于习惯按值将对象复制到没有值的代码的初学者来说,哪些技术有帮助?
最佳答案
a) In a language where all variables are anyway treated as objects, why does the = operator distinguish [...] ?
=
(赋值)运算符不区分原始数据类型和非原始数据类型。考虑到赋值后保留了相等性(不包括异常(exception),例如 NaN
,...),它对两者都有相同的作用。
b) Why is copy by value not possible for objects?
a) 中的错误假设导致了这种情况。赋值不是副本,对象的副本不保持相等性。
或者想想:
var obj = {a: {b: 1}}
.
obj.a
的值是多少?它只是对 {b:1}
的引用。
c) What techniques are helpful for a beginner used to copying objects by value to code without it?
有很多方法可以实现这一点。还有两个小案例。
作为第一种情况,我们知道对象的布局。因此创建一个模板或构造函数并将所有值传递到相应的属性中。
作为第二种情况,假设一个循环对象包含深度为 n 的 javascript 中所有可能的内容(函数、正则表达式、符号、未定义等)并构建一些东西(不是 json.stringify )。
对于初学者:possible duplicate
假设:
原始和非原始数据类型具有默认的 getter、setter、...
关于javascript - 为什么JS不提供一种简单的方法来对对象执行深复制呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59659280/