Изменяется родительский массив
Добрый день!
У меня есть массив settings.users с исходными данными. В необходимой функции я делаю: users = settings.users; Далее идёт поиск, замена значений в users. Но все данные так же меняются в settings.users. Как это исправить? методы array.push не подходят. |
http://web.izjum.com/javascript-copy...comment-page-1
Потому что в JS по значению копируются только примитивные типы Сложные копируются по ссылке т.е. "=" не создаёт в памяти копию объекта а просто берет ссылку на уже существующий объект. |
а ты его клонируй, к примеру так
users = settings.users.slice(0); :) |
...только если там есть подмассивы то их тоже надо отдельно клонировать.)
|
У меня массив объектов. Пол дня бьюсь в поисках решения =/
|
Если нет циклических ссылок, то можно сделать так:
users = JSON.parse( JSON.stringify(settings.users) ); |
Цитата:
a="foo" b=a alert(a===b) // true ничего там не копируется. а и b указывают на один и тот же объект. Цитата:
|
Цитата:
var obj1 = {}, obj2 = {};
obj1.aaa = obj2;
obj2.bbb = obj1;
try {
JSON.stringify(obj1);
} catch(e) {
alert(e);
}
|
Цитата:
a="foo" b=a alert(a===b) // true a = "fppp"; console.log(b); //foo В данном случае они не Цитата:
|
tsigel,
Ничего там у Вас не копируется. a вначале указывала на foo, а после присваивания стала указывать на fppp, только и всего. |
jsnb,
А, ну это обычные циклические ссылки, я думал, Вы что-то другое имеете в виду. Только, я не пойму, что мешает этому JSON.stringify преобразовать в строку такой объект? Почему он ругается? |
krutoy, потому что форматом json это не предусмотрено. Сам попробуй преобразовать в ручную в валидный json такой объект.
В строку кода - можно, но это совсем другое, ибо json придуман в том числе и для взаимодействия с иными языками. |
Цитата:
a1 = "Привет";
b1 = "Привет";
a2 = new String ("Привет");
b2 = new String ("Привет");
alert ( " a1 === b1 " + ( a1 === b1) );
alert ( " a2 === b2 " + ( a2 === b2) );
|
MallSerg,
Вы сравниваете во втором случае не примитивные данные, а объекты. Не вижу никакой магии, и, тем более, связи с сабжем. Все работает как ожидается. Легко проверить
a2 = new String ("Привет");
b2 = new String ("Привет");
alert ( " a2 === b2 " + ( a2.valueOf() === b2.valueOf()) );
// a2 === b2 true
|
А переменные
a1 = "Привет"; b1 = "Привет"; все также указывают на одну и туже строку? Просто цель данного примера была наглядно показать как работает строгое сравнение для примитивных строк и как для объектов показать что поведение разное т.е. приводит к разным результатам это основы языка. |
Цитата:
|
Цитата:
|
Тогда срочно отпровляй письмо в w3c что у них ошибка с стандарте EMAScript
И попроси Илью исправить учебник http://javascript.ru/comparison-operators |
MallSerg,
погляди в окно, не я там бегу стандарты менять? |
| Часовой пояс GMT +3, время: 17:03. |