2015-01-10 2 views
1

JS Источник:массив рода изменения curent и старую переменную

var c1 = ["Saab", "Volvo", "BMW"]; 
var c2=c1; 
c1.sort(); 
document.getElementById("demo").innerHTML = '1 -> '+c1+'<br>2 -> '+c2; 

РЕЗУЛЬТАТ: 1 -> BMW, Saab, Volvo 2 -> BMW, Saab, Volvo

мне нужно быть: 1 -> BMW, Saab, Volvo 2 -> Saab, Volvo, BMW

+0

переменные имеют в виду точное тот же объект (массив). – Pointy

ответ

1

Когда вы говорите

var c2=c1; 

вы на самом деле делает c2 точку на тот же объект, указанного на c1. И затем вы меняете объект Array c1. Так как c2 и c1 ссылаются на тот же объект, c1 и c2 напечатают то же самое.

Вам необходимо сделать копию объекта Array. Вы можете использовать c1.slice(), чтобы сделать это, как этот

var c2 = c1.slice(); 

Теперь c2 относится к копии c1 массива. Таким образом, изменения, внесенные в c1, не повлияют на объект c2.

+0

Огромное спасибо! (Извините за мой английский - это плохо) – Artur

2

линия:

var c2=c1; 

... не создает копию массива, он создает вторую ссылку на тот же самый основной объект массива. Поэтому модификации, которые вы делаете через , либо переменная будет влиять на тот же массив, будь то сортировка, добавление элементов или что-то еще.

К счастью, это легко создать копию массива:

var c2 = c1.slice(); 

В .slice() method возвращает копию части массива, или, если вы называете это без каких-либо аргументов (или с помощью всего индекса запуска 0), он копирует весь массив. Таким образом, переменные c1 и c2 будут ссылаться на два разных массива, и вы можете сортировать или иным образом изменять их без изменения другого.

0

Просто используйте срез (0):

var c1 = ["Saab", "Volvo", "BMW"]; 
var c2=c1.slice(0); 
c1.sort(); 
alert(c1); 
alert(c2); 

Вот пример:

http://jsfiddle.net/c3161930/

С наилучшими пожеланиями, Фелипе

Смежные вопросы