做对象推入数组在javascript深或浅复制
Do objects pushed into an array in javascript deep or shallow copy?
很明显的问题…当在javascript中对数组使用.push()时,被推入数组的对象是指针(浅)还是实际对象(深),而不管类型为。
这取决于你在推什么。对象和数组作为指向原始对象的指针被压入。内置基本类型(如数字或布尔值)被作为副本压入。因此,由于对象不以任何方式复制,因此它们不存在深复制或浅复制。
下面是显示它的工作代码片段:
var array = [];
var x = 4;
let y = {name: "test", type: "data", data: "2-27-2009"};
// primitive value pushes a copy of the value 4
array.push(x); // push value of 4
x = 5; // change x to 5
console.log(array[0]); // array still contains 4 because it's a copy
// object reference pushes a reference
array.push(y); // put object y reference into the array
y.name = "foo"; // change y.name property
console.log(array[1].name); // logs changed value "foo" because it's a reference
// object reference pushes a reference but object can still be referred to even though original variable is no longer within scope
if (true) {
let z = {name: "test", type: "data", data: "2-28-2019"};
array.push(z);
}
console.log(array[2].name); // log shows value "test" since the pointer reference via the array is still within scope
jfriend00在这里是正确的,但是有一点需要澄清:这并不意味着您不能更改变量指向的内容。也就是说,y
最初引用了您放入数组中的一些变量,但是您可以使用名为y
的变量,将其从现在数组中的对象断开,并连接y
(即使其引用)完全不同的东西,而不改变现在仅由数组引用的对象。
var array = [];
var x = 4;
var y = {name: "test", type: "data", data: "2-27-2009"};
// 1.) pushes a copy
array.push(x);
x = 5;
document.write(array[0] + "<br>"); // alerts 4 because it's a copy
// 2.) pushes a reference
array.push(y);
y.name = "foo";
// 3.) Disconnects y and points it at a new object
y = {};
y.name = 'bar';
document.write(array[1].name + ' :: ' + y.name + "<br>");
// alerts "foo :: bar" because y was a reference, but then
// the reference was moved to a new object while the
// reference in the array stayed the same (referencing the
// original object)
// 4.) Uses y's original reference, stored in the array,
// to access the old object.
array[1].name = 'foobar';
document.write(array[1].name + "<br>");
// alerts "foobar" because you used the array to point to
// the object that was initially in y.
JavaScript:在2023创建一个对象的深度拷贝
不要在JavaScript中使用Object.assign()
来复制或克隆对象!创建对象的浅拷贝,并将深拷贝中的对象赋值给引用指针!
你有两个选择
使用旧的、更可靠的JSON
技巧:
const obj1 = JSON.parse(JSON.stringify(YourObject));
或者试试新的&改进的structuredClone()
方法。警告:这只适用于自2022以来更新了常绿浏览器的用户!不支持Internet Explorer或Edge Trident浏览器!!
const obj2 = structuredClone(YourObject);
相关文章:
- 复制当前url按钮-Javascript
- JavaScript”;复制“;HTML表单
- 在Javascript中复制C#服务器端验证
- 如何在Javascript中实现剪切、复制和粘贴功能
- 复制Javascript日期选择器
- 未复制JavaScript原型
- 阻止人们复制JavaScript代码
- 设置/复制javascript计算样式从一个元素到另一个元素
- 我正在克隆/复制javascript对象.我做得对吗
- 复制 JavaScript 原型实例
- 如何复制JavaScript's的提示函数在一个带有密码字段的新模式中
- 当通过引用而不是按值复制 JavaScript 值时,是否有任何经验法则
- 如何在Objective-C中复制JavaScript unescape()函数
- JQuery使用ajax复制javascript到文档
- 在php中复制javascript数组
- 按值复制Javascript DOM对象
- 复制Javascript对象到另一个对象,不创建新的属性
- 复制 JavaScript 画布中的磁贴区域
- 无法复制javascript中的对象属性
- 复制Javascript "Class"对象的原型