首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jquery扩展与角度扩展

jquery扩展与角度扩展
EN

Stack Overflow用户
提问于 2013-05-29 01:05:40
回答 4查看 38.1K关注 0票数 63

这两个扩展函数之间的区别是什么?

代码语言:javascript
复制
  angular.extend(a,b);
  $.extend(a,b);

虽然jquery.extend有很好的文档记录,但angular.extend缺乏细节,那里的注释也没有提供任何答案。(https://docs.angularjs.org/api/ng/function/angular.extend)。

angular.extend也提供深度拷贝吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-05-29 01:12:27

angular.extendjQuery.extend上非常类似于。它们都执行从一个或多个源对象到目标对象的浅层特性复制。举个例子:

代码语言:javascript
复制
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提供深度拷贝:

代码语言:javascript
复制
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有一个引用某个对象的属性pdst将获得一个引用同一对象的属性p (而不是object).
  • They的副本两者都返回目标对象。

它们都支持多个源对象都按顺序处理多个源对象,因此如果多个源对象具有相同的属性名称,则最后一个源对象将“获胜”。

测试页面:Live Copy | Live Source

代码语言:javascript
复制
<!DOCTYPE html>
<html>
<head>
<script src="http://code.jquery.com/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>
票数 97
EN

Stack Overflow用户

发布于 2014-03-14 19:27:12

这两者之间有一个细微的区别,这在前面的答案中没有提到。

只有当值被定义为时,jQuery的.extend()才允许您有条件地添加键、值对。因此,在jQuery中,如果{}未定义,则this:$.extend({}, {'a': x ? x : undefined});将返回{}

然而,在Angular的.extend()中,this:angular.extend({}, {'a': x ? x : undefined});将返回{'a': undefined},即使x是未定义的。因此,无论发生什么,关键都会在那里。

这可能是一件好事,也可能是件坏事,这取决于你需要什么。无论如何,这是两个库在行为上的不同之处。

票数 31
EN

Stack Overflow用户

发布于 2013-05-29 01:16:38

1.0.7angularjs构建声明扩展和复制方法不再复制angularjs内部$$hashKey值。

请参阅发行说明@ https://github.com/angular/angular.js/blob/master/CHANGELOG.md

Angular.copy/angular.tend:在复制/扩展函数中不要复制$$hashKey。(6d0b325f,#1875)

在Chomre dev tools方法中对angular.copy进行的快速测试表明,它确实进行了深度复制。

代码语言:javascript
复制
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}
z.y.x = 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进行了浅层复制。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16797659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档