javascript - angular.equals 和 _.isEqual 有什么区别?

标签 javascript angularjs performance underscore.js

我的意思是在性能上有什么不同吗?哪一个能够进行最好的深度比较?有时 angular 的 equals 函数无法找到所有差异。

我还注意到,这个函数的 Angular 版本没有检查 '$$hashKey' 键。

最佳答案

通过比较值本身和所有内部属性,它们基本上表现相同。性能也接近相同,至少对于 10000 个元素,这将有 100-200 毫秒的差异。我创建了小型测试套件,警告:当您运行代码片段时,您的浏览器页面将卡住几秒钟。我不确定这种衡量性能的方法是否正确,所以请随时提出更好的方法。

angular
.module("comparsion", [])
.controller("ComparsionCtrl", function($scope) {
  var testCases = 10000;
  
  console.time("underscore");
  for(var i = 0; i < testCases; i++) {
    var obj = createRandomObj(5, true);
    var obj1 = createRandomObj(5, true);
    _.isEqual(obj, obj1);
  }
  console.timeEnd("underscore");
  
  console.time("angular");
  for(var i = 0; i < testCases; i++) {
    var obj = createRandomObj(5, true);
    var obj1 = createRandomObj(5, true);
    angular.equals(obj, obj1);
  }
  console.timeEnd("angular");
  
  // Random object generator from http://stackoverflow.com/questions/2443901/random-object-generator-in-javascript
  function createRandomObj(fieldCount, allowNested)
{
    var generatedObj = {};

    for(var i = 0; i < fieldCount; i++) {
        var generatedObjField;

        switch(randomInt(allowNested ? 6 : 5)) {

            case 0:
            generatedObjField = randomInt(1000);
            break;

            case 1:
            generatedObjField = Math.random();
            break;

            case 2:
            generatedObjField = Math.random() < 0.5 ? true : false;
            break;

            case 3:
            generatedObjField = randomString(randomInt(4) + 4);
            break;

            case 4:
            generatedObjField = null;
            break;

            case 5:
            generatedObjField = createRandomObj(fieldCount, allowNested);
            break;
        }
        generatedObj[randomString(8)] = generatedObjField;
    }
    return generatedObj;
}

// helper functions

function randomInt(rightBound)
{
    return Math.floor(Math.random() * rightBound);
}

function randomString(size)
{
    var alphaChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    var generatedString = '';
    for(var i = 0; i < size; i++) {
        generatedString += alphaChars[randomInt(alphaChars.length)];
    }

    return generatedString;
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.17/angular.min.js"></script>
<div ng-app="comparsion">
  <div ng-controller="ComparsionCtrl"></div>
</div>

关于javascript - angular.equals 和 _.isEqual 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39241972/

相关文章:

javascript - 如果所有 JavaScript 类型都是对象,那么为什么数字要按值传递?

javascript - Famo.us GenericSync 被 'mousedown' 事件阻止

javascript - 无法让 impress.js 工作

javascript - $scope 未定义

angularjs - 使用 “controller As”和IIFE时如何从子 Controller 访问父作用域?

Linux 时间报告 - 如何解读?

java缓存系统和静态HashMap存储-性能

c# - 图表控件中的多个图表系列

css - 有条件地改变angularjs元素的颜色?

sql-server - 对sql server 2008中的百万条记录表进行简单但缓慢的查询