idle_zealot 15 hours ago

Huh. I always thought that JS objects supported string and number keys separately, like lua. Nope!

  [Documents]$ cat test.js
  let testArray = [];
  testArray[0] = "foo";
  testArray["0"] = "bar";
  console.log(testArray[0]);
  console.log(testArray["0"]);
  [Documents]$ jsc test.js
  bar bar
  [Documents]$
  • nvlled 10 hours ago

    Lua supports even functions and objects as keys:

      function f1() end
      function f2() end
      local m1 = {}
      local m2 = {}
      local obj = {
          [f1] = 1,
          [f2] = 2,
          [m1] = 3,
          [m2] = 4,
      }
      print(obj[f1], obj[f2], obj[m1], obj[m2], obj[{}])
    
    Functions as keys is handy when implementing a quick pub/sub.
  • aidenn0 15 hours ago

    They do, but strings that are numbers will be reinterpreted as numbers.

    [edit]

      let testArray = [];
      testArray[0] = "foo";
      testArray["0"] = "bar";
      testArray["00"] = "baz";
      console.log(testArray[0]);
      console.log(testArray["0"]);
      console.log(testArray["00"]);
    • minitech 14 hours ago

      That example only shows the opposite of what it sounds like you’re saying, although you could be getting at a few different true things. Anyway:

      - Every property access in JavaScript is semantically coerced to a string (or a symbol, as of ES6). All property keys are semantically either strings or symbols.

      - Property names that are the ToString() of a 31-bit unsigned integer are considered indexes for the purposes of the following two behaviours:

      - For arrays, indexes are the elements of the array. They’re the properties that can affect its `length` and are acted on by array methods.

      - Indexes are ordered in numeric order before other properties. Other properties are in creation order. (In some even nicher cases, property order is implementation-defined.)

        { let a = {}; a['1'] = 5; a['0'] = 6; Object.keys(a) }
        // ['0', '1']
      
        { let a = {}; a['1'] = 5; a['00'] = 6; Object.keys(a) }
        // ['1', '00']