Méně známé JS tipy a triky

JS tipy a triky

Méně známé. Možná. Jak pro koho.

Ondřej Žára, @0ndras

Quest #1: modulo

Operátor A % B vrací zbytek A po dělení B

Quest #1: modulo

Tak určitě.

var a = 17 % 5; // 2 var b = -17 % 5; // -2 (!)

Quest #1: modulo

Quest #1: modulo

Number.prototype.mod = function(m) { return (this < 0 ? this % m + m : this % m); } var a = (17).mod(5); // 2 var b = (-17).mod(5); // 3

Quest #2: hledáme minimum

var DATA = [1, 2, 3, -100, 3.14, 555, .69, -123]; // Které číslo je nejmenší?

Quest #2: hledáme minimum

Math.min.apply(Math, DATA); // -123

Quest #2: hledáme minimum

/* Chrome */ Math.min.apply(Math, new Array(125318)) // RangeError: Maximum call stack size exceeded /* Firefox */ Math.min.apply(Math, new Array(500001)) // RangeError: arguments array passed to Function.prototype.apply is too large

Quest #2: hledáme minimum

var min = Number.MAX_VALUE; // 1.7976931348623157e+308 for (var i=0; i<DATA.length; i++) { min = Math.min(min, DATA[i]); }

Quest #2: hledáme minimum

var min = 1/0; // Infinity for (var i=0; i<DATA.length; i++) { min = Math.min(min, DATA[i]); }

Quest #2: hledáme minimum

var min = DATA[0]; for (var i=1; i<DATA.length; i++) { min = Math.min(min, DATA[i]); }

Quest #3: parseInt

var num = parseInt(str, ?);

Quest #3: parseInt

Quest #3: parseInt

var A = ["13", "8", "-222"]; var B = A.map(parseInt); // [13, NaN, NaN]

Quest #3: parseInt

Array.prototype.map = function(cb) { for (var i=0; i < this.length; i++) { cb(this[i], i); /* ... */ } }

Quest #3: parseInt

var returnInt = function(x) { return parseInt(x); } ["13", "8", "-222"].map(returnInt); // [13, 8, -222]

Quest #3: parseInt

var praseInt = function(x, y) { return parseInt(y, x); } ["13", "8", "-222"].map(praseInt.bind(null, null)); // [13, 8, -222] ["13", "8", "-222"].map(praseInt.bind(null, 16)); // [19, 8, -546]

Quest #3: parseInt

["3.14", "8", "0x10", ""].map(parseFloat); // [3.14, 8, 0, NaN] ["3.14", "8", "0x10", ""].map(Number); // [3.14, 8, 16, 0]

Quest #4: slovníček

var DICT = {}; DICT["hello"] = "ahoj"; DICT["foo"] = "bar";

Quest #4: slovníček

function add(key, value) { DICT[key] = value; } add($("#en").value, $("#cs").value); <input id="en" value="__proto__" />

Quest #4: slovníček

DICT["__proto__"] = 42; alert(DICT["__proto__"]); // "[object Object]"

Quest #4: slovníček

ES5 baby!

var DICT = Object.create(null); DICT["__proto__"] = 42; alert(DICT["__proto__"]); // 42

Quest #5: breakdance

for (var i=0; i<pole.length; i++) { for (var j=0; j<pole[i].length; j++) { /* ... */ } }

Quest #5: breakdance

for (var i=0; i<pole.length; i++) { for (var j=0; j<pole[i].length; j++) { if (pole[i][j] == 0) { break; } } }

Quest #5: breakdance

var ok = true; for (var i=0; i<pole.length; i++) { for (var j=0; j<pole[i].length; j++) { if (pole[i][j] == 0) { ok = false; break; } } if (!ok) { break; } }

Quest #5: breakdance

dance: for (var i=0; i<pole.length; i++) { for (var j=0; j<pole[i].length; j++) { if (pole[i][j] == 0) { break dance; } } }

Quest #6: String.prototype.wtf

"problem".fixed(); // "<tt>problem</tt>" "your mom".big(); // "<big>your mom</big>" "here".link("http://..."); // "<a href="http://...">here</a>"

Quest #6: String.prototype.wtf

anchor, big, blink, bold, fixed, fontcolor, fontsize, italics, link, small, strike, sub, sup

Quest #7: insertAdjacentHTML

<div> <a href="#">odkaz</a> </div>

Quest #7: insertAdjacentHTML

<div> <a href="#">odkaz</a> </div> var div = document.querySelector("div"); div.insertAdjacentHTML("beforeend", "<a href=...");

Quest #7: insertAdjacentHTML

insertAdjacentHTML Tree manipulation
"beforebegin" parentNode.insertBefore(..., node)
"afterbegin" insertBefore(..., node.firstChild)
"beforeend" appendChild(...)
"afterend" parentNode.insertBefore(..., node.nextSibling)

Prostor pro otázky