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一样.
我不知道为什么你认为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)