Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 浮点数组索引是如何解释的?_Javascript_Arrays_Indexing_Floating Point - Fatal编程技术网

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。