# Wat

## Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

• меня порвало на лоскуты.
• И чо?
• Убило про {} + {}
• UFO just landed and posted this here
• Мне понравилось!
Только надо было оформить по другому — сделать картинку кликабельной и нарисовать стрелку play на ней.
• Для тех, кто собрался минусовать пост — сначала пройдите по ссылке под картинкой.
• Для тех у кого тормозит видео по линку — оно есть на трубе
youtu.be/tErVvempcCU
• Не ожидал, что всё так плохо…
Но проржался =)
• UFO just landed and posted this here
• UFO just landed and posted this here
• Про приколы javascript можно посмотреть еще тут wtfjs.com/

Мой любимый:
Math.min() < Math.max(); // false
• Считать это поведение WTF могут только люди, которые вообще не знают JS. Все поведение очень логичное, в т.ч. ваше любимое.
• Про мое любимое объясните? Мне честно не понятна логика таких действий. Ссылка сойдет.

WTF это когда результат не совпадает с ожиданием, и естественно если ты знаешь почему происходит та или иная ситуация, считать это WFT не будешь.
• Определение функции. Функция Math.min возвращает минимальное из переданного. Если аргументы не переданы, то она возвращает максимально возможное число. Это поведение — логичное и последовательное. Просто нужно понимать, что Math.min не возвращает минимально возможное число, оно возвращает минимальное из переданных. Math.max — возвращает самое большее число из переданных или минимально-возможное.

Для того, чтобы окончательно понять, представьте, что в max дополнительным аргументом передаётся -Infinity, а в min — +Infinity.

Если вы считаете это поведение нелогичным, то скажите, как необходимо было поступить авторам этих функций? Я бы поступил точно так же.

А если необходимо самое больше и самое маленькое число, то можно использовать +Infinity и -Infinity.

wtfjs сделан для запугивания новичков и это сплошная демагогия о том, какой сложный язык, стараясь привязать к документированному поведению какие-то недокументированные возможности, которые вроде бы должны быть. Это всё-равно, что жаловатся, что JS поведёт себя не так же, как питон и не учтёт отступы:

if (cond)
code1();
code2();

• for(var i=0;i<10;++i);
sum+=i;
• for(var i=0;i<10;++i); //  тут стоит точка с запятой - тело цикла нет
sum+=i; // будет ReferenceError или +10 если sum объявлен как число

var i=5;i=++i + ++i; //  i?
• Как сишник со стажем — скажу что it depends от компилятора
• Скорее зависит от того, что принимает оператор +: уже преобразованные значения(будет 13) или ссылку объект, который он сам преобразует в значения(будет 14)
• так тем ++i и отличается от i++ тем что один возвращает временную переменную и инкрементит, а второй инкрементит и возвращает.
Именно по этому ++i и быстрее.
• Ты там озвучь свой wat, если время будет.
• Вы могли не рассказывать так много. Все проясняет 1 фраза: «функция Math.min».
а я то дурак, думал что функции лучше со скобками в конце писать, оказывается надо просто заранее знать что имется в виде не константа -_-
• Дык, они со скобками по условиям и пишутся:
Math.min() < Math.max();

• Пока придумывал остроумный комментарий забыл с чего все началось ))
• Если не возражаете, поспрашиваю еще. Почему:
function Dude(name){ this.name = name; return [1, 2, 3]; } new Dude('Bob'); // [1, 2, 3] function Dude(name){ this.name = name; return 3; } new Dude('Bob'); // { name: 'Bob' } 
• new:
The object returned by the constructor function becomes the result of the whole new expression. If the constructor function doesn't explicitly return an object, the object created in step 1 is used instead. (Normally constructors don't return a value, but they can choose to do so if they want to override the normal object creation process.)

Обратите внимание. Если конструктор вернул объект (именно объект, а не примитивное значение), то возвращается этот объект, иначе — возвращается значение this. К вашему примеру можно добавить такой:
function Dude(name){
this.name = name;
return new Number(3);
}

new Dude('Bob'); // Number(3)

• благодарю
+1
Я наверное какой то необычный программист, но я бы поднял исключение, если в функцию Max/Min не передано аргументов.
• А зачем? Это исключительная ситуация, при которой лучше повалить всё приложение а не обработать найболее логичным образом?
var minNextValue = Math.max.apply( max, fetchValuesFromDb() );

0
Это исключительная ситуация, при которой лучше повалить всё приложение
как связано поднятие исключения и «повалить всё приложение»?

а не обработать найболее логичным образом?
поднять исключение и есть обработать наиболее логичным образом. Если нужно, что при отсутствии параметров функция вернула какое то дефолтовое значение — так никто не мешает написать какой нить minOrDefault
• Функция отрабатывает строго по стандарту и вполне логично. Так в чём проблема? В том, что есть люди, которые не читают доков, а стараются угадать поведение функции по стандарту? Угадайте поведение функции Math.random она вернёт число от -Infinity до Infinity? От 0 до 1? В каждом языке — по разному.
Поведение min и max логичное, стандартизованное и, главное, документированное. Так что не так?
+1
О сколько нам открытий чудных готовит чтение стандартов вслух :)
–1
вы наверное на php пишете?
0
Какое-то — это одна ситуация, логичное — совсем другая.
• И в этом есть смысл. Например max:
var max = -Infinity,
values = [];
for (var i = values.length; i  --> 0;) {
if (values[i] > max) {
max = values[i];
}
}
return max; // если values.length === 0 то вернется -Infinity

• в нашем случае values=undefined
• нет, в этом случае как раз values равно пустому объекту arguments. а может содержать значения.
Math.max(   ) => values = []
Math.max(1  ) => values = 
Math.max(1,2) => values = [1,2]
• a = function(a){ return a.length;}
function (a) { return a.length;}

a();
//error
• Все понял
• a = function(){ return arguments.length }

a(); // 0
a(1); // 1
a(1,2); // 1, 2
• function test(a, b, c) {return arguments.length}
test.length; // 3
test(1,2,3,4,5,6); // 6

• Возможно, это даже лучше, чем «BSD is dying».
0
У меня видео категорически отказалось грузиться (возможно, из-за хабраэффекта?)
• А мне показалось странным вот такое поведение:
Math.min(NaN,2,3);
// NaN
Math.max(NaN,2,3);
// NaN


выводится NaN, а не сообщение об ошибке или соответствующее из остальных чисел.
Такие же результаты если передавать любые «NaN»-ы. А если вместо NaN передать пустой массив, булевское значение или пустую строку то всё норм. Видимо всё кроется в авто-приведении одних типов переменных к другим и выходит, что [] == "" == false == 0.
• www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf страница 163
min ( [ value1 [, value2 [, … ] ] ] )
Given zero or more arguments, calls ToNumber on each of the arguments and returns the smallest of the resulting values.
* If no arguments are given, the result is +Infinity.
* If any value is NaN, the result is NaN.
* The comparison of values to determine the smallest value is done as in 11.8.5 except that +0 is considered to be larger than -0.
The length property of the min method is 2.
• Ситуация та же, что и с null в SQL  