jQuery的扩展与angular度扩展
这两个扩展函数有什么区别?
angular.extend(a,b); $.extend(a,b);
虽然jquery.extend被很好的logging在angular.extend缺乏的细节和评论那里没有提供答案。 ( https://docs.angularjs.org/api/ng/function/angular.extend )。
angular.extend是否也提供深度复制?
angular.extend
和jQuery.extend
非常相似。 他们都做一个从一个或多个源对象到目标对象的浅属性副本。 举个例子:
var src = {foo: "bar", baz: {}}; var dst = {}; whatever.extend(dst, src); console.log(dst.foo); // "bar" console.log(dst.baz === src.baz); // "true", it's a shallow copy, both // point to same object
angular.copy
提供了一个深层复制:
var src = {foo: "bar", baz: {}}; var dst = angular.copy(src); console.log(dst.baz === src.baz); // "false", it's a deep copy, they point // to different objects.
重新开始extend
:我只看到一个显着的区别,那就是jQuery的extend
允许你只指定一个对象,在这种情况下, jQuery
本身就是目标。
共通的地方:
-
这是一个浅的副本。 所以如果
src
有一个引用了对象的属性p
,dst
将得到一个引用同一个对象(不是对象的副本)的属性p
。 -
他们都返回目标对象。
-
它们都支持多个源对象。
-
它们都按顺序执行多个源对象,所以如果多个源对象具有相同的属性名称,则最后的源对象将“获胜”。
testing页面: 实时复制 | 活的来源
<!DOCTYPE html> <html> <head> <script src="jquery-1.9.1.min.js"></script> <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.5/angular.min.js"></script> <meta charset=utf-8 /> <title>Extend!</title> </head> <body> <script> (function() { "use strict"; var src1, src2, dst, rv; src1 = { a: "I'm a in src1", b: {name: "I'm the name property in b"}, c: "I'm c in src1" }; src2 = { c: "I'm c in src2" }; // Shallow copy test dst = {}; angular.extend(dst, src1); display("angular shallow copy? " + (dst.b === src1.b)); dst = {}; jQuery.extend(dst, src1); display("jQuery shallow copy? " + (dst.b === src1.b)); $("<hr>").appendTo(document.body); // Return value test dst = {}; rv = angular.extend(dst, src1); display("angular returns dst? " + (rv === dst)); dst = {}; rv = jQuery.extend(dst, src1); display("jQuery returns dst? " + (rv === dst)); $("<hr>").appendTo(document.body); // Multiple source test dst = {}; rv = angular.extend(dst, src1, src2); display("angular does multiple in order? " + (dst.c === src2.c)); dst = {}; rv = jQuery.extend(dst, src1, src2); display("jQuery does multiple in order? " + (dst.c === src2.c)); function display(msg) { $("<p>").html(String(msg)).appendTo(document.body); } })(); </script> </body> </html>
两者之间有一个细微的差别,在以前的答案中没有提到。
jQuery的.extend()允许你有条件地添加键值对,只要定义了这个值 。 所以在jQuery中,这个: $.extend({}, {'a': x ? x : undefined});
在x
未定义的情况下将返回{}
。
在Angular的.extend()中,这个: angular.extend({}, {'a': x ? x : undefined});
将返回{'a': undefined}
,即使x
未定义。 所以不pipe怎样,关键在那里。
这可能是一个好的或坏的事情,取决于你需要什么。 无论如何,这是两个图书馆之间的行为差异。
1.0.7的angularjs构build指出,扩展和复制方法不再复制angularjs内部$$ hashKey值。
请参阅发行说明@ https://github.com/angular/angular.js/blob/master/CHANGELOG.md
angular.copy / angular.extend:不要在复制/扩展函数中复制$$ hashKey。 (6d0b325f,#1875)
Chomre开发工具方法中对angular.copy的快速testing表明,它可以进行深度复制。
x = {p: 3, y: {x: 5}} Object {p: 3, y: Object} x Object {p: 3, y: Object} z = angular.copy(x); Object {p: 3, y: Object} z Object {p: 3, y: Object} x Object {p: 3, y: Object} zyx = 1000 1000 x Object {p: 3, y: Object} p: 3 y: Object x: 5 __proto__: Object __proto__: Object z Object {p: 3, y: Object} p: 3 y: Object x: 1000 __proto__: Object __proto__: Object
angular.extend另一方面做一个浅拷贝。
AngularJS中的.extend()与jQuery的.extend()
http://jsfiddle.net/Troop4Christ/sR3Nj/
var o1 = { a: 1, b: 2, c: { d:3, e:4 } }, o2 = { b: { f:{ g:5 } } }; console.log(angular.extend({}, o1, o2)); console.log(o1); console.log(o2);