Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Приведение пустого массива к булеву типу, работает по-разному 
:(
    Опции темы
Dima 2015
Дата 16.9.2010, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 16.3.2008
Где: SPb

Репутация: нет
Всего: 2



В общем обнаружил в замечательном языке JavaScript вещь, которая наверняка уж должна быть баяном...

Итак имеем

Код

var arr = [];
var bool = (arr  == true); // false
bool = (!arr ) // false!

// Итого...
bool = (arr  == !arr) // да, совершенно верно - true!!!


Это сообщение отредактировал(а) Dima 2015 - 16.9.2010, 15:35
PM MAIL ICQ   Вверх
ksnk
Дата 16.9.2010, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Dima 2015, не очень удивительно, если представлять себе правила автоматического приведения типов
Цитата

3.3.2. Преобразование типов
JavaScript — слаботипизированный язык. Это означает, что в декларации переменной мы не указываем ее тип и в дальнейшем можем присваивать ей значения любых типов. Исполняющая система JavaScript сама выполняет автоматическое преобразование типов данных по мере необходимости. Для явного преобразования типов используются методы Boolean, Number, Object и String.
Преобразования типов происходят по следующим правилам.
3.3.2.1. Преобразование к логическому типу
Исходный тип    Результат
Undefined    false
Null              false
Boolean      без изменений
Number      false, если аргумент равен +0, -0 или NaN; true в остальных случаях
String         false, если аргумент — пустая строка; true в остальных случаях
Object        true



Добавлено через 3 минуты и 1 секунду
Хотя результат последнего равенства был несколько неожиданн. видимо, если в операции сравнения участвует объект и примитивный тип, то производится приведение к примитивному типу.

Это сообщение отредактировал(а) ksnk - 16.9.2010, 15:57


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Dima 2015
Дата 16.9.2010, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 16.3.2008
Где: SPb

Репутация: нет
Всего: 2



ksnk, я в курсе всего этого, но тут нет как раз ни слова о конкретно этом примере. В данном случае оба раза приводится один и тот же тип - массив к одному и тому же типу - булеву. И оба раза по-разному.

Добавлено через 3 минуты и 14 секунд
Цитата

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


Да не только последнего, последнее это чтобы скажем так показать наглядно. Меня больше 2е смущает, какого черта ![] трактуется как false, при том что сам [] тоже трактуется как false?

Добавлено через 5 минут и 27 секунд
В пыхе проверил, в пыхе не так, в пыхе отрицание к пустому массиву истину дает, что в общем то и следует ожидать.

Код

$a = array();

var_dump(!$a);         // true
var_dump($a == false); // true
var_dump($a == !$a);   // false

PM MAIL ICQ   Вверх
ksnk
Дата 16.9.2010, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



Это только в пыхе пустой массив - false  smile уникальная пыховская фича!

Забавно! Я не смог найти подходящий(логичный) алгоритм преобразования типов во втором случае
Код

var arr = [];
alert(['arr  == true',arr  == true,true == arr ,arr  == Object(true), Boolean(arr)==true,
'\n',typeof(true),typeof(arr),typeof(!arr),
'\narr  == !arr',arr  == !arr, !arr==arr, arr  == Object(!arr), Boolean(arr)  ==!arr, arr  == Boolean(!arr)])


Цитата

arr == true, false, false, false, true,
, boolean, object, boolean,
arr == ! arr, true, true, false, false, true


отсюда получается, что для arr==true выполняется преобразование true к объекту. То есть логично предположить, при разнице типов тип второго операнда насильно приводится к объектному типу.

Для второго случая какбы совсем не так просто. Если тупо преобразовать !arr к объекту счастья так и не получаем :( счастье получаем в случае ПОВТОРНОГО преобразования !arr к логическому. Хотя какбы typeof нас заверяет, что тип и так логический...

В общем резюме - не сравнивайте объекты между собой , может получится конфуз  smile 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Dima 2015
Дата 16.9.2010, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 16.3.2008
Где: SPb

Репутация: нет
Всего: 2



Нет это все понятно, и понятно что программисту который пишет такие сравнения должны быть оторваны руки (вот я себе и оторвал вчера), но сам факт того что в языке конструкция а == !а может вернуть истину, забавна. В прочем в плюсах такое запросто можно сделать, если соответственно переопределить операции сравнения и отрицания, другое дело что это с точки зрения теорвера дико смотрится.

Какова вероятность завтра выйдя на Невский встретить динозавра? - 0,5 - либо встречу, либо не встречу.

Это сообщение отредактировал(а) Dima 2015 - 16.9.2010, 17:12
PM MAIL ICQ   Вверх
Deepthroat
Дата 16.9.2010, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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 с соответствующим результатом.
PM MAIL WWW ICQ   Вверх
Dima 2015
Дата 17.9.2010, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 16.3.2008
Где: SPb

Репутация: нет
Всего: 2



Deepthroat, разложил по полочкам, спасибо smile

Но сам факт забавен, что конструкция a == !a выдает истину...
PM MAIL ICQ   Вверх
magelan
Дата 18.9.2010, 01:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


потерял xPath
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 5.4.2010

Репутация: 2
Всего: 16



Ребята из Netscape видать хорошо пыхнули, перед тем как создать нетипизированный клон си.
Прикольно что контору съели, а дитятко живо.
PM MAIL   Вверх
ksnk
Дата 18.9.2010, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



...



Это сообщение отредактировал(а) ksnk - 18.9.2010, 22:03


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
magelan
Дата 18.9.2010, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


потерял xPath
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 5.4.2010

Репутация: 2
Всего: 16



Я как то про пхп даже не думал, когда писал. неужели JS не тянет на клон си?
PM MAIL   Вверх
ksnk
Дата 18.9.2010, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 84
Всего: 386



magelan, чего-то я торможу smile Про php вот, с чего-то вспомнил...


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0886 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.