Вопрос

Вот код, который имеет два массива (np и op), один из которых является копией другого.

Однако когда я изменяю копию, оригинал тоже изменяется!взглянем:

<script type="text/javascript">
var op=new Array(0, 0);
var np=op;
np[1]=2;
document.write(op+"<br>")
document.write(np)
</script>

Есть ли способ сохранить оригинал и изменить копию?

Это было полезно?

Решение

Вы никогда не делали копию массива. Вы просто присвоили массив другой переменной. Это не копировать в Javascript. В вашем примере есть только один массив с двумя переменными, по которым вы можете получить к нему доступ. В Javascript нет встроенного способа копирования массивов, поэтому для этого вам нужно написать собственную функцию.

Посмотрите этот вопрос StackOverflow , чтобы узнать, как на самом деле реализовать копирование элементов в массиве.

Другие советы

Некоторые из встроенных функций Array фактически создадут для вас копию. Одним из таких является ломтик.

Например:

var op=new Array(0, 0);
var np= op.slice(0);
np[1]=2;
document.write(op+"<br>")
document.write(np)

Ссылка http://my.opera.com/GreyWyvern/blog/ show.dml / 1725165

То, что вы делаете, - это не создание копии массива, а создание только копии ссылки на массив, поэтому вы получаете две ссылки на один и тот же объект массива.

Вот как вы можете создать фактическую копию массива:

var np = op.concat();

Метод concat создает новый массив, который является копией массива с добавлением любых дополнительных элементов. Если вы не укажете никаких дополнительных элементов, вы просто получите копию массива.

Array.prototype.copy = function() {
    return this.slice(0, this.length);
  }

Затем


var op=new Array(0, 0);
var np=op.copy();
np[1]=2;
document.write(op+"<br>")
document.write(np)

Вы должны клонировать второй массив, а не копировать его.

--- Обновление

Если вы назначаете объект переменной, копируется только ссылка (это означает, что они оба указывают на одни и те же данные). Для получения независимой копии этого объекта вам необходимо клонировать его. И есть несколько способов сделать это, например здесь - способ клонирования объекта с использованием jQuery.

Вы можете просто использовать собственный метод slice , который возвращает копию массива:

var np = op.slice(0,op.length);

Второй параметр должен быть необязательным, но в IE я считаю, что это необходимо.

Ваш код, дополненный изменением:

var op=new Array(0, 0);
var np=op.slice(0,op.length);
np[1]=2;
document.write(op+"<br>")
document.write(np)

Чтобы создать новый массив, вы можете рассмотреть следующие вопросы:

   var op = [];

Чтобы скопировать массив:

var np=op.slice();

или

var np=op.concat();

concat работает быстрее, а срез занимает на один символ меньше.Некоторые люди называют «срез» или «конкат» словом «копия», чтобы было более очевидно, что вы делаете копию.

В обоих случаях параметры не нужны.Параметры в срезе просто сделают код больше и медленнее.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top