3

Для удобства я написал простой toJSON прототип, для обработки JSON, что я знаю, чтобы быть в безопасности:Объект JSON! = Объект JavaScript?

String.prototype.toJSON = function() { 
    return JSON.parse(this.valueOf()); 
}; 

Я использую его в тестировании своих веб-сервисов. К сожалению, даже с помощью этого простого теста:

var v0 = '{"echo":"hello_world"}'.toJSON(), v1 = {"echo": "hello_world"}; 

Он терпит неудачу:

console.log(v0 == v1);   // false 
console.log(v0 === v1);   // false 
console.log(v0.echo == v1.echo); // true 
console.log(v0.echo === v1.echo); // true 

Что я не знаю о JavaScript, который вызывает эту проблему?

+6

«toJSON» на самом деле делает «fromJSON». – deceze

+0

см. Http://stackoverflow.com/questions/201183/how-do-you-determine-equality-for-two-javascript-objects –

+1

Возможное дублирование: http://stackoverflow.com/questions/1068834/object- compare-in-javascript – Eraden

ответ

1

Объект в JavaScript, так же, как и все остальное, за исключением примитивов (Int, String, Boolean) является ссылкой.

Имея 2 разных дублирующих объекта, означает наличие двух разных ссылок, указывающих на разные места в рекламе.

Вы можете реализовать что-то же просто, как, в основном перебора всех первобытных свойств объекта, и сравнить их по одному:

Object.prototype.equals = function(x) 
{ 
    for(p in this) 
    { 
     switch(typeof(this[p])) 
     { 
      case 'object': 
       if (!this[p].equals(x[p])) { return false }; break; 
      case 'function': 
       if (typeof(x[p])=='undefined' || (p != 'equals' && this[p].toString() != x[p].toString())) { return false; }; break; 
      default: 
       if (this[p] != x[p]) { return false; } 
     } 
    } 

    for(p in x) 
    { 
     if(typeof(this[p])=='undefined') {return false;} 
    } 

    return true; 
} 
+0

Спасибо, это выглядит довольно просто. Является ли [подчеркивание на основе стека] (http://underscorejs.org/underscore.js) более высокой производительностью? –

+0

Оба метода проводят рекурсивное сжатие, в общем случае временная сложность log (n) в обоих случаях. –

3

Просто потому, что у вас одинаковый контент, это не значит, что у вас есть один и тот же экземпляр объекта. Если вы сделали v1 = v0 вместо инициализации v1 seperatly первые два вернулись бы верно.

Обновление: Если вам нужно сравнить два экземпляра, чтобы найти, имеют ли они одинаковое содержимое, вам необходимо определить функцию, которая сравнивает каждый элемент.

+0

Я получаю 'v0' из запроса HTTP GET; и у вас есть тест, который гарантирует, что то, что я получаю от HTTP GET, соответствует моему ожиданию. –

1

Для двух объектов, которые должны быть ==, они должны быть одного и того же экземпляра. v0 и v1 - два разных экземпляра. Если вы хотите сделать глубокое сравнение объектов, которые вы можете использовать что-то вроде метода IsEqual Underscore в: http://underscorejs.org/#isEqual

_.isEqual(v0, v1); 
+0

Ну ладно, не знал, что оператор глубокого сравнения не поддерживался из коробки в JavaScript. Рассмотрим использование, например. [Это] (http://stackoverflow.com/a/13143059/587021). –

+0

Это не о глубоком сравнении. Два объекта равны, если они являются одним и тем же объектом. Одно дело - сравнивать объект, а другой - сравнивать значение (это то, что делает _.isEqual). – bgusach

+0

Спасибо, я был легко в состоянии получить подчеркивание для работы в моем объеме. –

 Смежные вопросы

  • Нет связанных вопросов^_^