Изменяется родительский массив
Добрый день!
У меня есть массив 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, время: 14:01. |