我找不到任何关于此的信息,但假设我有
var arr = [1, 2, 3];
var x = arr[1.5];
我认为Javascript会floor
索引并返回索引1处的项目,但至少在Chrome中它似乎只返回undefined
。
这是对的吗?我找不到任何证实这一点的标准或文件。这实际上真的很不方便,因为我假设向下舍入行为允许你将范围[0,n)中的任何浮点数传递给数组索引,但是如果你做浮点数学运算,你似乎会默默地破坏你的数组不圆润。
编辑:如果有人在维护javascript陷阱列表,请添加此列表。现在我必须查看10k行的javascript代码,看看我做出的这个假设在哪里悄然造成错误!
答案 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 - ;然后将结果转换为字符串并用作键。