Сообщение от Livaanderiamarum
|
я бы сравнил названия всех ключей. если а этом этапе разницы не обнаружено то, сравнил бы значения ключей.
тут 2 этапа:
1) вначале отыскиваются и сравниваются все примитивные значения, если разница не обнаружена, то.
2) потом сравниваются все остальные ссылки. при том используется не только примитивный метод getValue() а еще и анализ на цикличность ссылок. при том если ссылка ведет на одну и ту же область в памяти то, учитывал бы это как равность. как то так.
|
Все-таки как ваш алгоритм от работает на примере?
var a = {};//адрес - 0x0008
var b = {};//адрес - 0x00A8
a.a = a;
b.a = b;
alert(a == b)
1)Сравниваем объекты a(0x0008) и b(0x00A8)
Названия ключей одинаковые, примитивных значений нету
2) Сравниваем между собой их единственное свойство
a.a(0x00A8) и b.a(0x0008)
Это объекты находящиеся по разным адресам(а значит предположительно разные)
НАзванияю ключей в этих объектах одинаковые. примитивных значений нету
3)Сравниваем между собой единственное свойство у объектов a.a(0x00A8) и b.a(0x0008) - a.a.a(0x0008) и b.a.a(0x00A8)
Это ссылки на объекты находящиеся по разным адресам(а значит надо продолжить сравнивать)
Ну у каждого из них обнаружено зацикливание(адрес совпадает с первоначальным для объектов)
Поэтому вглубь мы не идем
И что дальше?
равны текущие свойства или нет? Если да, то почему?