为什么数组中数字元素的类型被计算为javascript中的字符串

why the type of a number element in an array is evaluated to be a string in javascript

本文关键字:计算 javascript 字符串 类型 数字 元素 为什么 数组      更新时间:2023-09-26

例如

var a = [1, 2, 3];
for (var i in a) {
    console.log(typeof i);
}

输出

string
string
string

我是一名Python程序员,我觉得这很难理解。为什么一个元素不被计算为一个数字?

您正在对象的keys上循环。这意味着您实际测试的密钥是"0"、"1"、"2"。

如果您也控制台i,您可以在这里看到这一点。此外,如果您控制台位于数组中该索引处的值,并对其进行测试,您将看到它是一个数字:

var a = [1, 2, 3];
for (var i in a) {
  console.log(i, typeof i, a[i], typeof a[i]);
}

在ES5中,一个新特性被添加到数组中,该数组循环遍历其值(和索引):Array#forEach:

var a = [1, 2, 3];
a.forEach(function(v) {
  console.log(v, typeof v);
});

在ES2015+中,添加了for-of,它将使用for风格的循环遍历值:

// ES2015+ only!!
let a = [1, 2, 3];
for (let v of a) {
  console.log(v, typeof v);
}

为什么数组中数字元素的类型在javascript 中被评估为字符串

如果你真正指的是元素,而不是索引,那么问题是你只是看错了东西的类型。查看KevBot的答案。


如果你问为什么索引(0、1和2)是字符串而不是数字,因为数组索引通常是数字,这是因为JavaScript中的标准数组根本不是真正的数组,它们只是具有一些特殊行为的对象:

Array对象是一个特殊对象,它对数组索引属性键进行特殊处理(请参见6.1.7)。属性名称为数组索引的属性也称为元素。每个Array对象都有一个length属性,其值总是小于232的非负整数。length属性的值在数字上大于其名称为数组索引的每个自己的属性的名称;无论何时创建或更改Array对象的自身属性,都会根据需要调整其他属性以保持此不变。具体地说,每当添加自己的属性(其名称是数组索引)时,如果需要,length属性的值就会被更改为比该数组索引的数值多一个;并且每当length属性的值改变时,其名称是其值不小于新长度的数组索引的每个自身属性都被删除。此约束仅适用于Array对象的自身属性,不受length或可能从其原型继承的数组索引属性的影响。

在ES2015之前,所有对象属性名称都是字符串。(现在它们可以是字符串或符号。)数组索引只是符合特定定义的属性名称:

字符串属性名p是数组索引,当且仅当ToString(ToUint32(P))等于p并且ToUint32(P)不等于232-1。

另请参阅数组的神话(在我的博客上)