为什么javascript无法复制对象?

时间:2015-11-27 23:32:23

标签: javascript

还是可以吗?这可能听起来像一个愚蠢的问题......我真的希望这是因为我最初的谷歌搜索引导我相信没有简单的方法来复制JavaScript中的对象。

说你有以下内容:

    var allFood = ['fish', 'greens', 'fruit', 'candy', 'soda', 'cookies'];
    var moreFood = allFood;
    var diffFood = allFood;
    moreFood.splice(3, 0, "grain", "juice");
    diffFood.splice(3, 3, "tacos", "meat");
    document.write(allFood + "<br/>");
    document.write(diffFood);

现在它们都等于“鱼,绿,水果,炸玉米饼,肉,苏打水,饼干”,因为缺乏更好的词语而令人讨厌。

你能解释为什么JavaScript有这个限制吗?

是的,我读到这个:What is the most efficient way to deep clone an object in JavaScript?这看起来有点麻烦,当我用上面的例子尝试时它实际上失败了......

3 个答案:

答案 0 :(得分:2)

对于您的具体示例,即对于具有简单元素的数组,slice方法可以执行此操作:

var allFood = ['fish', 'greens', 'fruit', 'candy', 'soda', 'cookies'];
var moreFood = allFood.slice();
var diffFood = allFood.slice();

此方法创建一个所谓的shallow copy数组。所以它为primitives的数组做了工作,比如字符串,数字和布尔值。

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

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 

答案 1 :(得分:0)

您可以阅读有关Javascript的传递引用和按值传递的行为here

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

var allFood = ['fish', 'greens', 'fruit', 'candy', 'soda', 'cookies'];
var moreFood = lodash.cloneDeep(allFood);

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

答案 2 :(得分:-2)

克隆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];