Чтобы клонировать содержимое массива, все, что вам нужно сделать, это вызвать метод slice, передав 0 в качестве первого аргумента:

var clone = myArray.slice(0);

Код выше создает клон исходного массива; имейте в виду, если в вашем массиве существуют объекты - они хранятся как ссылки; т.е. код выше не делает “deep” клон содержимого массива.

Чтобы добавить клон, как нативный метод к массивам, вы могли бы сделать что-то вроде этого:

Array.prototype.clone = function () {
	return this.slice(0);
};

Давайте напишем рекурсивную функцию, чтобы клонировать массив, который потенциально может иметь вложенные объекты или массивы:

function arrayClone (arr) {
	var i, copy;
	
	if (Array.isArray(arr)) {
		copy = arr.slice(0);
		for (i = 0; i < copy.length; i++) {
			copy[i] = arrayClone(copy[i]);
		}
		return copy;
	} else if(typeof arr === 'object') {
		throw 'Cannot clone array containing an object!';
	} else {
		return arr;
	}
}

Если вы используете Underscore – можете сделать это еще короче:

function arrayClone (arr) {  
	if(_.isArray(arr)) {
		return _.map(arr, arrayClone);
	} else if(typeof arr === 'object') {
		throw 'Cannot clone array containing an object!';
	} else {
		return arr;
	}
}

С версии ECMAScript 2015 был введен метод Object.assign(), с его помощью глубокое клонирование можно реализовать еще проще:

var clone = Object.assign([], myArray);

Заключение

Если вам нужно глубокое клонирование произвольно-вложенных объектов и/или массивов, крошечный node-clone прекрасно с этим справиться. Он будет правильно обрабатывать даже клонирование объектов с циклическими ссылками!

Источники

Теги: перевод, javascript