Javascript 为什么在删除属性之前使用点符号检查属性要比直接删除属性快?
我问了,结果是当从元素中删除属性时,首先使用Javascript 为什么在删除属性之前使用点符号检查属性要比直接删除属性快?,javascript,performance,dom,syntax,conditional,Javascript,Performance,Dom,Syntax,Conditional,我问了,结果是当从元素中删除属性时,首先使用elem.xxx检查元素是否存在==未定义的使运行时更快 为什么更快?还有更多的代码需要处理,无论您采用哪种方法,都必须遇到removeAttribute()方法。好吧,首先您需要知道的是elem.xxx与elem.getAttribute()或与属性相关的任何其他方法不同 elem.xxx是DOM元素的一个属性,而DOM中HTML上的attribute和element既相似又不同。例如,以这个DOM元素:为例,这个代码: //Let say var
elem.xxx检查元素是否存在==未定义的
使运行时更快
为什么更快?还有更多的代码需要处理,无论您采用哪种方法,都必须遇到
removeAttribute()
方法。好吧,首先您需要知道的是elem.xxx
与elem.getAttribute()
或与属性相关的任何其他方法不同
elem.xxx
是DOM元素的一个属性,而DOM中HTML上的attribute和element既相似又不同。例如,以这个DOM元素:
为例,这个代码:
//Let say var a is the <a> tag
a.getAttribute('href');// == #
a.href;// == http://www.something.com/# (i.e the complet URL)
//假设var a是标记
a、 getAttribute('href');//==#
a、 href;//==http://www.something.com/# (即完整的URL)
但是让我们使用一个自定义属性:
//假设var a是标记
a、 getAttribute('custom');//==测试
a、 自定义;//==未定义
因此,你无法真正比较两者的速度,因为它们没有达到相同的结果。但是一个明显更快,因为属性是一个快速访问数据的属性,而属性使用get/hasaAttribute DOM函数
现在,为什么没有条件会更快?仅仅因为removeAttribute
不关心属性是否丢失,它就会检查属性是否丢失
因此,在
removeAttribute
之前使用hasAttribute
类似于执行两次检查,但条件稍微慢了一点,因为它需要检查是否满足条件才能运行代码。我怀疑速度提升的原因是跟踪树
痕量树是由尔湾加利福尼亚大学的Andreas Gal和Michael Franz在其论文中首次提出的。 在他的博客文章Andreas Gal(论文的合著者)中,他解释了跟踪实时编译器是如何工作的
为了尽可能有条理地解释跟踪JIT编译器(因为我对该主题的了解并不深入),跟踪JIT编译器执行以下操作:if
语句的分支的true
次数)
现在让我们看看你的代码,了解什么导致了速度提升:
测试用例1:检查 此代码具有代码路径(即if
语句)。记住,跟踪JIT只优化代码路径,而不是整个函数。这就是我认为正在发生的事情:
hasAttribute
的额外函数调用的开销,该函数不是JIT编译的,因为它不是条件代码路径(大括号之间的代码)的一部分elem.xxx
或undefined
的数据类型不会每次迭代都改变,因此这种优化使得条件检查更快当然,这只是我的猜测。我不知道JavaScript引擎的内部结构,因此我的答案不是规范的。然而,我认为这是一个很有根据的猜测。你的证明是错误的
elem.class!==未定义的
总是计算为false
,因此永远不会调用elem.removeAttribute(“类”)
,因此,此测试将总是更快
elem
上要使用的正确属性是className
,例如:
typeof elem.className !== "undefined"
正如Karl AndréGagnon指出的,访问[本机]JavaScript属性和调用DOM函数/属性是两种不同的操作 一些DOM属性通过;这些属性与adhoc JS属性不同,需要DOM访问。而且,即使DOM属性是公开的,但与DOM属性没有严格的关系 例如,
inputElm.value=“x”
将不会更新DOM属性,即使元素将显示并报告更新的值。如果目标是处理DOM属性,唯一正确的方法是使用hasaAttribute/setAttribute
等
我一直致力于为不同的函数调用导出一个“公平”的微基准,但这相当困难,而且会发生很多不同的优化。这里,我将用它来论证我的观点 请注意,没有
if
或removeAttribute
来混淆结果,我只关注DOM/JS属性访问。而且,我试图统治
if (elem.hasAttribute("xxx")) {
elem.removeAttribute("xxx");
}
elem.removeAttribute("xxx");
if (elem.xxx !== undefined) {
elem.removeAttribute("xxx");
}
typeof elem.className !== "undefined"