在Javascript中,深度复制技术取决于数组中的元素。让我们从这里开始。
三种类型的元素
元素可以是:文字值,文字结构或原型。
// Literal values (type1)
const booleanLiteral = true;
const numberLiteral = 1;
const stringLiteral = 'true';
// Literal structures (type2)
const arrayLiteral = [];
const objectLiteral = {};
// Prototypes (type3)
const booleanPrototype = new Bool(true);
const numberPrototype = new Number(1);
const stringPrototype = new String('true');
const arrayPrototype = new Array();
const objectPrototype = new Object(); // or `new function () {}`
从这些元素中,我们可以创建三种类型的数组。
// 1) Array of literal-values (boolean, number, string)
const type1 = [true, 1, "true"];
// 2) Array of literal-structures (array, object)
const type2 = [[], {}];
// 3) Array of prototype-objects (function)
const type3 = [function () {}, function () {}];
深层复制技术取决于三种阵列类型
根据数组中元素的类型,我们可以使用各种技术进行深层复制。
function copy(aObject) {
if (!aObject) {
return aObject;
}
let v;
let bObject = Array.isArray(aObject) ? [] : {};
for (const k in aObject) {
v = aObject[k];
bObject[k] = (typeof v === "object") ? copy(v) : v;
}
return bObject;
}
所以要回答这个问题...
题
var arr1 = ['a','b','c'];
var arr2 = arr1;
我意识到arr2与arr1指向相同的数组,而不是一个新的独立数组。如何复制阵列以得到两个独立的阵列?
回答
因为arr1
是文字值(布尔值,数字或字符串)的数组,所以可以使用上面讨论的任何深度复制技术,其中散布运算符...
的性能最高。
// Highest performance for deep copying literal values
arr2 = [...arr1];
// Any of these techniques will deep copy literal values as well,
// but with lower performance.
arr2 = arr1.slice();
arr2 = arr1.splice(0);
arr2 = arr1.concat();
arr2 = JSON.parse(JSON.stringify(arr1));
arr2 = $.extend(true, [], arr1); // jQuery.js needed
arr2 = _.extend(arr1); // Underscore.js needed
arr2 = _.cloneDeep(arr1); // Lo-dash.js needed
arr2 = copy(arr1); // Custom-function needed - as provided above
slice
和splice
操作和新的传播经营者,并Array.from
具有慢得多的实现。看看perfjs.fnfo