3 ms·
Javascript thinks that 11 < 3 but its still kinda useful anyway from time to time: > [11,9,1,3].sort() [ 1, 11, 3, 9 ]
by aftbit 2y ago
Javascript thinks that 11 < 3 but its still kinda useful anyway from time to time:
> [11,9,1,3].sort()
[ 1, 11, 3, 9 ]
- oneeyedpigeon 2y agoYou're getting downvoted because your blatant attempt at language wars has a very simple, logical explanation. If you wanted to use a 'gotcha', there are far better examples.
- aftbit 2y agoI was not making an attempt at language wars. I think JS is a perfectly fine language for what it does, warts and all. I was being a bit flippant with my language, but my intent was to point out that `9.11 > 9.8` is not just an LLM thing, and that people who are quick to dismiss LLM usefulness based on contrived math examples do not apply the same rationale to other systems. I do think that JavaScript's choice to sort numbers lexicographical instead of arithmetically is a bit silly, but of course no language is free from warts. Of course they cannot change it now, because that would break the web. `JSON.stringify` is also pretty silly while we're at it, but Python's `json.dumps` is no better.
- recursive 2y agoIf you want to know whether javascript thinks `11 < 3`, then just evaluate it directly. There is lots of dumb stuff in JS IMO, but be honest about it.
- aftbit 2y agoSure, the real gotcha here is that this: const list = [3, 11] list.sort() console.log(list[0] < list[1]) logs `false`. JavaScript doesn't "think" anything but its native sort function doesn't do what many people expect it would when called on a list of pure numbers. If you found this behavior intuitive and unsurprising the first time you saw it, then your brain works differently than mine. If this happens to be new to you (congrats on being one of today's 10,000), the reason is that JavaScript sorts by converting all elements to UTF-16 strings, except for `undefined` for some reason, which always sorts last. The MDN docs have a very clear explanation. I have been unable to find a historical explanation of why this choice was made, but I presume the initial JS v1 author either had a good reason or just really didn't expect that their language would outlive the job for which it was written. If this is a bug for you, you can provide a comparison function explicitly and the typical is something like: list.sort((a,b)=>a-b) Somewhat puzzlingly, this will "work" even on lists with mixed number and string like: const list = [3, "11", 1, "2", 9, 23] list.sort((a,b)=>a-b) console.log(list) [ 1, '2', 3, 9, '11', 23 ] Because JavaScript goes out of its way to make comparisons like 3 < "11" or "3" < 11 work in the numeric domain. JS only uses string comparison when both sides are strings.
- recursive 2y agoI do not think it's intuitive. The reason it works for mixed arrays is that the minus operator coerce operands to numbers. However if the strings fail to convert to a numeric value, the output is arguably even less sensible. I'd imagine that's why it is. It may have been thought that js would be more likely to be dealing with strings arrays.