lodash clone vs lodash extend vs jquery extend vs by hand

JavaScript performance comparison

Revision 37 of this test case created by

Preparation code

<script>
(function(){
function Me() {
	this.class2type = {};
	this.toString = this.class2type.toString;
	this.hasOwn = this.class2type.hasOwnProperty;
}

Me.prototype.extend = function() {
	var options, name, src, copy, copyIsArray, clone,
			target = arguments[0] || {},
			i = 1,
			length = arguments.length,
			deep = false;

	// Handle a deep copy situation
	if (typeof target === "boolean") {
			deep = target;

			// Skip the boolean and the target
			target = arguments[i] || {};
			i++;
	}

	// Handle case when target is a string or something (possible in deep copy)
	if (typeof target !== "object" && !this.isFunction(target)) {
			target = {};
	}

	// Extend jQuery itself if only one argument is passed
	if (i === length) {
			target = this;
			i--;
	}

	for (; i < length; i++) {
			// Only deal with non-null/undefined values
			if ((options = arguments[i]) != null) {
				// Extend the base object
				for (name in options) {
						src = target[name];
						copy = options[name];

						// Prevent never-ending loop
						if (target === copy) {
							continue;
						}

						// Recurse if we're merging plain objects or arrays
						if (deep && copy && (this.isPlainObject(copy) || (copyIsArray = Array.isArray(copy)))) {
							if (copyIsArray) {
									copyIsArray = false;
									clone = src && this.isArray(src) ? src : [];

							} else {
									clone = src && this.isPlainObject(src) ? src : {};
							}

							// Never move original objects, clone them
							target[name] = this.extend(deep, clone, copy);

							// Don't bring in undefined values
						} else if (copy !== undefined) {
							target[name] = copy;
						}
				}
			}
	}

	// Return the modified object
	return target;
};

Me.prototype.isFunction = function(obj) {
	return this.type(obj) === "function";
};

Me.prototype.type = function(obj) {
	if (obj == null) {
			return obj + "";
	}
	// Support: Android<4.0, iOS<6 (functionish RegExp)
	return typeof obj === "object" || typeof obj === "function" ? this.class2type[this.toString.call(obj)] || "object" : typeof obj;
};

Me.prototype.isWindow = function(obj) {
	return obj != null && obj === obj.window;
};

Me.prototype.isPlainObject = function(obj) {
	// Not plain objects:
	// - Any object or value whose internal [[Class]] property is not "[object Object]"
	// - DOM nodes
	// - window
	if (this.type(obj) !== "object" || obj.nodeType || this.isWindow(obj)) {
			return false;
	}

	if (obj.constructor &&
			!this.hasOwn.call(obj.constructor.prototype, "isPrototypeOf")) {
			return false;
	}

	// If the function hasn't returned already, we're confident that
	// |obj| is a plain object, created by {} or constructed with new Object
	return true;
};

window.me = new Me();
}());
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/2.2.1/lodash.min.js"></script>
<script src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
<script>
window.o$ = $.noConflict();
window.deepObject = {
  a: {
    b: {
      c: 6
    },
    d: 8
  },
  e: "hello",
  p: 9,
  q: 10,
  r: true,
  s: new Date(),
  t: function () {}
};
window.otherObject = {
  a: {
    f: {
      h: 6
    },
    d: 8
  },
  e: "helljo",
  ph: 19,
  qs: 10,
  r: true,
  s: new Date(),
  tss: function () {}
};
</script>
<script src="https://code.jquery.com/jquery-2.1.4.min.js"></script>

    

Preparation code output

Test runner

Warning! For accurate results, please disable Firebug before running the tests. (Why?)

Java applet disabled.

Testing in CCBot 2.0.0 / Other 0.0.0
Test Ops/sec
lodash.cloneDeep Не соответствует глубокому копированию
var bus = _.cloneDeep(deepObject, otherObject );
pending…
jquery.extend 1.7.2 Глубокое копирование
var bus = o$.extend(true, deepObject, otherObject );
pending…
lodash.extend Не соответствует глубокому копированию
var bus = _.extend(deepObject, otherObject );
pending…
jquery.extend 2.1.4 Глубокое копирование
var bus = $.extend(true, deepObject, otherObject );
pending…
method cut from jquery 2.1.4 Глубокое копирование
me.extend(true, deepObject, otherObject);
pending…

Compare results of other browsers

Revisions

You can edit these tests or add even more tests to this page by appending /edit to the URL.

0 Comments