Что не так с javascript? Объясните, почему его все так "любят"?
К примеру на картинке выше пример того, как JS сортирует числа...как строки, по этому и выходит "[0,1,10,2]" - это же так очевидно и логично.
Действительно) Спасибо за разъяснение.
Суть не в тему, что кто-то знает или не знает, дело в не очевидности и алогичности.
О да! Офигенный язык.
'5'+3 = '53'
'5'-3 = 2
'5'+3 = '53'
'5'-3 = 2
Настолько очевидно, что мимокрокодил никогда не предугадал бы такой порядок сортировки, а для понимания нужно иметь специальные знания. Очевидно, блядь, на хуй иди.
Нет. Ты в коде явно задаешь массив только чисел. Система вывода типов нормального языка, например, скалы, выведет тип коллекции как минимальный общий для всех элементов(в данном случае, интежер), и, естественно, при вызове метода сортировки, применит компа для этого типа по-умолчанию, а для инта это математическое сравнение.
Как работает вывод типов в жскрипте - это полный пц.
Как работает вывод типов в жскрипте - это полный пц.
Скала будет чекать тип каждого элемента массива? Это же дофига долго.
Ситуация несколько шире. Метод sort принимает в качестве параметра функцию-компаратор. Если компаратор не указан явно, используется компаратор алфавитного порядка. https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
Если включить голову, то сразу должен возникнуть вопрос, как будет работать сортировка, если не указан компаратор. В js массивы гетерогенные, т.е. могут содержать объекты разных типов. Как их сравнивать?
То, что у программиста не возникло подозрений при использование сортировки без какого-либо указания способа сравнения элементов, говорит о его низкой квалификации и непонимании базовых основ информатики
Если включить голову, то сразу должен возникнуть вопрос, как будет работать сортировка, если не указан компаратор. В js массивы гетерогенные, т.е. могут содержать объекты разных типов. Как их сравнивать?
То, что у программиста не возникло подозрений при использование сортировки без какого-либо указания способа сравнения элементов, говорит о его низкой квалификации и непонимании базовых основ информатики
Ну скажем в нормальном ООП языке программирования есть такое понятие, как перегрузки => пришедший из какого-нибудь C# подумает, что вызовется перегрузка метода с нужным типом => будет сортировка интов, а не строк.
Собственно JS является ООП языком программирования. А то, что все приводится к строкам и потом сортируется- это неочевидная хрень и не понятно зачем вообще иметь такую дефолтную сортировку, если она заведомо в 90% случаев не та, которая нужна.
Собственно JS является ООП языком программирования. А то, что все приводится к строкам и потом сортируется- это неочевидная хрень и не понятно зачем вообще иметь такую дефолтную сортировку, если она заведомо в 90% случаев не та, которая нужна.
В C# статическая типизация. Это значит, что объявляя массив, компилятор потребует явно или косвенно указать тип элементов массива. Причем все элементы должны принадлежать к этому типу. Поэтому перегрузка оператор сравнения (компаратор) будет работать. Например,
List myList = new List();
myList.Add("a");
myList.Add("z");
myList.Add("g");
myList.Sort(); // ["a", "g", "z"]
В последней строке метод Sort, зная тип элементов массива, попытается привести их к типу Comparable. А так как строки наследуются от Coparable, у него это получится.
В JS массивы могут содержать объекты произвольного типа. Причем заранее может быть неизвестно какие элементы окажутся в массиве.
List myList = new List();
myList.Add("a");
myList.Add("z");
myList.Add("g");
myList.Sort(); // ["a", "g", "z"]
В последней строке метод Sort, зная тип элементов массива, попытается привести их к типу Comparable. А так как строки наследуются от Coparable, у него это получится.
В JS массивы могут содержать объекты произвольного типа. Причем заранее может быть неизвестно какие элементы окажутся в массиве.
Ты мне лучше скажи, чем динамическая типизация лучше статической и почему JS пошел этим путем? Лично я не вижу в ней достоинств кроме того, что можно поговнокодить. По идее, раз ты делашь сайт => тебе известны все модели с которыми ты будешь работать => ты можешь сделать конкретные типы.
Строго говоря, в шарпе и прочих, технически, массив точно так же может содержать объекты любого ссылочного типа(а вот в с/с++ - нет, там попытка записать в коллекцию объект другого типа приведет к непредсказуемым результатам). Но в шарпе, жабе, и прочих, есть шаблоны и типы у коллекций, в том числе и у массива. Это метаинфа на уровне компиляции, т. е. кода. Компилятор выбирает для статик массива минимальный общий тип. И применяет все операции уже к нему.
А вот в жскрипте типа у коллекций нет, и это полная ж. Хотя с типизацией у жскрипта вообще пиздец.
А вот в жскрипте типа у коллекций нет, и это полная ж. Хотя с типизацией у жскрипта вообще пиздец.
Падажи, Windows также сортирует файлы по именам. Что это значит?
Также как в свое время в ПэХаПе ломанулось куча народу, так и в джаваскрипт ломанулись. И теперь уже куча js-макак никак не осилят правила сортировки и им разрывает шаблоны от некоторых конструкций.
На жабоскрипт возрос спрос, туда ломанулась куча макак, которые делают говнокод для этих ваших браузеров, который заставляет их рыдать, как сучек. А жабоскрипт - идеальный язык, чтобы ебашить самый лютый говнокод. Он настолько нестрогий, что даже по сравнению с ним самый последний анон строг, как твоя училка Марья Петровна. Динамическая нестрогая типизация позволяет творить абсолютно любую хуйню, складывать числа со строками, числа с массивами, строки с объектами, передавать в функцию совершенно не то, что она ожидает. Ты можешь обращаться к несуществующим полям объектов или вовсе необъявленным переменным, получая ебучий undefined вместо ошибки. В итоге вся эта хуйня позволяет стрелять в ногу со скоростью овер 9000 раз в секунду, не получая никаких ошибок компиляции, потому что это - интерпретируемый язык, сучки. Если ты накосячил, оно может упадет сразу, а может проработает кучу времени, прежде чем упасть, и хер ты узнаешь заранее.
Этот язык в чистом виде ни на что, кроме как рулить домом не годен, все это уже поняли и придумали typescript(но мне тоже не нравится, но скорее всего потому что я долбоёб)
назви еще какой-то язьік, каким можно писать программьі для телефонов, серверов, iot и браузеров
Ага, прекрасный язык, просто его знают (как минимум в основах) все, вот и тащат куда ни попадя.
1) Нахера один язык подо всё? Вроде бы давно уже все выяснили, что для разных задач разные языки подходят лучше
2) Для всего, кроме браузеров - C/C++. Хотя даже в браузеры, если WebAssembly. Но да, я хардкорен
3) Как частично эмбедер я имею нехилый бугурт по поводу пихания JS в микроконтроллеры. Это просто пиздец.
2) Для всего, кроме браузеров - C/C++. Хотя даже в браузеры, если WebAssembly. Но да, я хардкорен
3) Как частично эмбедер я имею нехилый бугурт по поводу пихания JS в микроконтроллеры. Это просто пиздец.
Ох. Я видел "кровавый энтерпрайз" на плюсах. И очень хочу развидеть.
Поверь, ты не захочешь жить в мире, где все, кроме веба, на плюсах. Потому что в этом мире у тебя не будет и тени уверенности вообще в чем-либо.
Поверь, ты не захочешь жить в мире, где все, кроме веба, на плюсах. Потому что в этом мире у тебя не будет и тени уверенности вообще в чем-либо.
Он очень гибкий.
JS популярный и востребованный язык, кроме того он очень легок в освоении. Практически любой анончик с интеллектом чуть выше среднего может освоить элементарные навыки JS за пару месяцев, и клепать гавно скриптики на фрилансе, зарабатывая при этом 1-2 k баксов в месяц. Именно от этого люто бомбят пердаки у супер тру гик-кодеров, которые учились кодить еще в 1993-м на паскале, знают 20 никому не нужных и забытых языков, и работают наладчиками ЧПУ станков из Чехословакии на местном заборостроительном комбинате, но работают "на настоящем языке программирования, а не на этом вашем тупом говне для школоты"
За пару месяцев. на фрилансе. 1-2k$.
Ясно понятно
Ясно понятно
Сочувствую
[10,9,8,7,6,5,4,3,2,1,0].sort((a,b)=>a-b);
О да, испильзовать es6 для сортировки массива
Вот поэтому js и не любят, потому что это нагромождение костылей из костылей с костылями
Вот поэтому js и не любят, потому что это нагромождение костылей из костылей с костылями
> О да, испильзовать es6 для сортировки массива
Т.е. надо использовать ES3?
Т.е. надо использовать ES3?
Ну да, погорячился, просто у меня незажившая боль от эпохи когда ie был еще стронг и новые стандарты только начали внедряться, в 2018м писать как-то иначе конечно не нужно
Причем тут es6? Можно бы написать так:
[10,9,8,7,6,5,4,3,2,1,0].sort( function(a, b){return a -b;} );
Суть в том, что сортировать можно только объекты, над которыми определена операция сравнения. Это базовые знания информатики. В js массивы могу содержать объекты любого типа. Поэтому способ сравнения элементов нельзя определить по типу элементов. Следовательно необходимо указать компаратор явно. Однако мы видим, что sort работает и без явно указанного компаратора. Отсюда вывод - существует компаратор по-умолчании. Здесь должно возникнуть желание почитать документацию.
https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
[10,9,8,7,6,5,4,3,2,1,0].sort( function(a, b){return a -b;} );
Суть в том, что сортировать можно только объекты, над которыми определена операция сравнения. Это базовые знания информатики. В js массивы могу содержать объекты любого типа. Поэтому способ сравнения элементов нельзя определить по типу элементов. Следовательно необходимо указать компаратор явно. Однако мы видим, что sort работает и без явно указанного компаратора. Отсюда вывод - существует компаратор по-умолчании. Здесь должно возникнуть желание почитать документацию.
https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
Я не понимаю. выглядит нормально. или это потому что я знаю только джаваскрипт?
Выше уже писали. Проблема, что числа сравниваются как строки. Поэтому всё, что начинается с 1, идёт раньше.
999999999999999 // -> 999999999999999
9999999999999999 // -> 10000000000000000
10000000000000000 + 1 // -> 10000000000000000
10000000000000000 + 1.1 // -> 10000000000000002
С этого в своё время долго ржал
9999999999999999 // -> 10000000000000000
10000000000000000 + 1 // -> 10000000000000000
10000000000000000 + 1.1 // -> 10000000000000002
С этого в своё время долго ржал
И еще
0.1 + 0.2 // -> 0.30000000000000004
0.1 + 0.2 // -> 0.30000000000000004
Это норма для всех современных компьютеров (ну почти, есть исключения) и всех языков программировния
https://en.m.wikipedia.org/wiki/Machine_epsilon
https://ru.m.wikipedia.org/wiki/Машинный_ноль
https://en.m.wikipedia.org/wiki/Machine_epsilon
https://ru.m.wikipedia.org/wiki/Машинный_ноль
Ну надо отдать должное, такие финты и в каноничной java есть.
Если бы только JS еще хоть какое-то отношение к этой Java имел...
Но ведь java, да и синтаксис там скобочки всякие
Так он про это и говорит. Что язык совсем из другого места, но поведение такое же.
Два совершенно разных языка.
Java - это достаточно мощный язык со статической типизацией, синтаксически выросший из C++.
Java - это достаточно мощный язык со статической типизацией, синтаксически выросший из C++.
Как раз таки нет. А все потому что в это языке сатаны все числа это double(класс Number). То есть если ты хочешь !ТОЧНУЮ! 64 битную целочисленную арифметику, то тебе придется как всегда качать стороннюю библиотеку (А js'еры ещё и хвастаются как много у них библиотек. Их много потому что сам язык нихера не может)
Java and Javascript are similar like Car and Carpet are similar. (c)
Именно этих - нету. Арифметика целых чисел в java строгая.
Для флоатов подобные ошибки норма просто из-за их двоичного представления. Поэтому любой нормальный девелопер знает, что флоаты нельзя использовать для точных вычислений, например, для подсчета денег(нужно использовать целые плюс порядок).
Но в js, как обычно, все через жопу, и для представления целых чисел используются неточные флоаты...
Для флоатов подобные ошибки норма просто из-за их двоичного представления. Поэтому любой нормальный девелопер знает, что флоаты нельзя использовать для точных вычислений, например, для подсчета денег(нужно использовать целые плюс порядок).
Но в js, как обычно, все через жопу, и для представления целых чисел используются неточные флоаты...
На самом деле JS вполне себе удобный язык, ну да нестрогая типизация это конечно чаще плохо, чем хорошо, но на самом деле в реальной работе все эти мемные операции сложения чисел со строками и шишек с елками встречаются не так часто
Немножко не так. В реальной работе НЕОБХОДИМОСТЬ сложения шишек с ёлками встречается не так часто, а вот само сложение в результате невнимательности попадает в код чаще, чем нужно, и до поры до времени остаётся там незамеченным.
Сам использую scalajs, там статическая типизация.
Сам использую scalajs, там статическая типизация.
'' == 0 // истинно
' ' == 0 // истинно
при этом
'' == ' ' // ложно
Всё очевидно конечно, но выглядит как нарушение принципа транзитивности )
' ' == 0 // истинно
при этом
'' == ' ' // ложно
Всё очевидно конечно, но выглядит как нарушение принципа транзитивности )
Думаю многие уже видели, но я все-таки пошарю. Больше примеров странного поведения нетипизированных языков.
https://www.destroyallsoftware.com/talks/wat
https://www.destroyallsoftware.com/talks/wat
Чтобы написать коммент, необходимо залогиниться