Pull to refresh

Comments 46

UFO just landed and posted this here
Мне понравилось!
Только надо было оформить по другому — сделать картинку кликабельной и нарисовать стрелку play на ней.
Для тех, кто собрался минусовать пост — сначала пройдите по ссылке под картинкой.
Не ожидал, что всё так плохо…
Но проржался =)
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; // будет ReferenceError или +10 если sum объявлен как число

var i=5;i=++i + ++i; //  i?
Как сишник со стажем — скажу что it depends от компилятора
Скорее зависит от того, что принимает оператор +: уже преобразованные значения(будет 13) или ссылку объект, который он сам преобразует в значения(будет 14)
так тем ++i и отличается от i++ тем что один возвращает временную переменную и инкрементит, а второй инкрементит и возвращает.
Именно по этому ++i и быстрее.
Вы могли не рассказывать так много. Все проясняет 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)


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

а не обработать найболее логичным образом?
поднять исключение и есть обработать наиболее логичным образом. Если нужно, что при отсутствии параметров функция вернула какое то дефолтовое значение — так никто не мешает написать какой нить minOrDefault
Функция отрабатывает строго по стандарту и вполне логично. Так в чём проблема? В том, что есть люди, которые не читают доков, а стараются угадать поведение функции по стандарту? Угадайте поведение функции Math.random она вернёт число от -Infinity до Infinity? От 0 до 1? В каждом языке — по разному.
Поведение min и max логичное, стандартизованное и, главное, документированное. Так что не так?
О сколько нам открытий чудных готовит чтение стандартов вслух :)
Какое-то — это одна ситуация, логичное — совсем другая.
И в этом есть смысл. Например 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 равно пустому объекту arguments. а может содержать значения.
Math.max(   ) => values = []
Math.max(1  ) => values = [1]
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».
А мне показалось странным вот такое поведение:
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.
Sign up to leave a comment.

Articles