Last active
May 22, 2022 23:15
-
-
Save berzniz/7632148 to your computer and use it in GitHub Desktop.
Some small javascript hacks for hipsters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Boring | |
if (isThisAwesome) { | |
alert('yes'); // it's not | |
} | |
// Awesome | |
isThisAwesome && alert('yes'); | |
// Also cool for guarding your code | |
var aCoolFunction = undefined; | |
aCoolFunction && aCoolFunction(); // won't run nor crash |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var x = 1; | |
debugger; // Code execution stops here, happy debugging | |
x++; | |
var x = Math.random(2); | |
if (x > 0.5) { | |
debugger; // Conditional breakpoint | |
} | |
x--; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var deeplyNestedFunction = function() { | |
var private_object = { | |
year: '2013' | |
}; | |
// Globalize it for debugging: | |
pub = private_object; | |
}; | |
// Now from the console (Chrome dev tools, firefox tools, etc) | |
pub.year; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
['first', 'name'].join(' '); // = 'first name'; | |
['milk', 'coffee', 'sugar'].join(', '); // = 'milk, coffee, sugar' |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Boring | |
if (success) { | |
obj.start(); | |
} else { | |
obj.stop(); | |
} | |
// Hipster-fun | |
var method = (success ? 'start' : 'stop'); | |
obj[method](); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// default to 'No name' when myName is empty (or null, or undefined) | |
var name = myName || 'No name'; | |
// make sure we have an options object | |
var doStuff = function(options) { | |
options = options || {}; | |
// ... | |
}; | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var firstName = 'Tal'; | |
var screenName = 'ketacode' | |
// Ugly | |
'Hi, my name is ' + firstName + ' and my twitter screen name is @' + screenName; | |
// Super | |
var template = 'Hi, my name is {first-name} and my twitter screen name is @{screen-name}'; | |
var txt = template.replace('{first-name}', firstName) | |
.replace('{screen-name}', screenName); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var a = [1,2,3,4,5,6,7,8,9,10]; | |
console.time('testing_forward'); | |
for (var i = 0; i < a.length; i++); | |
console.timeEnd('testing_forward'); | |
// output: testing_forward: 0.041ms | |
console.time('testing_backwards'); | |
for (var i = a.length - 1; i >= 0; i--); | |
console.timeEnd('testing_backwards'); | |
// output: testing_backwards: 0.030ms |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var z = 15; | |
doSomeMath(z, 10); | |
xxx // Great placeholder. I'm the only one using xxx and it's so easy to find in code instead of TODOs | |
doSomeMoreMath(z, 15); |
Fast prototyping:
html:
<button btn >Test</button>
<canvas x ></canvas>
js:
const button = document.querySelector('[btn]');
const canvas = document.querySelector('[x]');
Logging on arrow functions
Pretty common but didn't see anyone pointing it here
// convert it
const myFunction (a, b) => doStuff(a, b);
// to it
const myFunction (a, b) => console.log('called myFunction') || doStuff(a, b);
Clearing the console screen without calling functions
Object.defineProperty(window, 'clear', { // or `cls` if you want
get() {
console.clear();
}
});
Now just type clear
and hit enter. You can do this with pretty much anything actually.
Random item of array:
const myArray = ['a', 'b', 'c', 'd', 'e'];
const randomItem = myArray[Math.random() * myArray.length << 0]; // `0.999 << 0` returns `0`
Key/Value looping (if you use for
loops)
const thing = {
a: 1,
b: 2,
c: 3,
};
for(let [key, value] of Object.entries(thing)) {
console.log(key, value);
}
Safe deep property access:
const safeAccess = (obj, path = []) =>
obj && path.length
? safeAccess(obj[path[0]], path.slice(1))
: obj;
//Before:
const size = nested
&& nested.input
&& nested.input.files
&& nested.input.files[0]
&& nested.input.files[0].meta
&& nested.input.files[0].meta.size;
//Now:
const size = safeAccess(nested, ['input', 'files', 0, 'meta', 'size']);
Operations on the parameter list
const itemAt = (array, index, value = array[index]) => value;
itemAt(['a', 'b', 'c', 1]); // 'b'
Random Proxy
hacks:
const it = new Proxy({}, { get(target, name) { return x => x[name] } })
array.map(x => x.propName)
// vs
array.map(it.propName)
const call = new Proxy({}, { get(target, name) { return x => x[name]() } })
fetch(...).then(x => x.json()).then(console.log)
// vs
fetch(...).then(call.json).then(console.log)
const method = new Proxy({}, { get(target, name) { return (...args) => x => x[name](...args) } })
array.forEach(obj => obj.update('A', 1))
// vs
array.forEach(method.update('A', 1))
const eq = new Proxy({}, { get(target, name) { return comp => x => x[name] === comp } })
array.find(item => item.id === 'uuid')
// vs
array.find(eq.id('uuid'))
Im pretty sure that some of this stuff is illegal in some countries...
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Sorting Collections on Multiple Keys [ Efficiently ]
Intention
You may have a sort function that is being called in multiple parts of an application where the the sorting logic. You also may have to sort upon multiple keys of items in a collection and the prioritization of how those keys should effect the sorting algorithm may vary across modules. When these criteria are the case, it may be better to modify the source code of the sorting function, this is a problem if you are using the sorter in multiple places. Even in the case of only one module calling
Array.prototype.sort
, you may still want a single sort function whose signature remains the same and operates just like any other basic sort function.TL:DR:
Details