WTF?????????
alert( [10] == 10 ) Кто знает ответ)? (берите под спойлер) |
Что вас удивило?
Знак "==" обозначает неявное сравнение, а это значит что типы элементов слева и справа должны быть неявно преобразованы. [10] - это элемент массива, он не может быть преобразован в число или строку и преобразуется в true. Правая часть тоже должна быть преобразована в булев тип, поскольку сравнивать можно только одинаковые типы. Известно что 0 или "" - это false, все остальные значения, отличные от нуля, отрицательных чисел или пустой строки - это true. Итог true == true? Ну конечно true!:dance: |
В случае не тождественного сравнения объекта с примитивом, то объект приводится к примитиву и затем производится сравнение. Сначала пробуется метод valueOf, но для массива он возвращает ссылку на исходный массив, поэтому следующим используется метод toString и он как раз возвращает '10', т.е. '10' == 10 => true.
var a = [10]; a.valueOf = function () { return 1; } alert(a == 1); alert(a == 10); |
Цитата:
Цитата:
alert([1,2].toString()); alert([1] + 2); alert(Number([1]) + 2); В общем курите мат часть. |
Цитата:
короче, можно пруф ?) |
Цитата:
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 |
Есть пример повеселее :)
var a = ''; var b = 0; var c = [0]; alert(a == b); alert(b == c); alert(a == c); |
Maxmaxmaximus7,
нутычукчаяхерею :lol: |
alert(Boolean(parseInt([0].toString(),10))); alert([0] == ''); alert([] == ''); |
Цитата:
Цитата:
return this.join(',') :) |
Часовой пояс GMT +3, время: 04:30. |