123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
-
-
- 'use strict';
-
- function isSpecificValue(val) {
- return (
- val instanceof Buffer
- || val instanceof Date
- || val instanceof RegExp
- ) ? true : false;
- }
-
- function cloneSpecificValue(val) {
- if (val instanceof Buffer) {
- var x = Buffer.alloc
- ? Buffer.alloc(val.length)
- : new Buffer(val.length);
- val.copy(x);
- return x;
- } else if (val instanceof Date) {
- return new Date(val.getTime());
- } else if (val instanceof RegExp) {
- return new RegExp(val);
- } else {
- throw new Error('Unexpected situation');
- }
- }
-
-
- function deepCloneArray(arr) {
- var clone = [];
- arr.forEach(function (item, index) {
- if (typeof item === 'object' && item !== null) {
- if (Array.isArray(item)) {
- clone[index] = deepCloneArray(item);
- } else if (isSpecificValue(item)) {
- clone[index] = cloneSpecificValue(item);
- } else {
- clone[index] = deepExtend({}, item);
- }
- } else {
- clone[index] = item;
- }
- });
- return clone;
- }
-
- function safeGetProperty(object, property) {
- return property === '__proto__' ? undefined : object[property];
- }
-
-
- var deepExtend = module.exports = function (/*obj_1, [obj_2], [obj_N]*/) {
- if (arguments.length < 1 || typeof arguments[0] !== 'object') {
- return false;
- }
-
- if (arguments.length < 2) {
- return arguments[0];
- }
-
- var target = arguments[0];
-
-
- var args = Array.prototype.slice.call(arguments, 1);
-
- var val, src, clone;
-
- args.forEach(function (obj) {
-
- if (typeof obj !== 'object' || obj === null || Array.isArray(obj)) {
- return;
- }
-
- Object.keys(obj).forEach(function (key) {
- src = safeGetProperty(target, key);
- val = safeGetProperty(obj, key);
-
-
- if (val === target) {
- return;
-
-
-
- } else if (typeof val !== 'object' || val === null) {
- target[key] = val;
- return;
-
-
- } else if (Array.isArray(val)) {
- target[key] = deepCloneArray(val);
- return;
-
-
- } else if (isSpecificValue(val)) {
- target[key] = cloneSpecificValue(val);
- return;
-
-
- } else if (typeof src !== 'object' || src === null || Array.isArray(src)) {
- target[key] = deepExtend({}, val);
- return;
-
-
- } else {
- target[key] = deepExtend(src, val);
- return;
- }
- });
- });
-
- return target;
- };
|