【问题标题】:What is the difference between using a string or a number to index an array in Javascript? [duplicate]在Javascript中使用字符串或数字索引数组有什么区别? [复制]
【发布时间】:2018-07-29 03:56:52
【问题描述】:

在 Javascript 中,可以使用数字(整数)或字符串(或字符)来索引数组,例如:

array[0] = true;

array['0'] = true;

计算机内存的工作方式是否会因您对数组的索引方式而有所不同,还是两种方式都一样?

【问题讨论】:

    标签: javascript arrays string integer


    【解决方案1】:

    答案很简单:没有区别。

    Javascript 数组是对象。对象的所有键都是字符串(或符号),但绝不是数字。

    属性名称必须是字符串。这意味着非字符串对象 不能用作对象中的键。任何非字符串对象,包括 一个数字,通过 toString 方法转换为字符串。 ...see more here

    属性访问器[] 在查找属性之前首先转换为string。 (某些引擎可能会优化此步骤,并且不会执行正确的toString 调用,但这里没有问题)

    所以array[0] 被解释为array['0']

    const a = {
        toString: function () {
            console.log("a.toString called")
            return "1";
        }
    };
    
    const array = ['a','b','c'];
    console.log(array[a]);

    【讨论】:

      【解决方案2】:

      索引在内部存储为字符串。
      但更常见的做法是使用数字通过索引访问数组。

      一个属性名称 P(以字符串值的形式)是一个数组索引,如果 并且仅当 ToString(ToUint32(P)) 等于 P 而 ToUint32(P) 不等于 等于 2^³²−1

      this old post中有解释

      下面是一个展示它的sn-p。
      只要索引字符串只包含数字,使用字符串访问索引就可以正常工作。
      但是通过将索引表示为一个单词,则只能使用该单词访问它。并且控制台记录数组不会显示它。

      let arr = [0,'a one','a two','a three'];
      arr['four'] = 'a four';
      arr.push('5');
      arr.push(6);
      arr.push([7,'7']);
      arr.push({a:8, b:'8'});
      
      
      console.log('\nLog the array:\n\n');
      console.log(arr);
      
      console.log('\nAccessing the array:\n\n');
      console.log("arr[0]:\t" + arr[0]);
      console.log("arr[\'1\']:\t" + arr['1']);
      console.log("arr[\'two\']:\t" + arr['two']);
      let i=2;
      console.log("arr[++i]:\t" + arr[++i]);
      console.log("arr[\'four\']:\t" + arr['four']);
      console.log('arr[4]:\t'+ arr[4]);
      console.log('arr[5]:\t'+ arr[5]);
      
      console.log('\nListing the types in the array:\n\n');
      for (var a in arr) console.log(a+'\tindex type: '+ typeof a +', value: '+ arr[a] + ', value type: '+ typeof arr[a]);

      这里有一个 sn-p 来比较在浏览器中使用数字或字符串的速度。它应该花费大致相同的时间。

      let arr1 = [];
      console.time('Access array through string');
      for(let i = 0; i <= 42000000;i++){
       arr1['42000000'] = 42;
      }
      console.timeEnd('Access array through string');
      
      let arr2 = [];
      console.time('Access array through integer');
      for(let i = 0; i <= 42000000;i++){
       arr2[42000000] = 42;
      }
      console.timeEnd('Access array through integer');

      【讨论】:

        【解决方案3】:

        正如 mdn 文档所述,https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array

        数组实际上只是具有类似数组属性的对象。 JavaScript 中的键是字符串。所以当你看到一个数组时,它实际上只是一组键值对,其中的键是索引号。

        数组是一种特殊的数据类型。添加与可能的索引不相关的键会被添加到“对象属性集合”中,并且不会在您使用该对象时返回。

        我认为 chrome 控制台在显示这个方面做得最好:

        这个数组实际上是一个对象,其键为0 1 2 3length 属性和原型。

        【讨论】:

          【解决方案4】:

          当您使用引号进行索引时,您将在数组中创建一个键值对。我建议您坚持使用数字符号,除非您有意创建这些对;虽然array['0'] 在技术上发布到该职位,但这是不好的做法。

          尽管myArr['two'] 似乎不想出现在 sn-p 输出中,但如果您点击F12 并查看控制台输出,您会清楚地看到它显示出来。

          ["String 0", "String 1", two: "String 2"]

          let myArr = [];
          myArr[0] = "String 0";
          myArr['1'] = "String 1";
          myArr['two'] = "String 2";
          
          console.log(myArr);

          【讨论】:

          • 是的,如果您使用的字符串不计算为数字,就会发生这种情况。
          • 数组已经是 JavaScript 中的对象了。
          • 为什么当你使用一个不等于数字的字符串时,你在调用整个数组时看不到它,但是当像这样 myArr['two'] 调用它时,它确实出现了?
          猜你喜欢
          • 1970-01-01
          • 2011-02-26
          • 2021-02-10
          • 2011-09-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-12
          相关资源
          最近更新 更多