Как скопировать массив на JavaScript
При программировании на JavaScript иногда требуется создать копию массива. Но особенность заключается в том, что в JavaScript массив является объектом, поэтому при использовании оператора присваивания, новой копии создаваться не будет, а просто будет создана ссылка на существующий массив. Если после этого попробовать внести какие-нибудь изменения в любой из этих массивов, то изменения будут внесены сразу в оба. Так получается, потому что фактически это один и тот же объект. Например:Code (JavaScript) : Убрать нумерацию
- // Как хочется сделать, но не получится
- var old_array = ['one', 'two', 'three'];
- var new_array = old_array;
- // Добавляем по одному элементу в исходный и "новый" массив
- old_array.push('banana');
- new_array.push('lemon');
- // Получается вот что
- // old_array = ['one', 'two', 'three', 'banana', 'lemon'];
- // new_array = ['one', 'two', 'three', 'banana', 'lemon'];
Code (JavaScript) : Убрать нумерацию
- // Корректный вариант решения
- var old_array = ['one', 'two', 'three'];
- var new_array = old_array.slice(0);
- // Добавляем по одному элементу в исходный и новый массив
- old_array.push('banana');
- new_array.push('lemon');
- // Теперь все правильно
- // old_array = ['one', 'two', 'three', 'banana'];
- // new_array = ['one', 'two', 'three', 'lemon'];
Просмотров: 4740 | Комментариев: 6
Метки: JavaScript
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
artem
(15.08.2016 в 15:33):
На больший массивах будут лютые тормоза!
superpuper
(26.05.2014 в 23:49):
Даже по указанной в статье ссылке написано, что первый аргумент — required, т.е. необходим. Так что .slice(0), иначе ошибка. В FF так точно.
ManHunter
(30.05.2013 в 21:10):
Век живи - век учись :)
unreal666
(30.05.2013 в 12:07):
точнее, в прототипах хранить только неизменяемые методы/свойства, к которым могут относиться, к примеру, и константы.
superpuper
(30.05.2013 в 00:33):
Отсюда мораль : методы — в прототипах, свойства(т.е. данные) — в экземплярах. И никак иначе.
Infocatcher
(29.05.2013 в 12:30):
Хитрые ошибки будут вот тут:
function Collector() {
}
Collector.prototype = {
data: [],
add: function(v) {
this.data.push(v);
}
};
var collector1 = new Collector();
collector1.add(1);
var collector2 = new Collector();
collector2.add(2);
alert(collector1.data); // [1, 2]
Правильно при этом вот так:
function Collector() {
this.data = [];
}
Collector.prototype = {
add: function(v) {
this.data.push(v);
}
};
То есть чтобы у каждого экземпляра был свой массив.
Тут, правда, не так чтобы особенно хитро – все логично, но попасться можно.
Особенно с учетом вот такого:
function Counter() {
}
Counter.prototype = {
index: 0,
inc: function() {
++this.index;
}
};
var counter1 = new Counter();
counter1.inc();
var counter2 = new Counter();
counter2.inc();
alert(counter1.index + "\n" + counter2.index);
Фокус, соответственно, в том, что ++ делает this.index = this.index + 1, то есть переопределяет свойство, а this уже указывает на экземпляр. И получается примерно такое:
function Counter() {
this.index = 1;
}
Counter.prototype = {
index: 0
};
var counter = new Counter();
alert(Counter.prototype.index + "\n" + counter.index);
(Я правильно понимаю, что в коменнтариях блоки с кодом не поддерживаются?)
function Collector() {
}
Collector.prototype = {
data: [],
add: function(v) {
this.data.push(v);
}
};
var collector1 = new Collector();
collector1.add(1);
var collector2 = new Collector();
collector2.add(2);
alert(collector1.data); // [1, 2]
Правильно при этом вот так:
function Collector() {
this.data = [];
}
Collector.prototype = {
add: function(v) {
this.data.push(v);
}
};
То есть чтобы у каждого экземпляра был свой массив.
Тут, правда, не так чтобы особенно хитро – все логично, но попасться можно.
Особенно с учетом вот такого:
function Counter() {
}
Counter.prototype = {
index: 0,
inc: function() {
++this.index;
}
};
var counter1 = new Counter();
counter1.inc();
var counter2 = new Counter();
counter2.inc();
alert(counter1.index + "\n" + counter2.index);
Фокус, соответственно, в том, что ++ делает this.index = this.index + 1, то есть переопределяет свойство, а this уже указывает на экземпляр. И получается примерно такое:
function Counter() {
this.index = 1;
}
Counter.prototype = {
index: 0
};
var counter = new Counter();
alert(Counter.prototype.index + "\n" + counter.index);
(Я правильно понимаю, что в коменнтариях блоки с кодом не поддерживаются?)
Добавить комментарий
Заполните форму для добавления комментария