Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.01.2014, 10:01
Профессор
Посмотреть профиль Найти все сообщения от Maxmaxmaximus7
 
Регистрация: 08.01.2014
Сообщений: 354

WTF?????????
alert( [10] == 10  )


Кто знает ответ)? (берите под спойлер)
Ответить с цитированием
  #2 (permalink)  
Старый 12.01.2014, 10:55
Интересующийся
Отправить личное сообщение для maxmaster Посмотреть профиль Найти все сообщения от maxmaster
 
Регистрация: 25.02.2012
Сообщений: 10

Что вас удивило?
Знак "==" обозначает неявное сравнение, а это значит что типы элементов слева и справа должны быть неявно преобразованы. [10] - это элемент массива, он не может быть преобразован в число или строку и преобразуется в true. Правая часть тоже должна быть преобразована в булев тип, поскольку сравнивать можно только одинаковые типы. Известно что 0 или "" - это false, все остальные значения, отличные от нуля, отрицательных чисел или пустой строки - это true. Итог true == true? Ну конечно true!
Ответить с цитированием
  #3 (permalink)  
Старый 12.01.2014, 11:17
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

В случае не тождественного сравнения объекта с примитивом, то объект приводится к примитиву и затем производится сравнение. Сначала пробуется метод valueOf, но для массива он возвращает ссылку на исходный массив, поэтому следующим используется метод toString и он как раз возвращает '10', т.е. '10' == 10 => true.

var a = [10];
a.valueOf = function () { return 1; }

alert(a == 1);
alert(a == 10);
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 12.01.2014 в 11:19.
Ответить с цитированием
  #4 (permalink)  
Старый 12.01.2014, 11:19
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Сообщение от maxmaster Посмотреть сообщение
Что вас удивило?
Знак "==" обозначает неявное сравнение, а это значит что типы элементов слева и справа должны быть неявно преобразованы. [10] - это элемент массива, он не может быть преобразован в число или строку и преобразуется в true. Правая часть тоже должна быть преобразована в булев тип, поскольку сравнивать можно только одинаковые типы. Известно что 0 или "" - это false, все остальные значения, отличные от нуля, отрицательных чисел или пустой строки - это true. Итог true == true? Ну конечно true!
Вы написали бред.

Цитата:
[10] - это элемент массива, он не может быть преобразован в число или строку
alert([1,2].toString());
alert([1] + 2);
alert(Number([1]) + 2);


В общем курите мат часть.
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 12.01.2014 в 11:58.
Ответить с цитированием
  #5 (permalink)  
Старый 12.01.2014, 12:49
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от kobezzza
valueOf, но для массива он возвращает ссылку на исходный массив, поэтому следующим используется метод toString
это конечно не очень важно, но я чот не припомню уже текст спеки, где это обьясняется.

короче, можно пруф ?)
Ответить с цитированием
  #6 (permalink)  
Старый 12.01.2014, 13:07
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Сообщение от melky Посмотреть сообщение
это конечно не очень важно, но я чот не припомню уже текст спеки, где это обьясняется.

короче, можно пруф ?)
Всё просто: Array.prototype не определяет своего valueOf, т.е.
alert(Array.prototype.valueOf === Object.prototype.valueOf);


А у Object.prototype.valueOf реализация как раз:

alert(JSON.stringify({a: 1}.valueOf()));


http://es5.javascript.ru/x15.2.html#x15.2.4.4
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 12.01.2014 в 13:11.
Ответить с цитированием
  #7 (permalink)  
Старый 12.01.2014, 14:11
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Есть пример повеселее

var a = '';
var b = 0;
var c = [0];

alert(a == b);
alert(b == c);
alert(a == c);
__________________
kobezzza
code monkey
Ответить с цитированием
  #8 (permalink)  
Старый 12.01.2014, 14:53
Аватар для Tim
Tim Tim вне форума
Профессор
Отправить личное сообщение для Tim Посмотреть профиль Найти все сообщения от Tim
 
Регистрация: 05.06.2009
Сообщений: 1,703

Maxmaxmaximus7,
нутычукчаяхерею
__________________
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.
Самые главные в жизни вещи - не вещи! (было написано на одном гараже =)
Ответить с цитированием
  #9 (permalink)  
Старый 12.01.2014, 17:25
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

alert(Boolean(parseInt([0].toString(),10)));
alert([0] == '');
alert([] == '');
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.

Последний раз редактировалось Gozar, 12.01.2014 в 17:30.
Ответить с цитированием
  #10 (permalink)  
Старый 12.01.2014, 18:50
Профессор
Посмотреть профиль Найти все сообщения от Maxmaxmaximus7
 
Регистрация: 08.01.2014
Сообщений: 354

Сообщение от maxmaster
Что вас удивило?
ничего не удивило, просто создал WTF тред, а ты ньюфаг видимо?

Сообщение от kobezzza
toString и он как раз возвращает
return this.join(',')


Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
a-b!=a-b, wtf? absolute noob Общие вопросы Javascript 4 24.11.2013 21:47
WTF? Забанят его уже или нет? Tim Оффтопик 16 03.11.2013 22:40
WTF with Date and 2012.04.01 ? dmitry.tsatsarin Общие вопросы Javascript 2 29.04.2012 16:06
wtf javascript vflash Оффтопик 53 14.11.2011 01:44