JavaScript中的对象比较

JavaScript中比较对象的最佳方法是什么?

例:

var user1 = {name : "nerd", org: "dev"};

var user2 = {name : "nerd", org: "dev"};

var eq = user1 == user2;

alert(eq); // gives false

我知道如果 , ,但是有没有办法检查它们是否具有相同的属性值?

以下方法对我有用,但这是唯一的可能性吗?

var eq = Object.toJSON(user1) == Object.toJSON(user2);

alert(eq); // gives true

回答:

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

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


回答:

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

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

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

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

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


回答:

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

这几乎是正确的算法:

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;

}

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

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

以上是 JavaScript中的对象比较 的全部内容, 来源链接: utcz.com/qa/409198.html

回到顶部