【问题标题】:Array by Reference vs Array by Value in JavascriptJavascript中的引用数组与值数组
【发布时间】:2015-08-28 00:48:19
【问题描述】:

我正在阅读 O'reily 的 Data Structures and Algorithms with Javascript 并指出以下内容:

浅拷贝(两个数组指向内存中的同一位置):

var nums = [];
for (var i = 0; i < 100; ++i) {
nums[i] = i+1;
}
var samenums = nums;
nums[0] = 400;
print(samenums[0]); // displays 400

深拷贝:

function copy(arr1, arr2) {
for (var i = 0; i < arr1.length; ++i) {
arr2[i] = arr1[i];
}
}

现在下面的代码片段产生了预期的结果:

var nums = [];
for (var i = 0; i < 100; ++i) {
nums[i] = i+1;
}
var samenums = [];
copy(nums, samenums);
nums[0] = 400;
print(samenums[0]); // displays 1

为什么需要一个函数来创建深层副本?

【问题讨论】:

  • Why is a function required in order to create deep copies? - 因为这就是javascript的工作方式,改变它会破坏网络
  • 该功能不是必须的,只是美观和可重用性
  • 实际上并不是两个数组。您的“浅拷贝”根本不是真正的拷贝。我们不是说“两个数组指向内存中的相同位置”,而是两个变量指向(或:持有)同一个数组。如果需要,可以显式创建一个新数组,例如通过.slice() 或您的copy([], …) 函数。

标签: javascript arrays oop object


【解决方案1】:

如 cmets 中所述,该功能纯粹是为了美观和可重用性,并非绝对必要。

你可以重构你的例子:

function copy(arr1, arr2) {
    for (var i = 0; i < arr1.length; ++i) {
        arr2[i] = arr1[i];
    }
}

var nums = [];
for (var i = 0; i < 100; ++i) {
    nums[i] = i+1;
}
var samenums = [];
copy(nums, samenums);
nums[0] = 400;
print(samenums[0]); // displays 1

进入这个等效的无功能示例:

var nums = [];
for (var i = 0; i < 100; ++i) {
    nums[i] = i+1;
}
var samenums = [];
for (var i = 0; i < nums.length; ++i) {
    samenums[i] = nums[i];
}
nums[0] = 400;
print(samenums[0]); // displays 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-15
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-07
    相关资源
    最近更新 更多