所以这是一个有趣的...当我在一个元素上测试 setAttribute 与普通属性集的性能时,我发现了一个奇怪的行为,然后我在常规对象上进行了测试......它仍然很奇怪!
因此,如果您有一个对象A = {}
,并且您将其属性设置为A['abc_def'] = 1
, 或A.abc_def = 1
,它们基本上是相同的。但是,如果你这样做A['abc-def']
= 1 或A['123-def']
= 1,那么你就有麻烦了。它变得更慢了。我在这里设置了一个测试:http: //jsfiddle.net/naPYL/1/。它们在除 chrome 之外的所有浏览器上都相同。有趣的是,对于“abc_def”属性,chrome 实际上比 Firefox 和 IE 快得多,正如我所料。但是对于“abc-def”,它至少慢了一倍。
所以基本上这里发生的事情(至少从我的测试中)是,当对属性使用“正确”语法时(合法的 C 语法,你可以使用点属性) - 它很快,但是当你使用需要使用括号的语法时(a [...]) 那么你就有麻烦了。
我试图想象什么实现细节会以这种方式区分两种模式,但不能。因为在我看来,如果您确实支持那些非标准名称,那么您可能会将所有名称转换为相同的机制,其余的只是编译到该机制中的语法。所以 。编译后语法和 [] 应该都是一样的。但很明显,这里有一些事情正在发生相反的情况......
不看 V8 的源代码,谁能想到一个真正令人满意的答案?(把它想象成一个练习:-))
感谢 NDM 的 jsperf 示例!
编辑:
为了澄清,我当然还想从真实代码(我已经找到)中得到一个具体的答案,或者更准确地说——具体实现背后的原因。这就是我要求您将其视为“练习”的原因之一,以查看技术实现的背后并尝试找出原因。
但我也想看看其他人的思想在这种情况下是如何运作的。对你们中的一些人来说,这可能听起来“模糊”——但不时尝试像其他人一样思考,或接受他们的观点是非常有用的。它增强了你自己的思维方式。