JavaScript:测试原语是否相等

JavaScript:测试原语是否相等,javascript,comparison,Javascript,Comparison,假设我有两个对象,它们只有原语作为成员的属性(例如,该对象没有函数或对象成员): 给定两个这样的对象,我想知道它们的所有成员是否具有相同的值 现在,我正在简化操作: if (foo.start === bar.start && foo.end == bar.end) { // same member values } 但我将不得不处理可能有几十个这些原始成员的对象 JavaScript中有没有内置的东西可以让我轻松地比较它们?比较所有属性值的最简单方法是什么?您可以使用

假设我有两个对象,它们只有原语作为成员的属性(例如,该对象没有函数或对象成员):

给定两个这样的对象,我想知道它们的所有成员是否具有相同的值

现在,我正在简化操作:

if (foo.start === bar.start && foo.end == bar.end) {
    // same member values
}
但我将不得不处理可能有几十个这些原始成员的对象


JavaScript中有没有内置的东西可以让我轻松地比较它们?比较所有属性值的最简单方法是什么?

您可以使用
for in
循环遍历对象中的每个属性

例如:

function areEqual(a, b) {
    for (var prop in a) 
        if (a.hasOwnProperty(prop) && a[prop] !== b[prop])
            return false;
    return true;
}

b
中而非
a
中的任何属性都将被忽略。

如果两个对象都是
对象
s(例如,通过文字符号[
{}
]或
新对象
,而不是[说]
新日期
),您可以这样做:

function primativelyEqual(a, b) {
    var name;
    for (name in a) {
        if (!b.hasOwnProperty(name) || b[name] !== a[name]) {
            // `b` doesn't have it or it's not the same
            return false;
        }
    }
    for (name in b) {
        if (!a.hasOwnProperty(name)) {
            // `a` doesn't have it
            return false;
        }
    }

    // All properties in both objects are present in the other,
    // and have the same value down to the type
    return true;
}
for..in
迭代对象属性的名称
hasOwnProperty
告诉您实例本身(与其原型链的成员相对)是否具有该属性<代码>==检查两个值之间的任何不相等,而不执行任何类型强制。通过循环两个对象的属性名称,您知道它们具有相同数量的条目

如果实现具有ECMAScript 5中的新
对象。键
功能,则可以将其缩短一点:

function primativelyEqual(a, b) {
    var name, checkedKeys;

    checkedKeys = typeof Object.keys === "function";
    if (checkedKeys && Object.keys(a).length !== Object.keys(b).length) {
        // They don't have the same number of properties
        return false;
    }
    for (name in a) {
        if (!b.hasOwnProperty(name) || b[name] !== a[name]) {
            // `b` doesn't have it or it's not the same
            return false;
        }
    }
    if (!checkedKeys) {
        // Couldn't check for equal numbers of keys before
        for (name in b) {
            if (!a.hasOwnProperty(name)) {
                // `a` doesn't have it
                return false;
            }
        }
    }

    // All properties in both objects are present in the other,
    // and have the same value down to the type
    return true;
}

但是上述两个版本都假定对象不会从其原型继承任何可枚举属性(因此我的开场白是关于它们是
Object
s)。(我还假设没有人在
Object.prototype
中添加任何内容,这是人们很快就学会不做的疯狂事情。)


当然,可以进一步细化它以将其泛化,甚至按照相同的定义将其降级为对象属性,但在您所描述的范围内(以及在最合理的部署范围内),这应该是很好的。

知道,我刚刚发生了一些事情。基本对象文本称为JSON。比较这两个对象最简单的方法是

function equalObjects(obj1, obj2) {
    return JSON.stringify(obj1) === JSON.stringify(obj2);    
}

如果您需要在不支持本机JSON的浏览器中使用此选项,您可以使用“忽略
b
中的任何属性,但不忽略
a
。这将是一个相当不寻常的“相等,“当然?我假设他正在比较具有相同属性集但潜在不同值的业务对象。如果没有,他将需要修改它。这种方法的问题是,如果两个对象中的属性具有相同的值,但以不同的顺序添加到对象中,则上述函数将返回false。此外,对象文本不称为JSON。JSON是字符串格式,而对象文本是定义对象的源代码中的值。开始:该死,我以为我用一行代码就解决了这个问题。我从未考虑过按不同顺序添加属性。谢谢你的链接,我还没有意识到区别
function equalObjects(obj1, obj2) {
    return JSON.stringify(obj1) === JSON.stringify(obj2);    
}