如何解释浮点数组索引?

Ash*_*ain 15 javascript arrays floating-point indexing

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

var arr = [1, 2, 3];
var x = arr[1.5];
Run Code Online (Sandbox Code Playgroud)

我假设Javascript floor是索引并返回索引1处的项目,但它似乎至少在Chrome中返回undefined.

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

编辑:如果有人正在维护javascript陷阱列表,请添加此一个.现在我要查看10k行的javascript代码,看看我做出的这个假设在哪里悄悄导致错误!

Guf*_*ffa 15

根据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']);
Run Code Online (Sandbox Code Playgroud)

输出:

 0, 1, 2, 3, 4, 5
 42
 undefined
Run Code Online (Sandbox Code Playgroud)

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

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


jAn*_*ndy 7

我不知道为什么你认为Chrome会在访问时"舍入"或"降低"该值Array,但它根本不会这样做.Firefox也没有.它只是访问一个不存在的"密钥",两个浏览器都正确地返回undefined值(至少在我正在测试的最新版本中).
由于Arrays也在ObjectsECMAscript中,您只是访问键名后面的值1.5.

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

var foo = [1,2,3];

foo instanceof Array; // true;
foo instanceof Object; // true;
Run Code Online (Sandbox Code Playgroud)


dav*_*vin 6

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

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

  • javascript中是否有一条规则说"如果数组索引是整数,请将其保留为数字,但如果它不是整数,则将其转换为字符串"? (2认同)