<div id='parent'>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
</div>
let arr = [document.querySelectorAll('.child')];
let arr = [].slice.call(document.querySelectorAll('.child'));
let arr = Array.from(document.querySelectorAll('.child'));
let arr = Array.prototype.slice.call(document.querySelectorAll('.child'));
--enable-precise-memory-info
flag.
Test case name | Result |
---|---|
Spread Operator [...] | |
[].slice.call() | |
Array.from() | |
Array.prototype.slice.call() |
Test name | Executions per second |
---|---|
Spread Operator [...] | 82743.3 Ops/sec |
[].slice.call() | 220703.5 Ops/sec |
Array.from() | 83739.4 Ops/sec |
Array.prototype.slice.call() | 218947.8 Ops/sec |
Let's dive into the provided benchmark definition and explain what is being tested, compared, and their pros and cons.
Benchmark Definition
The benchmark measures the performance of three different methods to convert a NodeList to an Array:
...
): let arr = [...document.querySelectorAll('.child')]
.slice()
method: let arr = [].slice.call(document.querySelectorAll('.child'))
Array.from()
method: let arr = Array.from(document.querySelectorAll('.child'))
Comparison
The benchmark compares the performance of these three methods on a large NodeList (in this case, all elements with the class child
) in a Chrome browser on a Mac OS X 10.15.7 platform.
Methods Compared
...
): This method creates a new Array by spreading the NodeList's elements into an array..slice()
method: This method returns a shallow copy of the specified range of elements in the NodeList. The []
syntax is used to create an empty array that will be populated with the NodeList's elements.Array.from()
method: This method creates a new Array from an iterable (in this case, the NodeList).Performance Comparison
The benchmark result shows the number of executions per second for each method:
...
): 87978.203125 executions/second.slice()
method: 111267.3359375 executions/secondArray.from()
method: 91535.203125 executions/secondBased on these results, it appears that the .slice()
method is the fastest, followed closely by Array.from()
, and then the Spread Operator (...
).
Pros and Cons of Each Method
...
):.slice()
method:.slice()
method.Array.from()
method:.slice()
, due to the overhead of creating an iterator.In summary, while all three methods have their pros and cons, the .slice()
method appears to be the fastest option for converting a NodeList to an Array. However, the Spread Operator (...
) is still a viable choice when simplicity and readability are more important than raw performance.