• fidodo@lemm.ee
      link
      fedilink
      arrow-up
      4
      ·
      1 year 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.

    • Alien Nathan Edward@lemm.ee
      link
      fedilink
      arrow-up
      2
      ·
      1 year ago

      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.

    • Blackmist@feddit.uk
      link
      fedilink
      English
      arrow-up
      1
      ·
      1 year 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.

    • KiofKi@feddit.de
      link
      fedilink
      arrow-up
      1
      ·
      1 year ago

      "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

      • floofloof@lemmy.ca
        link
        fedilink
        English
        arrow-up
        1
        ·
        1 year 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.

    • jormaig@programming.dev
      link
      fedilink
      arrow-up
      0
      ·
      1 year ago

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

      • kevincox@lemmy.ml
        link
        fedilink
        arrow-up
        2
        ·
        1 year ago

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

        • jormaig@programming.dev
          link
          fedilink
          arrow-up
          1
          ·
          1 year ago

          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 😭)

          • kevincox@lemmy.ml
            link
            fedilink
            arrow-up
            2
            ·
            edit-2
            1 year 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).