在JavaScript对象中使用浮点数作为键是否可以?这种对象不会有潜在的问题吗?
考虑下面的代码:
var obj = {};
obj[1.2345] = 10;
obj[10000] = 10;
obj[10000.23] = 10;
在JavaScript对象中使用浮点数作为键是否可以?这种对象不会有潜在的问题吗?
考虑下面的代码:
var obj = {};
obj[1.2345] = 10;
obj[10000] = 10;
obj[10000.23] = 10;
在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
的用例很重要,但是"正常"属性名称的数量比它们多。