【发布时间】:2018-07-29 03:56:52
【问题描述】:
在 Javascript 中,可以使用数字(整数)或字符串(或字符)来索引数组,例如:
array[0] = true;
或
array['0'] = true;
计算机内存的工作方式是否会因您对数组的索引方式而有所不同,还是两种方式都一样?
【问题讨论】:
标签: javascript arrays string integer
在 Javascript 中,可以使用数字(整数)或字符串(或字符)来索引数组,例如:
array[0] = true;
或
array['0'] = true;
计算机内存的工作方式是否会因您对数组的索引方式而有所不同,还是两种方式都一样?
【问题讨论】:
标签: javascript arrays string integer
答案很简单:没有区别。
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]);
【讨论】:
索引在内部存储为字符串。
但更常见的做法是使用数字通过索引访问数组。
一个属性名称 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');
【讨论】:
正如 mdn 文档所述,https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array
数组实际上只是具有类似数组属性的对象。 JavaScript 中的键是字符串。所以当你看到一个数组时,它实际上只是一组键值对,其中的键是索引号。
数组是一种特殊的数据类型。添加与可能的索引不相关的键会被添加到“对象属性集合”中,并且不会在您使用该对象时返回。
我认为 chrome 控制台在显示这个方面做得最好:
这个数组实际上是一个对象,其键为0 1 2 3、length 属性和原型。
【讨论】:
当您使用引号进行索引时,您将在数组中创建一个键值对。我建议您坚持使用数字符号,除非您有意创建这些对;虽然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);
【讨论】: