如何解释浮点数组索引?

时间:2011-07-11 11:16:48

标签: javascript arrays indexing floating-point

我找不到任何关于此的信息,但假设我有

var arr = [1, 2, 3];
var x = arr[1.5];

我认为Javascript会floor索引并返回索引1处的项目,但至少在Chrome中它似乎只返回undefined

这是对的吗?我找不到任何证实这一点的标准或文件。这实际上真的很不方便,因为我假设向下舍入行为允许你将范围[0,n)中的任何浮点数传递给数组索引,但是如果你做浮点数学运算,你似乎会默默地破坏你的数组不圆润。

编辑:如果有人在维护javascript陷阱列表,请添加此列表。现在我必须查看10k行的javascript代码,看看我做出的这个假设在哪里悄然造成错误!

4 个答案:

答案 0 :(得分:13)

根据MDN: Array,数组项实际上是属性,属性由字符串标识。

访问arr[1.5]因此与访问arr['1.5']相同,而Firefox实际上也是这样做的。

此代码:

var x = [0,1,2,3,4,5];

x[1.5] = 42;

alert(x);
alert(x['1.5']);
alert(x['1.50']);

输出:

 0, 1, 2, 3, 4, 5
 42
 undefined

因此,使用浮点值访问的项是由数字的字符串表示形式标识的属性。请注意,使用'1.50'访问项目与使用'1.5'访问项目不同,因此索引不会转换为数字。

我在Internet Explorer和Chrome中测试过它们,它们都和Firefox一样。

答案 1 :(得分:7)

我不知道为什么你认为Chrome会在访问Array时“舍入”或“降低”该值,但它根本不会这样做。 Firefox也没有。它只是访问一个不存在的“密钥”,两个浏览器都正确返回undefined值(至少在我正在测试的最新版本中)。
由于ECMA脚本中Arrays也是Objects,因此您只需访问关键字1.5背后的值。

我真的认为我应该多指出一点。 Array只是Object(它也继承自Object),具有.length属性和一些添加的方法。没有像C / C ++那样的数字数组访问。它只是访问一个对象的键名。

var foo = [1,2,3];

foo instanceof Array; // true;
foo instanceof Object; // true;

答案 2 :(得分:6)

这是预期的,因为js将索引转换为字符串并访问对象属性(因为对象属性索引总是字符串),所以它实际上会查找arr['1.5']

对于那些非信徒,the standard的相关部分是15.4,它明确地将数组索引定义为字符串。

答案 3 :(得分:0)

var arr = [];
arr[0] = "hello";
alert(arr["0"]);
Output : hello

在JavaScript中,每当索引数组元素时,JavaScript解释器将索引转换为字符串,然后将其用作键。这与在java中使用键值对Hash Map相同。

arr[5-"5"]

在这种情况下,首先计算数学表达式,并将结果转换为字符串并用作键。这是它的工作原理:

&LT 1为卤素;解释器将“5”转换为整数,因为“ - ”运算符不能与字符串一起使用,然后从左操作数5中减去它以得到结果0.

&LT 2 - ;然后将结果转换为字符串并用作键。