new Array(); //constructor
var a = new Array(5);
//[undefined, undefined, undefined, undefined, undefined]
var b = new Array(5, 6);// [5,6]
constructor is a function call plus execution, argument check
[]; //literals
var c = [];
c[0] = 1;
c[1] = 2;
c[2] = 3;
var d = [1, 2, 3, 4];
why [] faster,
literal vs new
var a = [];
for (var i = 0; i < 10000; i++){
a.push(i);
}
var b = [];
for (var i = 0; i < 10000; i++){
b[i] = i;
}
test: push vs assign
var a = [1, 2];
a.push(3, 4, 5);
a; // [1, 2, 3, 4, 5]
var b = [1, 2, 3, 4, 5, ...];
b.indexOf(669);
b.indexOf(669, 500);
test: fromIndex
for(var i = 0; i < 100; i++){
console.log('I will not throw paper airplanes in class');
}
for(initiation; iteratingCondition; repeatingExpression){
repeatingCode;
}
var myArr = [1, 2, 3, 4, 5];
for(var i = 0; i < myArr.length; i++){
console.log(myArr[i]);
}
//length is calculated once
for(var i = 0, len = myArr.length; i < len; i++){
console.log(myArr[i]);
}
for(var i = 0; i < 10; i++) {
var container = document.getElementsByClassName('container');
console.log(container[i].innerText);
}
var container = document.getElementsByClassName('container');
for(var i = 0; i < 10; i++) {
console.log(container[i].innerText);
}
property access vs variable cache
var myArr = [0,1,2,3,4,5 ...],
len = myArr.length;
//forward
for(var j = 0; j < len; j++){
console.log(myArr[j]);
}
//backward
for(var i = len; i--; ){
console.log(myArr[k]);
}
dont worry about it for a smaller array
js perf: backward test or for loop backward
var arr = [];
for (var i = 0; i < 1000; i++) {
arr.push([1, 2, 3].map(function (x) { return x * x; }));
}
var arr = [];
var sq = function (x) { return x * x; };
for (var i = 0; i < 1000; i++) {
arr.push([1, 2, 3].map(sq));
}
function caching for loop
var devs = [{ name: 'addy osmani', age: 29}, {name: 'paul irish', age:31}, {name: 'md khan', age: 13}];
devs.filter(function (el, i, arr) {
return el.age > 21;
});
function filterByForLoop(myArr, num){
var i, j = 0, len, output=[];
for (i = 0, len = myArr.length; i < len; i += 1) {
if (myArr[i].age > 10) {
output[j++]= myArr[i];
}
}
return output;
}
filter vs simple loop
var myArr = [1, 2, 3, 4, 5, ... ];
//faster
for(var i = 0; i < 1000; i++){
console.log(myArr[i]);
}
//than
for(var j in myArr){
console.log(myArr[j]);
}
dont use for-in while traversing on an array
var arr = [0];
arr[999] = 999;
for(var i = 0, len = arr.length; i < len; i++){
console.log(arr[i]);
}
for(var j in arr){
console.log(arr[j]);
}
var myArr = [1,2,3,4,5,6,7,8,9],
len = myArr.length,
i =0;
while (i++ < len) {
console.log(myArr[i]);
}
var l = arr.length;
while(l--) {
someFn(arr[l]);
}
fastest way to traverse array
var myArr = [0, 1, 2,3 4, 5 ...];
function useGlobal() {
for (j = 0; j < 1000; j++)
console.log(myArr[j]);
}
function useLocal() {
var localArr = myArr;
for (var k = 0; k < 1000; k++)
console.log(localArr[k]);
}
local vs global variable
<div>
<article>
<p>some unnecessary text</p>
</article>
<article >
<span id="myId" class="myClass">my span not spam</span>
</article>
</div>
<div class="awesome-selector">
<div class="inner-1"> Header - 1 </div>
<div class="inner-2"> Header - 2 </div>
<div class="inner-3"> Header - 3 </div>
</div>
var h1 = document.querySelector('.inner-1');
var h2 = document.querySelector('.inner-2');
var h3 = document.querySelector('.inner-3');
var awesome = document.querySelector('.awesome-selector');
var h1 = awesome.querySelector('.inner-1');
var h2 = awesome.querySelector('.inner-2');
var h3 = awesome.querySelector('.inner-3');
jsPerf:caching,
cache query selector
<section class="mySection">
<div class="myDiv">
<div>
<span data-control="true">Something, Darkside</span>
</div>
</div>
</section>
document.querySelectorAll('.mySection .myDiv [data-control]')
<div>
<span class="data-control" data-control="true"> Something, Darkside </span>
</div>
document.getElementsByClassName('data-control');
select by attribute value
var ul = document.getElementById('myList');
el.innerHTML = '<li>Only one item</li>';
var li = document.createElement("li");
var text = document.createTextNode('Only one Item');
li.appendChild(text);
ul.appendChild(li);
var list = ['foo', 'bar', 'baz'],
li, text;
for (var i = 0; i < list.length; i++) {
li = document.createElement('li');
text = document.createTextNode(list[i]);
li.appendChild(text);
document.body.appendChild(li);
}
var fragment = document.createDocumentFragment(),
list = ['foo', 'bar', 'baz'],
el, text;
for (var i = 0; i < list.length; i++) {
el = document.createElement('li');
text = document.createTextNode(list[i]);
el.appendChild(text);
fragment.appendChild(el);
}
document.body.appendChild(fragment);
createDocumentFragment
<ul id="listToDestroy">
<li><a href="#">first item</a></li>
<li><a href="#">second item</a></li>
<li><a href="#">third item</a></li>
<li><a href="#">forth item</a></li>
<li><a href="#">Fifth item</a></li>
</ul>
var el = document.getElementById('listToDestroy');
el.addEventListener('click', function (e) {
var list = e.target.parentNode;
list.parentNode.removeChild(list);
e.preventDefault();
});
js perf delegate
$(document).ready(function () {
console.log('document is ready. I can sleep now');
});
document.addEventListener('DOMContentLoaded', function(){
console.log('document is ready. I can sleep now');
});
document.onreadystatechange = function () {
if (document.readyState == "complete") {
console.log('document is ready. I can sleep now');
}
}
$(el).addClass('hide');
$(el).removeClass('hide');
$(el).toggleClass('hide');
$(el).hasClass('hide');
//IE9+
el.classList.add('hide');
el.classList.remove('hide');
el.classList.toggle('hide');
el.classList.contains('hide');
MDN: classList
$(el).hide();
$(el).show();
el.style.display = 'none';
el.style.display = '';
$(el).html();
$(el).html(setString);
$(el).empty();
el.innerHTML;
el.innerHTML = setString;
el.innerHTML = '';
$(el).text();
el.textContent;
you might not need jQuery
$(el).on(eventName, eventHandler);
$(el).on('click', function(e){
console.log(e.target);
})
//remove event
$(el).off(eventName, eventHandler);
//IE9+
el.addEventListener(eventName, eventHandler);
el.addEventListener('click', function(e){
console.log(e.target);
});
el.removeEventListener(eventName, eventHandler);
$(el).parent();
$(el).children();
$(el).next();
$(el).prev();
$(parent).append(el);
$(el).remove();
$(el).clone();
el.parentNode;
el.children;
el.nextElementSibling;
el.previousElementSibling
parent.appendChild(el);
el.parentNode.removeChild(el);
el.cloneNode(true);
console.assert(myArray.length >5, "More than 5 elements");
//trace
console.trace();
profile('myProfile');
porfileEnd('myProfile');
function foo(){
console.count('fooed');
}
foo(); // fooed: 1
foo(); // fooed: 2
foo(); // fooed: 3
Using the console
console.time("Array initialize");
var array= new Array(1000000);
for (var i = array.length - 1; i >= 0; i--) {
array[i] = new Object();
};
console.timeEnd("Array initialize");
CodeSchool: Discover Dev Tools
\
/
Build you own rules, and update old ones.