![]() |
Модераторы: Sardar, Aliance |
![]() ![]() ![]() |
|
Dima 2015 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 287 Регистрация: 16.3.2008 Где: SPb Репутация: нет Всего: 2 |
В общем обнаружил в замечательном языке JavaScript вещь, которая наверняка уж должна быть баяном...
Итак имеем
Это сообщение отредактировал(а) Dima 2015 - 16.9.2010, 15:35 |
|||
|
||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
Dima 2015, не очень удивительно, если представлять себе правила автоматического приведения типов
Добавлено через 3 минуты и 1 секунду Хотя результат последнего равенства был несколько неожиданн. видимо, если в операции сравнения участвует объект и примитивный тип, то производится приведение к примитивному типу. Это сообщение отредактировал(а) ksnk - 16.9.2010, 15:57 -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
Dima 2015 |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 287 Регистрация: 16.3.2008 Где: SPb Репутация: нет Всего: 2 |
ksnk, я в курсе всего этого, но тут нет как раз ни слова о конкретно этом примере. В данном случае оба раза приводится один и тот же тип - массив к одному и тому же типу - булеву. И оба раза по-разному.
Добавлено через 3 минуты и 14 секунд
Да не только последнего, последнее это чтобы скажем так показать наглядно. Меня больше 2е смущает, какого черта ![] трактуется как false, при том что сам [] тоже трактуется как false? Добавлено через 5 минут и 27 секунд В пыхе проверил, в пыхе не так, в пыхе отрицание к пустому массиву истину дает, что в общем то и следует ожидать.
|
||||
|
|||||
ksnk |
|
||||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
Это только в пыхе пустой массив - false
![]() Забавно! Я не смог найти подходящий(логичный) алгоритм преобразования типов во втором случае
отсюда получается, что для arr==true выполняется преобразование true к объекту. То есть логично предположить, при разнице типов тип второго операнда насильно приводится к объектному типу. Для второго случая какбы совсем не так просто. Если тупо преобразовать !arr к объекту счастья так и не получаем :( счастье получаем в случае ПОВТОРНОГО преобразования !arr к логическому. Хотя какбы typeof нас заверяет, что тип и так логический... В общем резюме - не сравнивайте объекты между собой , может получится конфуз ![]() -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
||||
|
|||||
Dima 2015 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 287 Регистрация: 16.3.2008 Где: SPb Репутация: нет Всего: 2 |
Нет это все понятно, и понятно что программисту который пишет такие сравнения должны быть оторваны руки (вот я себе и оторвал вчера), но сам факт того что в языке конструкция а == !а может вернуть истину, забавна. В прочем в плюсах такое запросто можно сделать, если соответственно переопределить операции сравнения и отрицания, другое дело что это с точки зрения теорвера дико смотрится.
Какова вероятность завтра выйдя на Невский встретить динозавра? - 0,5 - либо встречу, либо не встречу. Это сообщение отредактировал(а) Dima 2015 - 16.9.2010, 17:12 |
|||
|
||||
Deepthroat |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 24.9.2007 Где: Outer Heaven Репутация: 1 Всего: 2 |
Не правильно. При сравнении объектов, они приводятся к числам или строкам при помощи методов valueOf() и toString(). В примере выше все получается по правилам. Сперва исполняется оператор "!". При применении его к нелогическому типу, возвращается false в случае, если переменная может быть приведена к значению true. Элементарная проверка new Boolean(arr) показывает, что arr и преобразуется в true. Соответственно, !arr дает false. Дальше, при сравнении объекта с логической переменной, массив преобразуется при помощи метода .toString(). Так как массив пустой, то и преобразуется он в пустую строку. А пустая строка, при преобразовании к логическому значению, дает false. Вот и получаем, false == false. Можете посмотреть, как изменится результат, если arr объявить так: var arr = [1]. При преобразовании в строку, это уже будет строка '1', не пустая, которая при приведении к логическому типу даст true. Получится true == false с соответствующим результатом. |
|||
|
||||
Dima 2015 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 287 Регистрация: 16.3.2008 Где: SPb Репутация: нет Всего: 2 |
Deepthroat, разложил по полочкам, спасибо
![]() Но сам факт забавен, что конструкция a == !a выдает истину... |
|||
|
||||
magelan |
|
|||
![]() потерял xPath ![]() ![]() Профиль Группа: Участник Сообщений: 393 Регистрация: 5.4.2010 Репутация: 2 Всего: 16 |
Ребята из Netscape видать хорошо пыхнули, перед тем как создать нетипизированный клон си.
Прикольно что контору съели, а дитятко живо. |
|||
|
||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
...
Это сообщение отредактировал(а) ksnk - 18.9.2010, 22:03 -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
magelan |
|
|||
![]() потерял xPath ![]() ![]() Профиль Группа: Участник Сообщений: 393 Регистрация: 5.4.2010 Репутация: 2 Всего: 16 |
Я как то про пхп даже не думал, когда писал. неужели JS не тянет на клон си?
|
|||
|
||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
magelan, чего-то я торможу
![]() -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
![]() ![]() ![]() |
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |