this post was submitted on 05 Sep 2023
914 points (98.7% liked)

Programmer Humor

18250 readers
1699 users here now

Welcome to Programmer Humor!

This is a place where you can post jokes, memes, humor, etc. related to programming!

For sharing awful code theres also Programming Horror.

Rules

founded 1 year ago
MODERATORS
 
all 46 comments
sorted by: hot top controversial new old
[–] [email protected] 131 points 10 months ago

Looks like they should have called that function sortOf()

[–] [email protected] 37 points 10 months ago (3 children)
[–] [email protected] 9 points 10 months ago

Based on this you can Take Shit even further with jsfuck

[–] [email protected] 3 points 10 months ago* (last edited 9 months ago) (1 children)

"Actually, this one isn't 'Wat', it's part of what makes Ruby awesome and powerful, unless of course you actually do this, at which point it's 'Wat'"

[–] [email protected] 3 points 9 months ago* (last edited 9 months ago)

let's talk about Ruby

Ruby like most programming languages doesn't support bare words, [undefined variable exception]

but if you define a particular method_missing, suddenly Ruby supports bare words. [ruby repeating what was typed]

Now this isn't deserving of wat. this actually shows just how awesome Ruby is. [Drummer_t-rex.jpg]

But if you actually do this then....

Wat

[–] [email protected] 35 points 10 months ago (9 children)

As a non-programmer, why does it do this? Sorting by leftmost digit seems super dumb.

[–] [email protected] 18 points 10 months ago

You can put any type of value in an array in JavaScript. You can have numbers, strings, booleans, arrays, and objects. So what should the default sort function sort by? Sorting by numbers makes sense, but what if it wanted to sort strings instead?

When you don't know what value is in an array ahead of time you can't assume how to sort it. When you're controlling the program you can provide a sort function for the type of values you know will be in it, but when you're writing the standard default sort function, there's only one type that you can convert all the other types to safely and simply in the most predictable way, which is strings.

[–] [email protected] 15 points 10 months ago (1 children)

"By default, the sort() function sorts values as strings.

This works well for strings ("Apple" comes before "Banana").

However, if numbers are sorted as strings, "25" is bigger than "100", because "2" is bigger than "1".

Because of this, the sort() method will produce incorrect result when sorting numbers."

https://www.w3schools.com/js/js_array_sort.asp

[–] [email protected] 8 points 10 months ago

It also produces incorrect results in many languages other than English. You can pass it a compare function that uses localeCompare or Intl.Collator to get a correct alphabetical sort.

[–] [email protected] 14 points 10 months ago

Because it turns everything into text first. Just in case you try to sort [1,"apple",45.99,false,[true,3]] rather than an array of similar things like a normal person.

[–] [email protected] 9 points 10 months ago (1 children)

Because when it's sorting some of them as ints and some of them as strings. JavaScript has implicit conversion to string.

[–] [email protected] 5 points 10 months ago (1 children)

Wrong. JavaScript sort's default comparison function always converts to strings.

[–] [email protected] 3 points 10 months ago (1 children)

Only if one of them is a string right? If you have only numbers then it works fine right? Right? (Please say that I'm right 😭)

[–] [email protected] 5 points 10 months ago* (last edited 10 months ago)

No. It always compares by converting to string. I actually think this is more consistent then having different behaviour if you have a string somewhere in your list.

Basically the default comparator is a.sort((a, b) => `${a}` < `${b}` ? -1 : 1).

[–] [email protected] 9 points 10 months ago (1 children)

Think of digits like you would letters. You're essentially sorting numbers alphabetically. It's not the right way to do it, of course, but it's the natural way to do it using a system like computers use that doesn't necessarily differentiate between digits and letters unless you tell it to specifically.

[–] [email protected] 3 points 10 months ago (1 children)

I think the main shortcoming here is that there isnt a way to specify the type to sort as, instead you have to write the function to compare them as numbers yourself. If it's such a simple implementation, why isn't it officially implemented? Why isn't there a sortAs() that takes two args, the input list, and a Type value? Check every element matches the type and then sort, otherwise return a Type Error.

[–] [email protected] 1 points 10 months ago* (last edited 10 months ago) (1 children)

I mean, there's a sort() method that takes a comparator(a,b) such that if a comes first it returns 1, if b comes first it returns -1 and if they're equivalent wrt sortinf it returns 0. If you absolutely need type safe number sorting you can use that to get it.

[–] [email protected] 2 points 10 months ago (1 children)

Right, but you have to make that comparator yourself, it's not a built-in part of the language. The only built-in comparator converts values to strings and compares them in code units orders.

Also, that technically isnt type-safe, is it? If you threw a string or a NaN at that it would fail. As far as I knew, type safe means that a function can handle type errors itself, rather than throwing an exception. So in this case the function would automatically convert types if it was type-safe to prevent an unhandled exception.

[–] [email protected] 2 points 10 months ago (1 children)

Not every use case can be the built-in default. I wouldn't have made JS weakly typed if I were designing it, but once the decision was made to use weak typing it made sense to either have no default sort method or to have a default sort method that assumes a type.

What I've outlined for you is the interface for a comparator, not the implementation. You can type check and convert and do anything else you want under the hood of the comparator you write.

[–] [email protected] 2 points 10 months ago (1 children)

It doesn't have to be the default to be built in, tho. It could be an overloaded function, having the "default" be the typical convert-to-string sorting, and an overloaded function that allows to specify a type.

It's just such a common thing, wanting to sort a list by different types, that I'm surprised there hasn't been an official implementation added like this. I get that it a simple "fix" to make, but I just think that if it's that simple yet kind of obscure (enough that people are still constantly asking about it) there should be an official implementation, rather than something you have build yourself.

[–] [email protected] 2 points 10 months ago (1 children)

Thats just JS for you. If you're being generous, it's a "quirky" language. If you're being ungenerous, it's a steaming pile of arbitrary decisions, gotchas, unexpected behaviors and problems that no one bothered to solve because there's a workaround.

[–] [email protected] 1 points 10 months ago

Yeah, JS always seemed like the red-headed stepchild of modern languages. I'd be curious to know if other ECMAScript languages like JScript are as, eh, "quirky", suggesting that the ECMA spec is the source of the quirkiness, or if JavaScript itself is the one making silly decisions. Technically, I mostly work with Google's AppScript when I use ECMAScript stuff, but I'm fairly certain AppsScript is based off of JavaScript instead of directly based on the ECMA spec, so I don't think it's separate enough for me to draw a conclusion there.

[–] nero 3 points 10 months ago

It sorts them based on their unicode character, not the actual numbers. 1 is U+0031, 2 is U+0032, etc.

[–] [email protected] 1 points 10 months ago

it's lexicographic order

[–] [email protected] 26 points 10 months ago

Because everyone means "alphabetize" when sorting numbers.

[–] [email protected] 22 points 10 months ago (1 children)

JavaScript was made in 2 days through a drunken stupor, and it shows.

[–] [email protected] 2 points 10 months ago

It's sad to have the rushed ramblings of a bigot become the fundamental block of the modern world wide web. Why couldn't it be at least made by a more competent bigot like Carmack?

[–] [email protected] 4 points 9 months ago

Honestly this being javascript I expected the answer to be

[4, 1, 100000, 30, 21]

(sorted alphabetically by name)

[–] Armand1 4 points 10 months ago (2 children)

As annoying as this is, you are meant to use a comparer.

mapped.sort((a, b) => {
  if (a.value > b.value) {
    return 1;
  }
  if (a.value < b.value) {
    return -1;
  }
  return 0;
});
[–] minikieff 37 points 10 months ago (1 children)
arr.sort((a, b) => a - b);
[–] [email protected] 2 points 10 months ago

One hundred percent how I do it everytime.

[–] [email protected] 5 points 10 months ago

Stuff like that exists to remind us of the Java in JavaScript

[–] [email protected] 1 points 9 months ago (1 children)

As many people have pointed out already, this happens because JavaScript was rushed. But why do we still use a language whose foundation was built in only ten days(!) for scripting on webpages we build today? Why hasn't there been a push for web browsers to support other scripting languages (other than maybe Dart)?

[–] [email protected] 2 points 9 months ago

There has never been a push because JavaScript works well enough.

Many of its mistakes have been rectified in later specifications.

[–] [email protected] 1 points 10 months ago