Эта статья делится неглубокой копией и кодом глубокой копии объектов JavaScript для вашей ссылки. Конкретный контент заключается в следующем
1. Светлая копия
Копия означает копирование всех свойств родительского объекта в детском объекте.
Следующая функция копирует:
var winking = {nation: 'china'} var doctor = {career: 'doctor'} function extendCopy (p) {var c = {}; for (var i in p) {c [i] = p [i]; } c.Uber = p; возврат C; }При его использовании напишите это:
var doctor = extendcopy (китайский); доктор.career = 'doctor'; alert (doctor.nation); // Китай
Тем не менее, есть проблема с такой копией. То есть, если свойство родительского объекта равен массиву или другому объекту, то на самом деле, дочерний объект получает только адрес памяти, а не реальную копию, поэтому существует вероятность того, что родительский объект будет подделан.
Пожалуйста, посмотрите, теперь добавьте свойство «места рождения» в китайский, чья ценность является массивом.
Китайский.birthplaces = ['beijing', 'shanghai', 'honkkong'];
Через функцию extendCopy () Доктор наследует китайцев.
var doctor = extendcopy (китайский);
Затем мы добавляем город к «месту рождения» доктора:
Doctor.birthplaces.push ('xiamen');
Проверьте результаты ввода
предупреждение (Доктор. Перевороты); // Пекин, Шанхай, Гонконг, Сямен
блюд (китайский. Перевороты); // Пекин, Шанхай, Гонконг, Сямен
В результате оба места рождения были изменены.
Следовательно, extendCopy () просто копирует данные основного типа, и мы называем эту копию «Небольшая копия».
2. Глубокая копия
Поскольку неглубокая и глубокая копия имеет такие недостатки, давайте посмотрим на глубокую копию.
Так называемая «глубокая копия» означает, что она может реализовать реальную копию массивов и объектов. Его реализация не сложно, просто вызовите «мелкую копию» рекурсивно.
Функция DeepCopy (p, c) {var c = c || {}; for (var i in p) {if (typeof p [i] === 'Object') {c [i] = (p [i] .constructor === Array)? []: {}; DeepCopy (P [i], C [i]); } else {c [i] = p [i]; }} return c; }Посмотрите, как его использовать:
var doctor = deepCopy (китайский);
Теперь добавьте свойство в родительский объект со значением в качестве массива. Затем измените это свойство на детском объекте:
Китайский.birthplaces = ['beijing', 'shanghai', 'honkkong']; doctor.birthplaces.push ('xiamen'); предупреждение (Doctor.birthplaces); // Пекин, Шанхай, Гонконг, Сямен Альти (китайский. Барфлас); // Пекин, Шанхай, ГонконгЭто завершает копию;
$ .extend ()
$ .extend () в jQuery то же самое.
$ .extend ([deep], target, Object1 [, ObjectN])
•глубокий
Тип: логический
Если это правда, Merge становится рекурсивным (также называемой Deep Copy).
•цель
Тип: объект
Расширение объекта. Это получит новые свойства.
• объект1
Тип: объект
Объект, который содержит дополнительные свойства, объединенные в первый параметр.
• объект
Тип: объект
Содержит дополнительные атрибуты для слияния в первый параметр
Когда мы предоставляем два или более объектов в $ .extend (), все свойства объекта добавляются в целевой объект (целевой параметр).
Если только один параметр предоставляется в $ .extend (), это означает, что целевой параметр опущен. В этом случае сам объект jQuery не выполняется целевым объектом. Таким образом, мы можем добавить новые функции в пространство имен JQUERY. Это полезно для разработчиков плагинов, когда они хотят добавить новые функции в jQuery.
Помните, что целевой объект (первый параметр) будет изменен и будет возвращен через $ .extend (). Однако, если мы хотим сохранить исходный объект, мы можем передать пустой объект в качестве целевого объекта:
var object = $ .extend ({}, Object1, Object2);
По умолчанию операция слияния через $ .extend () не является рекурсивной; Если свойство первого объекта является объектом или массивом, то оно полностью переопределит свойство с тем же ключом второго объекта. Эти значения не будут объединены. Это можно понять, проверив значение банана в примере ниже. Однако, если True используется в качестве первого аргумента функции, рекурсивные слияния будут выполняться на объекте.
ПРЕДУПРЕЖДЕНИЕ: Передача False для первого параметра не поддерживается.
1. Объедините два объекта и измените первый объект.
var object1 = {Apple: 0, банан: {вес: 52, цена: 100}, вишня: 97}; var object2 = {banana: {цена: 200}, durian: 100}; // Merge Object2 в Object1 $. ); // {"Apple": 0, "Banana": {"цена": 200}, "Cherry": 97, "durian": 100}2. Объедините два объекта рекурсивно и измените первый объект.
var object1 = {Apple: 0, банан: {вес: 52, цена: 100}, вишня: 97}; var object2 = {banana: {цена: 200}, durian: 100}; // Merge Object2 в Object1, рекурсус. Json.stringify (object1)); // {"Apple": 0, "banana": {"вес": 52, "цена": 200}, "Cherry": 97, "durian": 100}3. Объедините объекты по умолчанию и параметрам и не изменяйте объект по умолчанию. Это обычно используемая модель разработки плагина.
var defalault = {validate: false, limit: 5, name: "foo"}; var options = {validate: true, name: "bar"}; // слияние по умолчанию и опциям, без изменения настройки defaultsvar = $. )); console.log (json.stringify (settings)); // defaults - {«validate»: false, «ограничение»: 5, «имя»: «foo»} // options - {"validate": true ":" bar "} // Настройки - {" Validate ": truidJavaScript определяет, равны ли объекты
В JavaScript операции равенства включают «==», «===». Нет необходимости в большинстве различий между ними. В этой статье мы поговорим о том, как определить, равны ли два объекта? Вы можете подумать, что если два объекта имеют одинаковые свойства, а их свойства имеют одинаковые значения, то два объекта равны. Затем давайте используем пример для демонстрации:
var obj1 = {name: "benjamin", sex: "male"} var obj2 = {name: "benjamin", sex: "male"} // Выходы: ложные секунды.Из примера выше, мы видим, что используете ли вы "==" или "==", false возвращается. Основная причина заключается в том, что основные строки и число типов сравниваются значениями, в то время как объекты (дата, массив) и обычные объекты сравниваются по адресу в памяти, указанном по указателям. См. Следующий пример:
var obj1 = {name: "benjamin", sex: "male"}; var obj2 = {name: "benjamin", sex: "male"}; var obj3 = obj1; // Выходы: trueconsole.log (obj1 == obj3); // Выходы: trueConsole.log (obj1 ===//// Выходы. falseconsole.log (obj2 === obj3); // выходы: falseconsole.log (obj2 === obj3);Приведенный выше пример возвращает TRUE, потому что указатели OBJ1 и OB3 указывают на тот же адрес в памяти. Это похоже на концепцию прохождения стоимости и передачи ссылок на объектно-ориентированных языках (Java/C ++). Потому что, если вы хотите определить, равны ли два объекта, вы должны быть ясны, пытаетесь ли вы определить, одинаковы ли свойства двух объектов или значения, соответствующие свойствам одинаковыми, или что?
Функция человека (имя) {this.name = name; } var p1 = новый человек ("p1"); var p2 = новый человек ("P2"); console.log (p1 == p2); // false Person.prototype.sayhi = function () {// do sayhi здесь} console.log (p1.sayhi () == p2.sayhi ()); // true console.log (p1.sayhi () == p2.sayhi ()); // true console.log (p1.sayhi () === p2.sayhi ()); //истинныйВыше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.