为什么数组中数字元素的类型被计算为javascript中的字符串
why the type of a number element in an array is evaluated to be a string in javascript
例如
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。
另请参阅数组的神话(在我的博客上)。
- 从JSON数组计算javascript中的日期差异
- 计算JavaScript中的时间差异(天+小时+分钟+秒)
- 计算 JavaScript 中数组中元素的出现次数
- 计算JavaScript中句子(数组)中字符(数组)的出现次数
- 计算javascript对象中的出现次数
- 计算 JavaScript 的问题
- 简单计算 - JavaScript
- 计算 Javascript 数组索引的出现次数
- 计算 JavaScript 数组中对象的出现次数
- 很难计算Javascript的总数
- 计算 JavaScript 中数组中元素的频率
- 计算 javascript 中的 http 请求数
- 用于计算 JavaScript 中字符串的正则表达式
- 计算 JavaScript 中以 ISO 8859-7 编码的文件的字节大小
- 借助firebug或IE 8调试器或chrome调试器来计算javascript函数流的方法
- 如何计算javascript中登录尝试的最大次数
- 如何计算javascript html字符串变量中的行数
- 使用Date对象计算Javascript执行速度是否正确
- 计算JavaScript对象中属性百分比的变化
- 如何计算Javascript中字符串之间的时差?