Skip to content

Instantly share code, notes, and snippets.

@maximal
Last active June 7, 2018 18:25
Show Gist options
  • Save maximal/cb1fe3a6e6b1d29e233f to your computer and use it in GitHub Desktop.
Save maximal/cb1fe3a6e6b1d29e233f to your computer and use it in GitHub Desktop.
Объяснение сравнения и клонирования объектов в Яваскрипте
// Создадим два объекта
var a = {a: 1, b: 2};
var b = {a: 1, b: 2};
// Сравнение объектов происходит не по значениям, а по ссылкам.
// a и b — разные переменные, поэтому они будут не равны, даже если все их поля равны.
console.log(a == b, a === b); // false false
var c = a;
// c — указывает в памяти на тот же объект, что и a. Мы сравняли ссылки.
console.log(a == c, a === c); // true true
// Но теперь, если мы поменяем что-то в `c`, оно же поменяется и в `a`.
c.a = 2;
console.log(a, c); // Object {a: 2, b: 2} Object {a: 2, b: 2}
// Глубокая копия — проходит по всем полям объекта и создаёт новый с такими же полями
var d = clone(a);
console.log(a == d, a === d); // false false
// Можно безболезненно менять все поля в d, это не отразится на a
d.a = 3;
console.log(a, d); // Object {a: 2, b: 2} Object {a: 3, b: 2}
/**
* Клонирование есть почти в любом фреймворке.
* Рекурсивная функция.
* @link http://stackoverflow.com/questions/122102/what-is-the-most-efficient-way-to-clone-an-object/122190#122190
*
* @param {Object} obj Любой объект
* @returns {Object} Возвращает копию объекта.
*/
function clone(obj) {
if (obj === null || typeof(obj) !== 'object' || 'isActiveClone' in obj) {
return obj;
}
var temp = obj.constructor(); // changed
for (var key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
obj['isActiveClone'] = null;
temp[key] = clone(obj[key]);
delete obj['isActiveClone'];
}
}
return temp;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment