在jQuery中添加属性时,使用attr()方法,将属性作为键值对象传递,还是直接传递,哪种方法执行速度最快?
Which method performs fastest while adding an attribute in jQuery, using attr() method, passing attributes as a key-value object, or direct?
我知道在jQuery中添加包含相对链接的href属性的三种方法:使用(1).attr(),(2)属性作为参数中的键值对,或(3)直接编写(您可能知道其他方法,请告诉您的答案以便我学习)。
- 使用.attr ()
使用此方法,结果将如下所示:
var link = "relative-link.html";
$("<a/>").attr("href",link);
- 使用参数
:
var link = "relative-link.html";
$("<a/>", {href: link});
- 直接
:
var link = "relative-link.html";
$("<a href=" + link + ">");
那么,这些方法中哪个性能更快呢?为什么我应该选择一种方法而不是其他方法。还要考虑添加其他属性,如class
,以及在一次添加多个属性时应该首选哪种方法。
请告诉我哪种方法更好,在哪种情况下有适当的推理。谢谢!
这实际上是一个有趣的问题。我在github上查看了jQuery的代码,并建议您应该在这里查看纯粹的学习目的(以及这里的文档)
这是我的发现
方法在创建元素时调用,即当您将$(".....")
写入init
时。代码在这里。它内部使用parseHTML
方法。对于简单的单标签HTML, ParseHTML只使用document.createElement
(此处),对于复杂的HTML,则构建DOM节点。init
函数接受的两个参数是selector
和context
- selector
是HTML字符串,context
是您在第二个方法中作为参数传递的属性对象。
添加属性时调用的方法为attr
。此处代码
方法1
$("<a/>").attr("href",link);
这里,jQuery首先创建一个元素。然后分别尝试向创建的元素添加属性。init
函数不接受context
参数。它只是在内部使用document.createElement
添加一个基本的<a>
元素。这部分代码永远不会执行,并返回新创建的对象。然后在创建的jQuery包装DOM对象上调用attr
方法。因此init
被调用一次,attr
也被调用一次。即使您要在同一个attr()
调用中传递多个属性,它仍然会被调用一次。
方法2
$("<a/>", {href: link});
这里,jQuery尝试在创建DOM元素的同时添加属性。它现在接收context
,这是要添加到元素的属性。它在这个属性映射上迭代,分别为每个属性调用attr()
方法(可以在这里看到)。这相当于$("<a>").attr(key, val).attr(key1, val1).attr(key2, val2);
,因此init
被调用一次,而attr
在内部被调用多次。
$("<a href=" + link + ">");
这里,jQuery同样没有接收任何context
参数。它只接收一个需要解析的纯HTML字符串。如文档所述,在这种情况下,如果HTML比单个结束标记更复杂,jQuery将使用buildFragment
方法(此处的代码)构建DOM节点,并使用innerHTML
方法将传递的HTML插入到文档中。这发生在jQuery的parseHTML
函数中,该函数内部调用buildFragment
。因此只调用一次init
,它必须在内部构建节点。不调用attr
.
因此,方法2实际上将对attr
的调用封装在同一个DOM元素创建调用中,并提供了一种更具可读性的形式。然而,我认为方法1与方法2具有相同的可读性,并且应该比方法2更快。在方法3中(正如性能测试后来表明的那样),构建DOM节点需要花费很多时间,因为所有东西都必须经过buildFragment
阶段,而方法1和方法2的情况不同,方法1和方法2传递单个标记html,然后直接使用document.createElement
。
对于单个元素创建,您几乎不会注意到执行时间上的任何差异。这只需要不到几毫秒的时间。我为100,000个元素创建了这个测试,看看是否有任何差异。注释掉要测试的方法,以获得执行时间。
方法1:耗时:400-600ms(最快)
方法二:用时:550-700ms
方法3:耗时:2700-2900ms(预期最慢)
时代可能变化,但趋势将保持不变。该测试可在这里获得http://jsfiddle.net/6ko59joo/2/。试试吧
选项:No jQuery
到目前为止尚未讨论的是离开jQuery并使用普通JS的选项。在这种情况下,上述测试的性能将跃升至70-80ms。它的代码是:
var a = document.createElement('a');
a.href = link;
为了您的考虑,它也包含在jsFiddle中。
这是基于我的理解和测试。如果我错了,我希望得到纠正。
- 序列化数据属性中对象的最可靠方法
- 如何从对象的原型方法访问JavaScript对象属性
- 设置嵌套对象属性的更好方法
- JQuery示例不起作用-“;对象没有't支持属性或方法'按钮'&”;
- 对象不支持属性或方法“自动完成”
- 为什么我可以在Array属性对象中找到Javascript Array for Each方法
- Es6:能够在设置/更新/删除对象属性时调用自定义方法
- 区分具有相同名称的属性和方法
- sails.js beforeCreate方法只接收required设置为true的模型属性
- SCRIPT438:对象没有't支持属性或方法'endsWith'在IE10中
- 有什么方法可以将类型指定为 self?或解决方法“属性类型不兼容”
- 打字稿 - 为什么猫鼬中不存在“方法”属性
- 从JavaScript中的另一个方法属性中引用对象方法属性
- Javascript:通过在数组上循环来创建对象方法/属性
- 冲突/方法/属性Javascript错误
- 将' this '的继承扩展到' object '的方法/属性
- Javascript继承静态和实例方法/属性
- 我可以为对象设置正则表达式吗's方法/属性选择器
- 发现HTML对象标记方法/属性
- 为什么我的主干模型奇怪地嵌套在集合中,需要钻取才能访问方法/属性?