====== javascript ======
===== var, let and const ====
A ''var'' is a statement that defaults a function-scoped or a globally-scoped
variable. It is also added as a non-configurable property to the global object.
The ''let'' statement created a variable that is block scoped. They are still
accessible from blocks that are children of the block the variable was declared
in.
If ''let'' is not written, javascript quietly creates a global binding and uses
it.
===== Strings =====
Javascript **template literals** allow you to add variables in a string.
let age = 33;
let name = 'Paul';
let out = `My name is ${name} and I am ${age}`;
===== Object Literals =====
const person = {
name: 'Paul'
};
// You can add data willy nilly!
person.email = "ding@dong.com";
==== Object Destructuring ====
You can pull data out of an object using a technique called object
destructuring.
const person = {
firstName: 'Paul',
lastName: 'Sammut',
age: 33,
address: {
street: '50 main st',
city: 'NY',
state: 'NY'
}
}
const { firstName, lastName, address:{ city } } = person;
===== Arrays =====
There are a bunch of array operations:
''shift()'' - removes and returns the 0th' element of an array
''unshift()'' - adds 1 or more elements to the start of an array
Iterating through arrays is a whole thing of course. There are a bunch of ways
to do it. You can while loop it, or you can make use of the ''for...of''
statement.
==== Filter ====
Arrays have a filter function that is very powerful. You pass in a function that
defines the filter criteria. Very cool.
let applicants = [ { name: "Joe Shmoe", country: "US", age: 33 },
{ name: "Rob Parny", country: "GB", age: 29 },
{ name: "Rob Parly", country: "GB", age: 16 },
{ name: "Lem Meloo", country: "IT", age: 75 } ]
let onlyUsApplicants = applicants.filter(app => app.country === "US");
==== Map ====
A ''map'' function allows you to go through the elements of an array and build a
new array with returned values of the function passed into map that can act on
each element.
==== Reduce ====
A ''reduce'' function is used to compute a single value from an input array. At
its basic form it requires a combining function that combines to elements of the
array.
It can also be used to get a max or min of an array. For example:
let data = [ { name: "red", count: 32 },
{ name: "green", count: 2 },
{ name: "black", count: 1 },
==== Some && Every ====
''some'' is a function that acts on arrays by taking in a logical test function.
If any of the elements in the array passes the test, it returns true.
''every'' is a function that acts on arrays by taking in a logical test function.
If all of the elements in the array pas the test, it returns true.
==== Composing ====
''Composing'' is when you get start chaining high-order functions to get to a
result or subset of data in a few lines of code.
// Filter and map to a new array
let dirs = SCRIPTS.filter(script => script.living).map(script => {
return { name: script.name, direction: script.direction}; });
===== Functions =====
There's 3 ways of writing a function in JavaScript.
Using a ''function'' expression:
const fun1 = function(x) {
return x*x;
};
Using a ''function'' decleration. The interesting thing with this is that you
can call a declared function before it's declated, as they are moved to the top
of their scope, and all code in that scope can use them. They also don't need a
semicolon at the end.
sayHello();
function sayHello() {
console.log("Hi!");
}
Using the ''arrow'' notation. This is a third and compact way of writing
functions. If you don't put curly braces and have a single expression, it will
be returned.
const sayHi = () => { console.log('hi'); };
const returnOne = () => 1;
Functions in javascript ignore extra parameters you pass in and also add
undefineds for parameters you don't pass in.
Functions in javascript can be named or anonymous. They have access to local variables that are in the scope of their parent functions.
function fun2(){
var output = ""
if(typeof myGlobal != "undefined"){
output += "myGlobal: " + myGlobal;
}
if(typeof oopsGlobal != "undefined"){
output += " oopsGlobal: " + oopsGlobal;
}
console.log(output)
}
===== Higher-Order Functions =====
Higher-order functions are functions that operate on other functions, either by
passing them in as a parameter or by returning them.
The shit you can do with functions is nuts.
let repeat = function(n, action){
for(let i = 1; i <= n; i++){
action(i);
}
};
repeat(3, n => { console.log(n); });
===== Callbacks =====
You can pass around functions willnilly in javascript. You can easily pass them
in as parameters to functions.
function useFunction(func1, func2){
func1("Pass this to func1");
func2("Pass this to func2");
}
var firstFunc = function(in){
console.log(in);
}
var secondFunc = function(in){
console.log(in);
}
useFunction(firstFunc, secondFunc);
===== Objects =====
Objecta can be defined as variables with member variables and functions inside
curly braces.
var myPerson = {
firstName : "Jack",
lastName : "Smith",
age : 19,
employed : true
fullName : function() {
return this.firstName + " " + this.lastName;
}
}
They can also be defined as functions by making use the of the ''this'' and
''new'' keyword.
function Person(firstName, lastName){
// construct the object using the arguments
this.firstName = firstName;
this.lastName = lastName;
// a method that returns the fullname
this.fullName = function() {
return this.firstName + " " + this.lastName;
}
}
var myPerson = Person("Paul", "Sammmut");
console.log(myPerson.fullName());
===== HTML =====
Javascript was designed to run in a browser and interact with HTML.
You can embed javascript in html sources and make use of many function that can
modify HTML elements.
===== Equality =====
In javascript there are two equality statements, ''=='' and ''===''.
Double equal: Loose equality check. Tries to coerse types so theres a match and
then compares content.
Triple equal: Type and content have to match. Strict equality.
===== Control Flow =====
==== Switch ====
Switch statements are wierd in that statements start executing at the
start of a matching label, and will keep executing accross other labels
until it hits a break.
In the following if you pass ''sunny'' Dress Light and Go out will print.
switch(prompt("PUT IN WEATHER")){
case 'rainy':
console.log("Bring umbrella");
break;
case 'sunny':
console.log("Dress light");
case 'cloudy':
console.log("Go out");
break;
default:
console.log("Unknown weather type!");
break;
}
===== OOP =====
JavaScript OOP.
==== Methods ====
Methods in JS are simply properties that hold function values.
let rabbit = {};
rabbit.speak = function(line) {
console.log(`I am saying '${line}'.`);
}
rabbit.speak("hi!");
==== Prototypes ====
JavaScript has inheritance. Almost every object in javascript inherits (directly
or indirectly) from ''Object.prototype''. This gives every object some basic
properties, including methods, such as ''toString()''.
==== Classes ====
You can have classes in JavaScript but they can only contain methods. They
cannot contain non functions, such as variables.
class Rabbit{
constructor(type){
this.type = type;
}
speak(line) {
console.log(`This ${this.type} rabbit says '${line}'.`);
}
}
let killaRabbit = new Rabbit('killa');
let spottedRabbit = new Rabbit('spotted');
killaRabbit.speak('Hello precious..');
spottedRabbit.speak('I\'m spotted all ova');
==== call function ====
JavaScript has a call function that can be invoked on an function and allows you
to explicitly pass a ''this'' object as the first parameter.
===== Object Spread Operator =====
The Object Spread Operator is ''...'' and it allows you to spread concatenate lists in a one line. [[https://github.com/tc39/proposal-object-rest-spread|Link]].
I was really confused about it when I saw it used to spread out properties of an object that was returned by a function [[https://vuex.vuejs.org/guide/state.html#object-spread-operator|here]].
computed: {
localComputed () { /* ... */ },
// mix this into the outer object with the object spread operator
...mapState({
// ...
})
}