Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么可以';不复制对象吗?_Javascript - Fatal编程技术网

Javascript 为什么可以';不复制对象吗?

Javascript 为什么可以';不复制对象吗?,javascript,Javascript,或者可以吗?这听起来像个愚蠢的问题。。。我真的希望这是因为我最初在谷歌上搜索时,相信没有简单的方法可以在JavaScript中复制对象 假设你有以下几点: var allFood=[‘鱼’、‘绿色’、‘水果’、‘糖果’、‘苏打’、‘饼干’]; var moreFood=所有食品; var diffood=所有食物; 剪接(3,0,“谷物”,“果汁”); diffFood.拼接(3,3,“玉米饼”,“肉”); 文件。写(allFood+“”); 文件。书写(食物)您可以阅读Javascript的

或者可以吗?这听起来像个愚蠢的问题。。。我真的希望这是因为我最初在谷歌上搜索时,相信没有简单的方法可以在JavaScript中复制对象

假设你有以下几点:

var allFood=[‘鱼’、‘绿色’、‘水果’、‘糖果’、‘苏打’、‘饼干’];
var moreFood=所有食品;
var diffood=所有食物;
剪接(3,0,“谷物”,“果汁”);
diffFood.拼接(3,3,“玉米饼”,“肉”);
文件。写(allFood+“
”);
文件。书写(食物)您可以阅读Javascript的按引用传递和按值传递行为

要克隆javascript对象,可以使用库


现在,您对allFood所做的更改不会影响moreFood,反之亦然。

克隆es6中可用对象的简单方法,尽管大多数浏览器当前支持的是Object.assign

var original = [1, 2, 3];
var copy = [];

Object.assign(copy, original);

copy.push(2);
//=> [1, 2, 3, 2]

console.log(original);
// => [1, 2, 3];

对于您的特定示例,即对于具有简单元素的数组,该方法可以执行以下操作:

var allFood = ['fish', 'greens', 'fruit', 'candy', 'soda', 'cookies'];
var moreFood = allFood.slice();
var diffFood = allFood.slice();
此方法创建一个所谓的数组类型。因此,它可以处理具有字符串、数字和布尔值的数组

如果数组元素是对象,则复制该对象引用,因此数组共享原始对象:

var a = [{x: 1}];
var b = a.slice();
// both arrays reference the same object:
console.log(a[0] === b[0]); // output: true
// so...
b[0].x = 2;
console.log(a[0].x); // output: 2 

在链接的“复制”线程中回答了您的问题的可能重复。可能重复的注意:您似乎在谈论复制javascript中的数组,而不是具有键/值对的javascript对象。您可以使用
moreFood=allFood.slice()
获取allFood的值,而无需引用原始变量。仔细想想,通过将对象复制到被调用的环境中来传递对象会非常复杂。比如,这到底是怎么回事?语义是什么?你能做一份深拷贝吗?如何复制对闭包的引用?性能将非常糟糕,语义将异常复杂。链接问题的最高级答案是错误的。此外,该问题与参数传递无关。这是关于简单赋值的行为。
var a = [{x: 1}];
var b = a.slice();
// both arrays reference the same object:
console.log(a[0] === b[0]); // output: true
// so...
b[0].x = 2;
console.log(a[0].x); // output: 2