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(',')


:)

kobezzza 12.01.2014 18:57

Цитата:

Сообщение от Maxmaxmaximus7 (Сообщение 291777)
return this.join(',')


:)

Ну это понятно, просто я как бы намекнул, что можно сделать:

var a = [10];
a.toString = function () { return 'FUUU!' };
alert(a == 10);

Maxmaxmaximus7 12.01.2014 18:58

Цитата:

Сообщение от kobezzza
Ну это понятно, просто я как бы намекнул

ну так а я не только тебе говорю)

kobezzza 12.01.2014 18:59

Цитата:

Сообщение от Maxmaxmaximus7 (Сообщение 291782)
ну так а я не только тебе говорю)

ок:)

monolithed 12.01.2014 21:17

alert(++[0][0]+[0] == 10)

Maxmaxmaximus7 12.01.2014 21:50

1 и 0 даже не гадая)

melky 12.01.2014 21:52

alert( 1 - 0,1 )

Maxmaxmaximus7 12.01.2014 22:36

melky,
хахахахахахха а вот это охуенно!! блин щикарно)

Gozar 12.01.2014 23:13

Цитата:

Сообщение от Maxmaxmaximus7
хахахахахахха а вот это охуенно!! блин щикарно)

Что в этом щикарного?
alert( 1 - 0 , 1 )


Максимус, хочешь пальчик покажу? смешно?
alert((1-0),2)

alert(22,2)

Maxmaxmaximus7 13.01.2014 00:05

Цитата:

Сообщение от Gozar
Что в этом щикарного?

глупый, шикарно то что кажется что это разделитель а на самом деле это просто форматирование такое чтобы запутать) вот глупый кот)

Цитата:

Сообщение от Gozar
Максимус, хочешь пальчик покажу? смешно?

а, котик подумал что я типа не догадался в чем дело и по этому подумал что шикарно? котик ты ошибся, ты понял в чем твоя ошибка?

Gozar 13.01.2014 02:12

кто здесь?

Maxmaxmaximus7 13.01.2014 02:33

я.

Gozar 13.01.2014 03:03

Жаль, я думал здесь кто-то есть.

Maxmaxmaximus7 13.01.2014 03:08

Но я! Но я же тут!!! Я ЕСТЬ!! Я ЕСТЬ!!111111111

Gozar 13.01.2014 03:27

Что, кто? А, нет, показалось.

melky 13.01.2014 03:34

что-то не так, Gozar ?

Maxmaxmaximus7 13.01.2014 03:35

melky,
он просто не умеет пользоваться дев тулсом от хрома чтобы удалять мои посты =)

Gozar 13.01.2014 03:38

Цитата:

Сообщение от melky
что-то не так, Gozar ?

Почудилось, что здесь призрак максиса есть, просто почудилось все нормуль ...

Maxmaxmaximus7 13.01.2014 06:04

Цитата:

Сообщение от Gozar
максиса

дальше не читал

Aetae 13.01.2014 09:00

Годы идут, ничего не меняется...


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