Last active
June 7, 2018 18:25
-
-
Save maximal/cb1fe3a6e6b1d29e233f to your computer and use it in GitHub Desktop.
Объяснение сравнения и клонирования объектов в Яваскрипте
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Создадим два объекта | |
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