在JavaScript中,您可以使用整数或字符串来获取和设置数组的索引和对象的“数字”属性,并获得相同的结果:
var a=[], o={};
a[1] = "foo"; a["1"] == "foo" // true
a["2"] = "bar"; a[2] == "bar" // true
a["-3"] = "baz"; a[-.3e1] == "baz" // true
o[1] = "foo"; o["1"] == "foo" // true
o["2"] = "bar"; o[2] == "bar" // true
o["-3"] = "baz"; o[-.3e1] == "baz" // true
虽然字符串和数字是可互操作的 - 但是获取和设置 - 这对于数组和对象来说都更快?
答案 0 :(得分:21)
不出所料,数组访问的整数比字符串快。也许令人惊讶的是,它们也比对象属性的字符串更快。
答案 1 :(得分:0)
我在上面的JSPERF中注意到了两个潜在的问题:
在GET测试中,根本没有使用x的值,因此JIT优化器可能会完全丢弃该表达式
对象和数组都被填充并使用单调递增的值进行访问。 JIT可能会认识到这一点,然后将对象转换为非稀疏数组。
总是使用字符串键初始化查找对象,使用整数键初始化它时,我们也需要进行测试(因为运行时可能具有特殊的路径)。
结果可见here。 请注意,我在早期版本中首先犯了一个错误,我忘记了将随机索引转换为整数,这使得字符串键查找比浮点键查找快得多……
我可能犯了更多的错误,欢迎发表评论:)
PS:在Safari / OSX上进行的几次运行中,非常奇怪的是,从用整数键初始化的对象中读取整数键的性能非常差,但是当用字符串键填充对象并读取它时用整数键返回非常快。这对我来说没有意义?也许我们需要在这里进行更多的测试