Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   WTF????????? (https://javascript.ru/forum/offtopic/44234-wtf.html)

Maxmaxmaximus7 12.01.2014 10:01

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


Кто знает ответ)? (берите под спойлер)

maxmaster 12.01.2014 10:55

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

kobezzza 12.01.2014 11:17

В случае не тождественного сравнения объекта с примитивом, то объект приводится к примитиву и затем производится сравнение. Сначала пробуется метод 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

Цитата:

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

Вы написали бред.

Цитата:

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


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

melky 12.01.2014 12:49

Цитата:

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

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

короче, можно пруф ?)

kobezzza 12.01.2014 13:07

Цитата:

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

короче, можно пруф ?)

Всё просто: 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 14:11

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

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

alert(a == b);
alert(b == c);
alert(a == c);

Tim 12.01.2014 14:53

Maxmaxmaximus7,
нутычукчаяхерею :lol:

Gozar 12.01.2014 17:25

alert(Boolean(parseInt([0].toString(),10)));
alert([0] == '');
alert([] == '');

Maxmaxmaximus7 12.01.2014 18:50

Цитата:

Сообщение от maxmaster
Что вас удивило?

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

Цитата:

Сообщение от kobezzza
toString и он как раз возвращает

return this.join(',')


:)


Часовой пояс GMT +3, время: 04:30.