12.01.2014, 10:01
|
Профессор
|
|
Регистрация: 08.01.2014
Сообщений: 354
|
|
WTF?????????
alert( [10] == 10 )
Кто знает ответ)? (берите под спойлер)
|
|
12.01.2014, 10:55
|
Интересующийся
|
|
Регистрация: 25.02.2012
Сообщений: 10
|
|
Что вас удивило?
Знак "==" обозначает неявное сравнение, а это значит что типы элементов слева и справа должны быть неявно преобразованы. [10] - это элемент массива, он не может быть преобразован в число или строку и преобразуется в true. Правая часть тоже должна быть преобразована в булев тип, поскольку сравнивать можно только одинаковые типы. Известно что 0 или "" - это false, все остальные значения, отличные от нуля, отрицательных чисел или пустой строки - это true. Итог true == true? Ну конечно true!
|
|
12.01.2014, 11:17
|
|
Быдлокодер;)
|
|
Регистрация: 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, 12.01.2014 в 11:19.
|
|
12.01.2014, 11:19
|
|
Быдлокодер;)
|
|
Регистрация: 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, 12.01.2014 в 11:58.
|
|
12.01.2014, 12:49
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
Сообщение от kobezzza
|
valueOf, но для массива он возвращает ссылку на исходный массив, поэтому следующим используется метод toString
|
это конечно не очень важно, но я чот не припомню уже текст спеки, где это обьясняется.
короче, можно пруф ?)
|
|
12.01.2014, 13:07
|
|
Быдлокодер;)
|
|
Регистрация: 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, 12.01.2014 в 13:11.
|
|
12.01.2014, 14:11
|
|
Быдлокодер;)
|
|
Регистрация: 19.11.2010
Сообщений: 4,338
|
|
Есть пример повеселее
var a = '';
var b = 0;
var c = [0];
alert(a == b);
alert(b == c);
alert(a == c);
|
|
12.01.2014, 14:53
|
|
Профессор
|
|
Регистрация: 05.06.2009
Сообщений: 1,703
|
|
Maxmaxmaximus7,
нутычукчаяхерею
__________________
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.
Самые главные в жизни вещи - не вещи! (было написано на одном гараже =)
|
|
12.01.2014, 17:25
|
|
猫
|
|
Регистрация: 07.06.2007
Сообщений: 7,504
|
|
alert(Boolean(parseInt([0].toString(),10)));
alert([0] == '');
alert([] == '');
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
Последний раз редактировалось Gozar, 12.01.2014 в 17:30.
|
|
12.01.2014, 18:50
|
Профессор
|
|
Регистрация: 08.01.2014
Сообщений: 354
|
|
Сообщение от maxmaster
|
Что вас удивило?
|
ничего не удивило, просто создал WTF тред, а ты ньюфаг видимо?
Сообщение от kobezzza
|
toString и он как раз возвращает
|
return this.join(',')
|
|
|
|