在对象中使用浮点数作为键是否可行?

3

在JavaScript对象中使用浮点数作为键是否可以?这种对象不会有潜在的问题吗?

考虑下面的代码:

var obj = {};
obj[1.2345]   = 10;
obj[10000]    = 10;
obj[10000.23] = 10;

2
除了必须使用方括号表示法访问属性之外,没有其他例外。 - Johan
1
如果你要用两种方式陈述你的问题,最好不要让它们成为彼此的反义词。例如,对于“在JavaScript对象中使用浮点数作为键是否可以?”这个问题的答案大多是“是”,但对于“这样的对象可能会有潜在问题吗?”这个问题的答案大多是“否”。 - T.J. Crowder
1个回答

11

在JavaScript对象中使用浮点数作为键(keys)可以吗?

可以,大部分情况下可以。所有属性名称(键)都是字符串*(即使我们认为它们是JavaScript标准数组中的数组索引,因为它们并不是真正的数组)。所以,当你写出以下代码时:

obj[1.2345] = 10;

你实际上所写的是:

obj[String(1.2345)] = 10;

例如

obj["1.2345"] = 10;

在对象中使用名为1.2345(作为字符串)的属性完全没有问题。

我之前说“大多数情况下”是因为JavaScript(以及大多数其他语言)使用的浮点数并不是完全精确的,所以如果你这样做:

obj[0.3] = 10;

然后

var key = 0.1;
key += 0.2;
console.log(obj[key]); // undefined
那是未定义的,因为0.1 + 0.2的结果为0.30000000000000004,而不是0.3,并且您的对象没有名为0.30000000000000004的属性。

* "...所有属性名称都是字符串..." 这在ES5之前是正确的,但从ES2015(也称为ES6)开始,有一种新的属性名称类型:Symbol。但大多数属性都有字符串名称,Symbol的用例很重要,但是"正常"属性名称的数量比它们多。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接