栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

JavaScript中的对象比较

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JavaScript中的对象比较

不幸的是,除非您

_proto_
递归使用并访问所有不可枚举的属性,否则没有完美的方法,但这仅在Firefox中有效。

因此,我能做的最好是猜测使用情况。


1)快速且有限。

当您具有简单的JSON样式的对象,而内部没有方法和DOM节点时,则可以使用:

 JSON.stringify(obj1) === JSON.stringify(obj2)

属性的ORDER重要,因此对于以下对象,此方法将返回false:

 x = {a: 1, b: 2}; y = {b: 2, a: 1};

2)速度较慢,通用性更高。

在不深入研究原型的情况下比较对象,然后递归比较属性的投影,还比较构造函数。

这几乎是正确的算法:

function deepCompare () {  var i, l, leftChain, rightChain;  function compare2Objects (x, y) {    var p;    // remember that NaN === NaN returns false    // and isNaN(undefined) returns true    if (isNaN(x) && isNaN(y) && typeof x === 'number' && typeof y === 'number') {         return true;    }    // Compare primitives and functions.         // Check if both arguments link to the same object.    // Especially useful on the step where we compare prototypes    if (x === y) {        return true;    }    // Works in case when functions are created in constructor.    // Comparing dates is a common scenario. Another built-ins?    // We can even handle functions passed across iframes    if ((typeof x === 'function' && typeof y === 'function') ||       (x instanceof Date && y instanceof Date) ||       (x instanceof RegExp && y instanceof RegExp) ||       (x instanceof String && y instanceof String) ||       (x instanceof Number && y instanceof Number)) {        return x.toString() === y.toString();    }    // At last checking prototypes as good as we can    if (!(x instanceof Object && y instanceof Object)) {        return false;    }    if (x.isPrototypeOf(y) || y.isPrototypeOf(x)) {        return false;    }    if (x.constructor !== y.constructor) {        return false;    }    if (x.prototype !== y.prototype) {        return false;    }    // Check for infinitive linking loops    if (leftChain.indexOf(x) > -1 || rightChain.indexOf(y) > -1) {         return false;    }    // Quick checking of one object being a subset of another.    // todo: cache the structure of arguments[0] for performance    for (p in y) {        if (y.hasOwnProperty(p) !== x.hasOwnProperty(p)) { return false;        }        else if (typeof y[p] !== typeof x[p]) { return false;        }    }    for (p in x) {        if (y.hasOwnProperty(p) !== x.hasOwnProperty(p)) { return false;        }        else if (typeof y[p] !== typeof x[p]) { return false;        }        switch (typeof (x[p])) { case 'object': case 'function':     leftChain.push(x);     rightChain.push(y);     if (!compare2Objects (x[p], y[p])) {         return false;     }     leftChain.pop();     rightChain.pop();     break; default:     if (x[p] !== y[p]) {         return false;     }     break;        }    }    return true;  }  if (arguments.length < 1) {    return true; //Die silently? Don't know how to handle such case, please help...    // throw "Need two or more arguments to compare";  }  for (i = 1, l = arguments.length; i < l; i++) {      leftChain = []; //Todo: this can be cached      rightChain = [];      if (!compare2Objects(arguments[0], arguments[i])) {          return false;      }  }  return true;}

已知问题(嗯,它们的优先级很低,可能您永远不会注意到它们):

  • 具有不同原型结构但投影相同的对象
  • 函数可能具有相同的文本,但引用了不同的闭包



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/375636.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号