Если оба объекта Object
s (например, созданы с помощью буквенной нотации [{}
] или new Object
, а не [скажем] new Date
), вы можете сделать это следующим образом:
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
сообщает вам, имеет ли это свойство сам экземпляр (в отличие от члена его цепочки прототипов).!==
проверяет любое неравенство между двумя значениями без приведения типов.Зацикливая имена свойств обоих объектов, вы знаете, что они имеют одинаковое количество записей.
Вы можете немного сократить это, если реализация имеет новую функцию Object.keys
из ECMAScript5:
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
с).(Я также предполагаю, что никто ничего не добавил к Object.prototype
, что является безумной вещью, которую люди очень быстро научились не делать.)
Определенно возможно усовершенствовать это, обобщить его и даже заставить его спускаться.в свойства объекта по тому же определению, но в рамках того, что вы описали (и в рамках наиболее разумных развертываний), это должно быть хорошо.