Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   alert({ня:3} == {ня:3})//false (https://javascript.ru/forum/misc/24306-alert-%7Bnya-3%7D-%3D%3D-%7Bnya-3%7D-false.html)

Livaanderiamarum 25.12.2011 19:08

alert({ня:3} == {ня:3})//false
 
alert({ня:3} == {ня:3})


оператор сравнивания с приведением типов 2 идентичных(равных) объекта (но разных) считает не равными? Почему так сделали и зачем они не исправляют такое упущение в языке? Возможно это не упущение и сделано намеренно для чего-то, тогда для чего?

Livaanderiamarum 25.12.2011 19:11

я конечно могу сравнить идентичность обьектов перебрав их ключи и параметры и сравнить. но на кой черт тогда нужен оператор сравнивания? может он не умеет работать с не примитивными значениями? я понимаю злость и ненависть заступников оператора сравнивания которые хотят щас меня убить такого тупого, но поймите меня я обычный. человек, новичок в программировании и мне не понятна одна вещь я просто спрашиваю. Не ругайте меня пожалуйста

B@rmaley.e><e 25.12.2011 19:17

А как бы Вы сравнивали такое?
var a = {}, b = {};
a.a = a;
b.a = b;
alert(a == b)
a и b идентичны, но разные.

Как видно, сравнение объектов перебором их структуры может быть затратным.

Livaanderiamarum 25.12.2011 19:22

Цитата:

Сообщение от B@rmaley.e><e (Сообщение 145888)
А как бы Вы сравнивали такое?
var a = {}, b = {};
a.a = a;
b.a = b;
alert(a == b)
a и b идентичны, но разные.

Как видно, сравнение объектов перебором их структуры может быть затратным.

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

тут 2 этапа:
1) вначале отыскиваются и сравниваются все примитивные значения, если разница не обнаружена, то.
2) потом сравниваются все остальные ссылки. при том используется не только примитивный метод getValue() а еще и анализ на цикличность ссылок. при том если ссылка ведет на одну и ту же область в памяти то, учитывал бы это как равность. как то так.

а вы?

B@rmaley.e><e 25.12.2011 19:33

Цитата:

Сообщение от Livaanderiamarum
сравнил бы значения ключей.

Ну вот сравните значения ключей для моего примера.

dmitriymar 25.12.2011 19:35

Livaanderiamarum,
вот честно,я абсолютно непониме ... то ли лыжи то ли я....
вы виндовс на js пишите? если нет-то для чего всё это?
для игры под ай? дак это там не понадобится. а если понадобилось-просмотрите ещё раз сегмент успешных игр. для чего разрабатывать то,что не будет пользоваться коммерческим успехом?
для самооценки повышения? самооценкой вы не себя ни семью не накормите.
а так если честно,моё мнение,вы муровод какой решил что буду заниматься вот этой задачей(а о ней вы рассказывали ) ищущий причину чтоб от неё отлынивать.
не зря ведь сказано-кто хочет ищет возможность,кто не хочет ищет причину. моё мнение-вы второй тип.
да и смена учётки чтоб снять минусовую карму-радикальный ход. не думали как это смотрится глазами других?

Livaanderiamarum 25.12.2011 19:36

Цитата:

Сообщение от B@rmaley.e><e (Сообщение 145891)
Ну вот сравните значения ключей для моего примера.

ты прочитал только фразу "Сравнил значения ключей" или весь мой текст? если не весь то прочитай весь.

dmitriymar 25.12.2011 19:39

Цитата:

Сообщение от Livaanderiamarum
1) вначале отыскиваются и сравниваются все примитивные значения, если разница не обнаружена,

var a=5+"";
var b=5;
alert(a);
alert(b);
alert(a==b);
alert(a===b);

и вы хотите сказать что они одинаковые?

Livaanderiamarum 25.12.2011 19:39

Цитата:

Сообщение от dmitriymar (Сообщение 145892)
Livaanderiamarum,
вот честно,я абсолютно непониме ... то ли лыжи то ли я....

я вообще не понял как ваш пост связан с вопросом про недочеты в операторе сравнения?

Livaanderiamarum 25.12.2011 19:41

Цитата:

Сообщение от dmitriymar (Сообщение 145895)
var a=5+"";
var b=5;
alert(a);
alert(b);
alert(a==b);
alert(b==a);

у вас не обьекты сравниваются а строка с числом. это не хэши, про которые мы говорим.

dmitriymar 25.12.2011 19:43

Цитата:

Сообщение от Livaanderiamarum
у вас не обьекты сравниваются а строка с числом. это не хэши, про которые мы говорим.

пример на вашу фразу по поводу примитивных значений. а вот по мне что 5 в любом случае это 5.
и что дальше?
а по вашему вопросы читаем доки- по поводу ,что такое есть заключённое в {}

Livaanderiamarum 25.12.2011 19:43

Цитата:

Сообщение от B@rmaley.e><e (Сообщение 145888)
Как видно, сравнение объектов перебором их структуры может быть затратным.

как я вас понял так сделали из-за затратности. ясно. значит для сравнения обьектов как таблиц мне нужно писать отдельную функцию.. спасибо за наводку).

monolithed 25.12.2011 19:56

Цитата:

Сообщение от Livaanderiamarum
значит для сравнения обьектов как таблиц мне нужно писать отдельную функцию

Логично.
Объект — это коллекция свойств, имеющая также связанный с ней объект-прототип.

B@rmaley.e><e 25.12.2011 19:58

Цитата:

Сообщение от Livaanderiamarum
ты прочитал только фразу "Сравнил значения ключей" или весь мой текст? если не весь то прочитай весь

Весь. Но из
Цитата:

Сообщение от Livaanderiamarum
анализ на цикличность ссылок

не понятно, как это поможет дать ответ в этом случае.

Livaanderiamarum 25.12.2011 19:59

Цитата:

Сообщение от monolithed (Сообщение 145902)
Логично.
Объект — это коллекция свойств, имеющая также связанный с ней объект-прототип.

логично было бы включить это в спецификацию

Livaanderiamarum 25.12.2011 20:00

Цитата:

Сообщение от B@rmaley.e><e (Сообщение 145904)
Весь. Но изне понятно, как это поможет дать ответ в этом случае.

анализ на цикличность ссылок на нижнем уровне реализации языка.
(абстрактно всего их 2 если кто не знает)

monolithed 25.12.2011 21:22

Цитата:

Сообщение от Livaanderiamarum
логично было бы включить это в спецификацию

что включить?

Livaanderiamarum 25.12.2011 21:49

Цитата:

Сообщение от monolithed (Сообщение 145948)
что включить?

сравнение идентичности, например ====

trikadin 25.12.2011 22:00

Livaanderiamarum, это объясняется тем, что в DOM-модели браузера могут быть два идентичных объекта (с одним тегом и набором атрибутов), но это будут разные объекты. Смекаешь?

FINoM 25.12.2011 22:10

Livaanderiamarum, если сильно надо сравнить два объекта, можно сделать так:
JSON.stringify(obj1) === JSON.stringify(obj2)

Livaanderiamarum 25.12.2011 22:35

Цитата:

Сообщение от FINoM (Сообщение 145964)
Livaanderiamarum, если сильно надо сравнить два объекта, можно сделать так:
JSON.stringify(obj1) === JSON.stringify(obj2)

ха) я именно так и сделал)))!! распарсил под json и сравнил как строки))
но все ровно спасибо за совет)

а можно сделать это автоматически сделав перегрузку тех методов которые использует оператор == ???)
манкипатчинг форева)

Livaanderiamarum 25.12.2011 22:37

a = {с:3}
a.b = a

alert(  JSON.stringify(a)  )


придется проверять этот метод, если выдаст ошибку, то использовать свой, который придется писать руками)

FINoM 25.12.2011 22:49

Цитата:

Сообщение от Livaanderiamarum
придется проверять этот метод, если выдаст ошибку, то использовать свой, который придется писать руками)

Интересно, какого размера у тебя получится строка :)
Цитата:

Сообщение от Livaanderiamarum
а можно сделать это автоматически сделав перегрузку тех методов которые использует оператор

Нет.

Livaanderiamarum 25.12.2011 22:51

Цитата:

Сообщение от FINoM (Сообщение 145975)
:)Нет.

почему нет? что остановит?

Livaanderiamarum 25.12.2011 22:52

Цитата:

Сообщение от FINoM (Сообщение 145975)
Интересно, какого размера у тебя получится строка

какая строка? я свой метод буду делать не строкой. я уже писал выше как сравниваются подобные таблицы.

B@rmaley.e><e 25.12.2011 23:09

var o = {a : alert}, o2 = {a : prompt};

alert(JSON.stringify(o) == JSON.stringify(o2))

Livaanderiamarum 25.12.2011 23:15

