【问题标题】:why the type of a number element in an array is evaluated to be a string in javascript [duplicate]为什么数组中数字元素的类型在javascript中被评估为字符串[重复]
【发布时间】:2016-07-22 14:58:48
【问题描述】:

例如

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

输出

string
string
string

我是一名 Python 程序员,我发现它非常不直观。为什么不将元素评估为数字?

【问题讨论】:

  • for in 将遍历似乎已转换为字符串的键。 Object.keys(a)[0] 将返回 "0"
  • 控制台日志i 你会意识到这不是元素。这是索引。
  • 这样做:var a = [1, 2, 3]; for (var i in a) {console.log(typeof a[i]);},你会看到数字。
  • 我明白了。 var a = [5, 6, 7]; for (var i in a) {console.log(i);} 仍然输出 0 1 2,它们是索引,而不是元素。
  • 请参阅this question and its answers,了解在 JavaScript 中循环遍历数组的方式。 for-in 通常不是正确的(它可以是稀疏数组)。

标签: javascript


【解决方案1】:

您正在循环对象的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);
}

【讨论】:

  • 我认为这很可能是 OP 真正要求的。
【解决方案2】:

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

如果您真的指的是 元素,而不是索引,那么问题在于您只是在查看错误的类型。见KevBot's answer


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

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

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

字符串属性名称 P 是数组索引当且仅当 ToString(ToUint32(P)) 等于 PToUint32(P) 不等于 232 -1.

另见A myth of arrays(在我的博客上)

【讨论】:

    猜你喜欢
    • 2020-02-29
    • 2015-01-17
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多