Javascript 按字符串或整数访问数值属性更快?
在JavaScript中,您可以使用整数或字符串获取和设置数组的索引以及对象的“数值”属性,并获得相同的结果:Javascript 按字符串或整数访问数值属性更快?,javascript,performance,Javascript,Performance,在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[
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
虽然字符串和数字对于获取和设置都是可互操作的,但速度更快(对于数组和对象而言)?毫不奇怪,整数对于数组访问比字符串更快。也许令人惊讶的是,对于对象属性,它们也比字符串快
我注意到上面的JSPERF中有几个潜在的问题:
- 在GET测试中,根本不使用x的值,因此JIT优化器可能会完全放弃该表达式
- 对象和数组都用单调递增的值填充和访问。JIT可能会识别出这一点,并将对象转换为非稀疏数组
- 查找对象总是使用字符串键初始化的,当使用整数键初始化它时,我们还需要一个测试(因为运行时可能有一个特殊的路径)
PS:在Safari/OSX上使用did进行的几次运行中,非常奇怪的是,从使用整数键初始化的对象中读取整数键执行得非常糟糕,但是当使用字符串键填充对象并使用整数键读回对象时,速度非常快。这对我来说没有意义?也许我们需要在这里进行更多的测试运行键实际上可以是任何东西,而不仅仅是整数或字符串。@MikeChristensen不完全正确,其他对象被转换为字符串。为了演示它:
varo={},a=[];o[a]=2;警报(o[“”])
整数也会转换为字符串。也就是说a[1]
和a[“1”]
占用同一个插槽。对于对象o[{}]
和o[“[对象对象]”]
也占用相同的空间这是一个微观优化问题,真的获得了这么多的选票吗?@JuanMendes如果可能的话,你也可以说字符串被转换成整数<代码>变量a=[];a[“42”]=1;a、 长度==43问得好,回答得好。我敢打赌,这很快就会融入我的JS内容中。对我来说,这是令人惊讶的,因为数组扩展了对象,对象通过字符串访问键。所以我假设整数必须转换成字符串才能进行散列。但是可能对整数进行了一些优化(也许整数就是散列)@Jay:Chrome平均来说是最好的——条越长,浏览器的性能越好。:)@埃利奥特·博纳维尔:那是有道理的,我认为x轴就是时间。