Цитата:

Сообщение от B@rmaley.e><e (Сообщение 145980)
var o = {a : alert}, o2 = {a : prompt};

alert(JSON.stringify(o))

native code

trikadin 25.12.2011 23:21

Livaanderiamarum, о, я только что понял... Ты зачем нового пользователя создал?) Тот как раз сегодня из бана вышел, вроде как...

melky 25.12.2011 23:22

var o = {a : alert}, o2 = {a : prompt}, o3 = { a : alert };

alert([o.toSource() == o3.toSource(), o.toSource() == o2.toSource()]);


проблема только в налиции Object.toSource

PS :
alert(   ({alert : alert}).toSource()  ) // ({alert:function alert() {[native code]}})

Livaanderiamarum 25.12.2011 23:49

Цитата:

Сообщение от trikadin (Сообщение 145983)
Livaanderiamarum, о, я только что понял... Ты зачем нового пользователя создал?) Тот как раз сегодня из бана вышел, вроде как...

не, завтра выйдет(, я соскучился по вам)

trikadin 25.12.2011 23:51

Цитата:

Сообщение от Livaanderiamarum
не, завтра выйдет(, я соскучился по вам)

И правда, завтра...

Livaanderiamarum 25.12.2011 23:55

Цитата:

Сообщение от trikadin (Сообщение 145997)
И правда, завтра...

через 300 секунд, не)?

monolithed 26.12.2011 00:08

Livaanderiamarum, pазве не понятно что такое прототипы и что значения могут содержать не только строки, но и другие объекты?

var fn = function() {
    return 1;
};

var obj = {a : fn};

alert(JSON.stringify(obj));


var some = 1;

var fn = function() {
    return some;
};

var obj = {a : fn};

alert(obj.toSource());


var foo;

var some = "string1";

var bar = {
    a : some
}

var fn = function() {
	var some = "string2";

	foo = {
		a : some
	}
}();

alert([foo.a, bar.a]);

Livaanderiamarum 26.12.2011 00:12

Цитата:

Сообщение от monolithed (Сообщение 146003)
Разве не понятно что такое прототипы и что значения могут содержать не только строки, но и другие объекты?

что бы прототипы, расскажите по подробней)?

trikadin 26.12.2011 00:16

Цитата:

Сообщение от Livaanderiamarum
что бы прототипы, расскажите по подробней)?

RTFM.

Livaanderiamarum 26.12.2011 00:32

Цитата:

Сообщение от trikadin (Сообщение 146006)
RTFM.

аа, вы про группировку общих свойств и методов в ООП чтобы не занимать память))? тогда понятно)

Gvozd 26.12.2011 01:25

Цитата:

Сообщение от 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)
Это ссылки на объекты находящиеся по разным адресам(а значит надо продолжить сравнивать)
Ну у каждого из них обнаружено зацикливание(адрес совпадает с первоначальным для объектов)
Поэтому вглубь мы не идем
И что дальше?
равны текущие свойства или нет? Если да, то почему?

Livaanderiamarum 26.12.2011 19:35

Цитата:

Сообщение от Gvozd (Сообщение 146037)
Все-таки как ваш алгоритм от работает на примере?
var a = {};//адрес - 0x0008
var b = {};//адрес - 0x00A8
a.a = a;
b.a = b;
alert(a == b)

равны текущие свойства или нет? Если да, то почему?

не равны потому что разная память. не продолжаем потому что обнаружено кольцо.

devote 27.12.2011 08:31

что тут не ясного, нужно смотреть в первую очередь не на то что написано в листинге кода, а на более низкоуровневую часть.

{nya:1} !== {nya:1}
у них разные участки памяти, и объекты всегда сравниваются по ссылке в памяти, потому и разные
"test" === "test"
у них разные участки памяти, но строка сравнивается всегда с содержимым, тоже самое и числа, потому и идентичны

Livaanderiamarum 27.12.2011 13:22

Цитата:

Сообщение от devote (Сообщение 146370)
что тут не ясного, нужно смотреть в первую очередь не на то что написано в листинге кода, а на более низкоуровневую часть.

{nya:1} !== {nya:1}
у них разные участки памяти, и объекты всегда сравниваются по ссылке в памяти, потому и разные
"test" === "test"
у них разные участки памяти, но строка сравнивается всегда с содержимым, тоже самое и числа, потому и идентичны

ахахххахахахб тред не читай, сразу отвечай)


Часовой пояс GMT +3, время: 09:40.