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);
}