Javascript 浮点数组索引是如何解释的?
我找不到这方面的任何信息,但假设我找到了Javascript 浮点数组索引是如何解释的?,javascript,arrays,indexing,floating-point,Javascript,Arrays,Indexing,Floating Point,我找不到这方面的任何信息,但假设我找到了 var arr = [1, 2, 3]; var x = arr[1.5]; 我假设Javascript将floor索引并返回索引1处的项,但至少在Chrome中,它似乎只返回未定义的 这是正确的吗?我找不到任何标准或文件证实这一点。如果是这样的话,实际上是很不方便的,因为我假设向下取整行为允许您将[0,n]范围内的任何浮点传递给数组索引,但是如果您进行未取整的浮点运算,您似乎会悄悄地打断数组 编辑:如果有人在维护一个javascript陷阱列表,请添
var arr = [1, 2, 3];
var x = arr[1.5];
我假设Javascript将floor
索引并返回索引1处的项,但至少在Chrome中,它似乎只返回未定义的
这是正确的吗?我找不到任何标准或文件证实这一点。如果是这样的话,实际上是很不方便的,因为我假设向下取整行为允许您将[0,n]范围内的任何浮点传递给数组索引,但是如果您进行未取整的浮点运算,您似乎会悄悄地打断数组
编辑:如果有人在维护一个javascript陷阱列表,请添加这个。现在我必须检查10000行javascript代码,看看我的假设在哪里悄悄地导致了错误!这是意料之中的,因为js将索引转换为字符串并访问对象属性(因为对象属性索引总是字符串),因此它将实际查找arr['1.5']
对于那些不相信的人来说,相关部分是15.4,它清楚地将数组索引定义为字符串。我不知道为什么你认为Chrome在访问数组时会“舍入”或“舍入”值,但它根本没有这样做。Firefox也没有。它只是访问一个“键”不存在,并且两个浏览器都正确返回未定义的值(至少在我正在测试的最新版本中)。
由于数组
也是ECMAscript中的对象
,因此您只需访问键名1.5
后面的值
我真的认为我应该再指出一点。数组
只是一个对象
(它也继承自对象
),具有.length
属性和一些附加的方法。没有像C/C++中那样的数字数组访问。它只是访问对象的键名
var foo = [1,2,3];
foo instanceof Array; // true;
foo instanceof Object; // true;
根据,数组项实际上是属性,属性由字符串标识
因此,访问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'
访问项不同,因此索引不会转换为数字
我在InternetExplorer和Chrome上也测试了这一点,它们都和Firefox做得一样
var arr = [];
arr[0] = "hello";
alert(arr["0"]);
Output : hello
在JavaScript中,每当索引数组元素时,JavaScript解释器都会将索引转换为字符串,然后将其用作键。这与在java中使用键-值对哈希映射相同
arr[5-"5"]
在这种情况下,首先计算数学表达式,然后将结果转换为字符串并用作键。其工作原理如下:
解释器将“5”转换为整数,因为“-”运算符不能用于字符串,然后从左操作数5中减去它,得到结果0
然后将结果转换为字符串并用作键。FWIW这是如何计算的obj[…]
:我认为这一部分更相关:javascript中是否真的有一条规则说“如果数组索引是整数,将其保留为数字,但如果它不是整数,则将其转换为字符串”?@AshleysBrain:ecmascript中没有真正的数字数组访问权限。正如我在回答中指出的,这些“数字”也只是对象键。@AshleyBrains。不,索引总是在查找之前转换为字符串。例如a=[42];a['0']
的计算结果为42
@AshleyBrain:实际上它们都是作为字符串访问的,因此访问arr[1]
与arr['1']
是一样的。然而,还是有一些“魔力”在<代码>长度和 toStult,因此他们只考虑整个数的项目。@ AsHysSLime:我不会这样说。同样,数组只是<代码>对象<代码> > <代码>。长度 属性和一些特殊方法。当然,但是这不是引擎盖下发生的问题。我只是解释了JavaScript是如何运行的。我想,我猜从C++背景中,我已经假设ARR[F]隐式地将F转换成整数。ouCH。