className VS classList Showdown
JavaScript performance comparison
Info
How much faster is classList.add/remove than className regex manipulation?
Preparation code
<style type="text/css">
.foo { color:#F00; height:100px; opacity:0.3; }
.bar { color:#0F0; height:200px; opacity:0.5; }
.baz { color:#00F; height:300px; opacity:0.7; }
</style>
<div id="base" class="foo bar">
<div class="foo bar baz">test 1</div>
<span class="foo bar">test 2</span>
<span class="baz">test 3</span>
</div>
<script>
Benchmark.prototype.setup = function() {
var node = document.getElementById('base'),
className = 'baz';
function addClass_className(el, className) {
var cn = el.className || '',
c = ' '+cn+' ',
p = ' '+className+' ';
if (c.indexOf(p)===-1) {
el.className = cn + (cn ? ' ' : '') + className;
}
}
function removeClass_className(el, className) {
var cn = el.className || '',
c = ' '+cn+' ',
p = ' '+className+' ';
if (c.indexOf(p)!==-1) {
c = c.replace(p,' ');
el.className = c.substring(1, c.length-2);
}
}
function addClass_classList(el, className) {
el.classList.add(className);
}
function removeClass_classList(el, className) {
el.classList.remove(className);
}
};
</script>
Preparation code output
Test runner
Warning! For accurate results, please disable Firebug before running the tests. (Why?)
Java applet disabled.
| Test | Ops/sec | |
|---|---|---|
className RegExp |
|
pending… |
classList |
|
pending… |
Compare results of other browsers
Revisions
You can edit these tests or add even more tests to this page by appending /edit to the URL. Here’s a list of current revisions for this page:
- Revision 1: published by Jason Miller
- Revision 2: published
- Revision 3: published by Jason Miller
- Revision 5: published by Marcin
- Revision 6: published
2 comments
Using string manipulation is quicker than both ClassList and regular expressions. See http://jsperf.com/classlist-vs-old-school-remove and http://jsperf.com/classlist-vs-old-school-add
No, your old-school method is flawed because it does not support the same functionality as classList. What if I had two CSS classes, "worldfoo" and "world"? Your example would remove only the first instance of " world", which might be "worldfoo". The following demonstrates the issue:
("bar worldfoo world baz").replace(" world","").trim()==="bar foo world baz"