alert({ня:3} == {ня:3})//false
alert({ня:3} == {ня:3}) оператор сравнивания с приведением типов 2 идентичных(равных) объекта (но разных) считает не равными? Почему так сделали и зачем они не исправляют такое упущение в языке? Возможно это не упущение и сделано намеренно для чего-то, тогда для чего? |
я конечно могу сравнить идентичность обьектов перебрав их ключи и параметры и сравнить. но на кой черт тогда нужен оператор сравнивания? может он не умеет работать с не примитивными значениями? я понимаю злость и ненависть заступников оператора сравнивания которые хотят щас меня убить такого тупого, но поймите меня я обычный. человек, новичок в программировании и мне не понятна одна вещь я просто спрашиваю. Не ругайте меня пожалуйста
|
А как бы Вы сравнивали такое?
var a = {}, b = {}; a.a = a; b.a = b; alert(a == b)a и b идентичны, но разные. Как видно, сравнение объектов перебором их структуры может быть затратным. |
Цитата:
тут 2 этапа: 1) вначале отыскиваются и сравниваются все примитивные значения, если разница не обнаружена, то. 2) потом сравниваются все остальные ссылки. при том используется не только примитивный метод getValue() а еще и анализ на цикличность ссылок. при том если ссылка ведет на одну и ту же область в памяти то, учитывал бы это как равность. как то так. а вы? |
Цитата:
|
Livaanderiamarum,
вот честно,я абсолютно непониме ... то ли лыжи то ли я.... вы виндовс на js пишите? если нет-то для чего всё это? для игры под ай? дак это там не понадобится. а если понадобилось-просмотрите ещё раз сегмент успешных игр. для чего разрабатывать то,что не будет пользоваться коммерческим успехом? для самооценки повышения? самооценкой вы не себя ни семью не накормите. а так если честно,моё мнение,вы муровод какой решил что буду заниматься вот этой задачей(а о ней вы рассказывали ) ищущий причину чтоб от неё отлынивать. не зря ведь сказано-кто хочет ищет возможность,кто не хочет ищет причину. моё мнение-вы второй тип. да и смена учётки чтоб снять минусовую карму-радикальный ход. не думали как это смотрится глазами других? |
Цитата:
|
Цитата:
var a=5+""; var b=5; alert(a); alert(b); alert(a==b); alert(a===b); и вы хотите сказать что они одинаковые? |
Цитата:
|
Цитата:
|
Цитата:
и что дальше? а по вашему вопросы читаем доки- по поводу ,что такое есть заключённое в {} |
Цитата:
|
Цитата:
Объект — это коллекция свойств, имеющая также связанный с ней объект-прототип. |
Цитата:
Цитата:
|
Цитата:
|
Цитата:
(абстрактно всего их 2 если кто не знает) |
Цитата:
|
Цитата:
|
Livaanderiamarum, это объясняется тем, что в DOM-модели браузера могут быть два идентичных объекта (с одним тегом и набором атрибутов), но это будут разные объекты. Смекаешь?
|
Livaanderiamarum, если сильно надо сравнить два объекта, можно сделать так:
JSON.stringify(obj1) === JSON.stringify(obj2) |
Цитата:
но все ровно спасибо за совет) а можно сделать это автоматически сделав перегрузку тех методов которые использует оператор == ???) манкипатчинг форева) |
a = {с:3} a.b = a alert( JSON.stringify(a) ) придется проверять этот метод, если выдаст ошибку, то использовать свой, который придется писать руками) |
Цитата:
Цитата:
|
Цитата:
|
Цитата:
|
var o = {a : alert}, o2 = {a : prompt}; alert(JSON.stringify(o) == JSON.stringify(o2)) |
Цитата:
|
Livaanderiamarum, о, я только что понял... Ты зачем нового пользователя создал?) Тот как раз сегодня из бана вышел, вроде как...
|
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, 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]); |
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
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) Это ссылки на объекты находящиеся по разным адресам(а значит надо продолжить сравнивать) Ну у каждого из них обнаружено зацикливание(адрес совпадает с первоначальным для объектов) Поэтому вглубь мы не идем И что дальше? равны текущие свойства или нет? Если да, то почему? |
Цитата:
|
что тут не ясного, нужно смотреть в первую очередь не на то что написано в листинге кода, а на более низкоуровневую часть.
{nya:1} !== {nya:1} у них разные участки памяти, и объекты всегда сравниваются по ссылке в памяти, потому и разные "test" === "test" у них разные участки памяти, но строка сравнивается всегда с содержимым, тоже самое и числа, потому и идентичны |
Цитата:
|
Часовой пояс GMT +3, время: 09:40. |