Profile image

Guilherme AlmeidaSoftware Engineer

Professional Software Development Blog and Portfolio.

My Cheat Sheet of Javascript

This post summarizes in methods and examples what I learned studying javascript, where I had the idea of creating this sheet to help me with future questions. I hope it will also help language beginners to accelerate their learning curve and more experienced ones to remember some forgotten concepts.

javascriptcheat-sheet

Index


1 Data Types

typeof Returns the data type.

//example:
> typeof 10;
'number'
> typeof "JavaScript";
'string'
> typeof true;
'boolean'
> typeof Symbol("iterator");
'symbol'
> typeof null;
'object'
> typeof undefined;
'undefined'

1.1 Number

Number
Convert string passed by the parameter to a number raised to a decimal base.

//example:
> Number("9.9");
9.9
> Number("0xFF");
255
> Number("0b10");
2
> Number("0o10");
8
> Number();
0
> Number("JavaScript");
NaN

isNaN
Returns Boolean that checks if the parameter passed is NaN.

⚠️ If we use Boolean operators to compare, even if equal, it returns false. That's why use the isNaN() function.

//example:
> NaN === NaN
false
> isNaN(NaN)
true

toExponential
Returns the number elevated to scientific notation, specifying the number of places after the decimal point as a function parameter._

//example:
> (123.4).toExponential(10);
'1.2340000000e+2'

toFixed
Returns the number with a number of places after the comma passed as a parameter of the function._

//example:
> (123.4).toFixed(10);
'123.4000000000'

toPrecision
Returns the total number of digits, which is passed as a function parameter.

//example:
> (123.4).toPrecision(10);
'123.4000000'

parseInt
Receives a string as a function parameter and returns a decimal number, or another base that must be passed as the second parameter.

⚠️ The houses after the comma are lost in this case.

//example:
> parseInt("10");
10
> parseInt("9.9", 10);
9
> parseInt("A", 16);
10
> parseInt("11", 2);
3
> parseInt("010", 8);
8

parseFloat
Receives a string as a function parameter and returns a decimal number with places after the comma, unlike parseInt, it does not receive another base that must be passed as a second parameter.

//example:
> parseFloat("10");
10
> parseFloat("2.5");
2.5
> parseFloat("0xFF");
0
> parseFloat("a");
NaN

toString Returns a string of the number converted into the base passed as a function parameter.

⚠️ Javascript accepts 4 types of numerical base: decimal(10), hexadecimal(16), binary(2) and octal(8).

//example:
> (10).toString(10) // converting to string in decimal
'10'
> (10).toString(16) // converting to string in hexadecimal
'The'
> (10).toString(2) // converting to string in binary
'1010'
> (10).toString(8) // converting to octal string
'12'

1.1.1 Math API

Math is an object that has several mathematical functions in the language.

Math.sign Returns number 1 if the parameter is positive and -1 if the parameter is negative.

//example:
> Math.sign(5);
1
> Math.sign(-5);
-1

Math.abs Returns number converted to positive.

//example:
> Math.abs(-10)
10

Math.ceil Returns number rounded up to the next integer.

//example:
> Math.ceil(1.1);
two
> Math.ceil(-1.1);
-1

Math.floor Returns number rounded down to the next integer.

//example:
> Math.floor(9.9);
9
> Math.floor(-9.9);
-10

Math.round Rounds the number up if the decimal part is from 5 to 9 and down if it is from 0 to 4.

⚠️ For negative numbers reverse the order.

//example:
> Math.round(4.4);
4
> Math.round(4.5);
5
> Math.round(4.6);
5
> Math.round(-4.4);
-4
> Math.round(-4.5);
-4
> Math.round(-4.6);
-5

Math.trunc Eliminates the decimal part of the number, making it an integer.

//example:
> Math.trunc(2.3);
two
> Math.trunc(-2.3);
-two

Math.min Returns the smallest number passed by the parameter.

//example:
> Math.min(1,2,3,4,5,6);
1

Math.max Returns the highest number passed by the parameter.

//example:
> Math.max(1,2,3,4,5,6);
6

Math.random Returns a random number between 0 and 1, not including 1.

⚠️ For a result greater than 1 decimal place, just multiply it.

//example:
> Math.random();
0.8942857287859916
> Math.trunc(Math.random() * 100)
88

1.2 String

length Returns the size of the String.

//example:
> "JavaScript".length;
10

indexOf Returns the first position found of the character passed by the parameter.

//example:
> "PHP".indexOf("p");
0

lastIndexOf Returns the last position found of the character passed by the parameter.

//example:
> "PHP".lastIndexOf("P");
two

toUpperCase Returns a new String converting the letters to uppercase.

//example:
> "cobol".toUpperCase();
'COBOL'

toLowerCase Returns a new String converting the letters to lowercase.

//example:
> "ALGOL".toLowerCase();
'something'

charAt Returns the character in the position passed by the parameter .

//example:
> "JavaScript".charAt(1);
'The'

charCodeAt Returns the code based on the position passed by the parameter.

//example:
> "JavaScript".charCodeAt(1);
97

String.fromCharCode Returns a character based on the code passed by the parameter.

//example:
> String.fromCharCode(97);
'The'

includes Returns Boolean checking if the String contains the String passed by the parameter.

//example:
> "JavaScript".includes("Java");
true

startsWith Returns Boolean checking if the String starts with the String passed by the parameter.

//example:
> "Ruby".startsWith("R");
true

endsWith Returns Boolean checking if the String ends with the String passed by the parameter.

//example:
> "Erlang".endsWith("lang");
true

localeCompare Returns number -1, 0 or 1 according to whether the String passed by the parameter is greater, equal or less than the one being checked.

//example:
> "a".localeCompare("b");
-1 // a < b
> "a".localeCompare("a");
0 // a == a
> "b".localeCompare("a");
1 // b > a

⚠️ Characters with an accent that are in a larger position are also replaced according to the letter, making this function very practical and important.

"a" < "b"
false // the "à" is greater than "b" because of the charCode
"á".localeCompare("b")
-1 // the function brings the "à" as if it were the normal "a" for comparison

match Returns Array with parts of the String based on the RegExp passed by the parameter.

⚠️ Only accepts regexp as parameters.

//example:
// in this case regexp was used where the slash \ serves to escape the +, the G serves to locate all occurrences.
> "C++".match(/\+/g);
[ '+', '+' ]

search Returns Number with the index value of the first position found based on the RegExp passed by the parameter.

⚠️ Only accepts regexp as parameters.

//example:
> "java".search(/a/);
1

replace
Returns String resulting from replacing the String or RegExp passed in the first parameter by the second parameter.

//example:
> "JavaScript".replace("Java", "Ecma");
'EcmaScript'
> "JavaScript".replace(/a/g, 4); 
'J4v4Script'

slice Returns a part of the String that is invoking the function starting at the position passed in the first parameter until the final position passed in the second parameter, or from the position passed in the first parameter until the end if the second parameter is not informed.

//example:
> "JavaScript".slice(0, 4);
'Java'
> "JavaScript".slice(4);
'Script'
> "JavaScript".slice(0, -6);
'Java'
> "JavaScript".slice(-6);
'Script'

split Returns an array containing the result of dividing the original String according to the criteria passed by the parameter.

//example:
> "C;Java;JavaScript;Ruby".split(";");
[ 'C', 'Java', 'JavaScript', 'Ruby' ]

substring Similar to slice, does not accept negative values as a parameter and allows the inversion of parameters.

//example:
> "JavaScript".substring(0, 4);
'Java'
> "JavaScript".substring(4, 0);
'Java'
> "JavaScript".substring(4);
'Script'

concat Returns a new String resulting from the concatenation of the one invoking the function and the other, passed by the parameter.

//example:
> "Java".concat("Script");
'JavaScript'
> "Data".concat("Flex");
'DataFlex'

padStart Complete the String with characters at the beginning.

//example:
> "Script".padStart(10, "Java");
'JavaScript'

padEnd Complete the String with characters at the end.

//example:
> "C".padEnd(3, "+");
'C++'

repeat Repeats a character.

//example:
> "C".concat("+".repeat(2));
'C++'

trim Eliminates blank spaces at the beginning and end.

//example:
> " Self ".trim();
'Self'

trimLeft Eliminates white spaces at the beginning.

//example:
> " Scheme ".trimLeft();
'Scheme'

trimRight Eliminates blank spaces at the end.

//example:
> " Perl ".trimRight();
'Perl'

1.3 Boolean

true or false Only these six cases return false, any other value is set to true.

//example:
> !!0;
false
> !!NaN;
false
> !!"";
false
> !!false;
false
> !!undefined;
false
> !!null;
false

1.4 Object

delete Deletes the object's property.

//example:
> delete book.available;

hasOwnProperty used to determine if a property belongs to the object.

//example:
const javascript = {
     name: "JavaScript",
     year: 1995
};

console.log(javascript.hasOwnProperty(name));
//true
console.log(javascript.hasOwnProperty(paradigm));
//false

1.4.1 Object API

Object.create allows interaction with the object's prototype.

//example:
const functionalLanguage = {
     paradigm: "Functional"
};
const scheme = Object.create(functionalLanguage);
scheme.name = "Scheme";
scheme.year = 1975;

Object.assign makes a copy of the properties of the objects passed by the parameter to the target object, which is returned.

//example:
const javascript = Object.create({});
Object.assign(javascript, {
     name: "JavaScript",
     year: 1995,
     paradigm: "OO and Functional"
});
console.log(javascript);
//{ name: 'JavaScript',
// year: 1995,
// paradigm: 'OO and Functional',
// author: 'Brendan Eich',
// influencedBy: 'Java, Scheme and Self' }

Object.getPrototypeOf allows interaction with the object's prototype.

//example:
const functionalLanguage = Object.create({});
functionalLanguage.paradigm = "Functional";
const javascript = Object.create(functionalLanguage);
javascript.name = "JavaScript";
javascript.year = 1995;
javascript.paradigm = "OO";
console.log(Object.getPrototypeOf(javascript).paradigm);
//"Functional"

Object.setPrototypeOf allows interaction with the object's prototype.

//example:
const functionalLanguage = {
     paradigm: "Functional"
};
const scheme = {
     name: "Scheme",
     year: 1975
};
console.log(Object.setPrototypeOf(scheme, functionalLanguage));
//const scheme = {
// name: "Scheme",
// year: 1975,
// paradigm: "Functional"
//};
//

Object.keys Returns the keys of the object's properties in an array.

//example:
const javascript = {
     name: "JavaScript",
     year: 1995,
     paradigm: "OO and Functional"
};
console.log(Object.keys(javascript));
//[ 'name', 'year', 'paradigm' ]

Object.values Returns the values of the object's properties in an array.

//example:
const javascript = {
     name: "JavaScript",
     year: 1995,
     paradigm: "OO and Functional"
};
console.log(Object.values(javascript));
//[ 'JavaScript', 1995, 'OO and Functional' ]

Object.entries Returns the object's properties in key and value pairs in an array each pair and then within another array that encompasses all.

//example:
const javascript = {
     name: "JavaScript",
     year: 1995,
     paradigm: "OO and Functional"
};
console.log(Object.entries(javascript));
//[ [ 'name', 'JavaScript' ],
// [ 'year', 1995 ],
// [ 'paradigm', 'OO and Functional' ] ];

Object.is Compares two objects, considering their data types, similarly to the === operator, returning a boolean.

//example:
const javascript = {
     name: "JavaScript",
     year: 1995,
     paradigm: "OO and Functional"
};
console.log(Object.is(javascript, javascript));
//true

Object.defineProperty Operation that allows configuring various aspects of a given property, receives as parameters (object, keys, {properties}).

Properties valueDefines the value of a given property. configurableAllows a certain property to be deleted. enumerableAllows a given property to be enumerated. writableAllows a certain property to have its value modified.

//example:
const javascript = {};
Object.defineProperty(javascript, "name", {
    configurable: true,
    enumerable: true,
    value: "JavaScript",
    writable: true
});
javascript.name = "ECMAScript";
console.log(javascript);
//{ name: 'ECMAScript' }
console.log(Object.keys(javascript));
//[ 'name' ]
console.log(Object.values(javascript));
//[ 'ECMAScript' ]
console.log(Object.entries(javascript));
//[ [ 'name', 'ECMAScript' ] ]

Object.preventExtensions Prevents the object from having new properties, but allows modifying or removing existing properties.

⚠️ Whenever these changes are applied to the object, it becomes immutable.

//example:
const javascript = {
     name: "JavaScript",
     year: 1995,
     paradigm: "OO and Functional"
};
Object.preventExtensions(javascript);
javascript.name = "ECMAScript";
javascript.author = "Brendan Eich";
delete javascript.year;
console.log(javascript);
//{ name: 'ECMAScript', paradigm: 'OO and Functional' }
console.log(Object.isExtensible(javascript));
//false

Object.seal Prevents the object from having new properties or erasing existing properties, but allows modifying existing properties.

⚠️ Whenever these changes are applied to the object, it becomes immutable.

//example:
const javascript = {
     name: "JavaScript",
     year: 1995,
     paradigm: "OO and Functional"
};
Object.seal(javascript);
javascript.name = "ECMAScript";
javascript.author = "Brendan Eich";
delete javascript.year;
console.log(javascript);
//{ name: 'ECMAScript', year: 1995, paradigm: 'OO and Functional' }
console.log(Object.isExtensible(javascript));
//false
console.log(Object.isSealed(javascript));
//true

Object.freeze Prevents the object from having new properties, deleting or modifying existing properties.

⚠️ Whenever these changes are applied to the object, it becomes immutable.

//example:
const javascript = {
     name: "JavaScript",
     year: 1995,
     paradigm: "OO and Functional"
};
Object.freeze(javascript);
javascript.name = "ECMAScript";
javascript.author = "Brendan Eich";
delete javascript.year;
console.log(javascript);
// { name: 'JavaScript', year: 1995, paradigm: 'OO and Functional' }
console.log(Object.isExtensible(javascript));
// false
console.log(Object.isSealed(javascript));
// true
console.log(Object.isFrozen(javascript));
// true

1.5 Json

It is a data interchange format.

JSON.stringfy converts a given data type to JSON.

//example:
console.log(JSON.stringify(10));
console.log(JSON.stringify("JavaScript"));
console.log(JSON.stringify(true));
console.log(JSON.stringify(false));
console.log(JSON.stringify({name: "Self", paradigm: "OO"}));
console.log(JSON.stringify([1,2,3,4,5,6,7,8,9]));
console.log(JSON.stringify(null));
// '10'
// '"JavaScript"'
// 'true'
// 'false'
// '{"name":"Self","paradigm":"OO"}'
// '[1,2,3,4,5,6,7,8,9]'
// 'null'

JSON.parse converts a JSON to a given data type.

//example:
console.log(JSON.parse('10'));
console.log(JSON.parse('"JavaScript"'));
console.log(JSON.parse('true'));
console.log(JSON.parse('false'));
console.log(JSON.parse('{"name": "Self","paradigm": "OO"}'));
console.log(JSON.parse('[1,2,3,4,5,6,7,8,9]'));
console.log(JSON.parse('null'));
// 10
// 'JavaScript'
// true
// false
// { name: 'Self', paradigm: 'OO' }
// [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
// null

1.6 Function

arguments implicit variable to access the parameters of the invoked function.

//example:
function sum() {
     console.log(arguments)
};
sum(1,2,3,4,5);
// { '0': 1,
// '1': 2,
// '2': 3,
// '3': 4,
// '4': 5
// }

rest parameter (...) parameter of the function that returns an array with the parameters passed grouped together.

⚠️ Must always be the last in the parameters list.

//example:
let sum = function(a, b, c, ...numbers) {
     let total = a + b + c;
     for(let number of numbers) {
         total += number;
     }
     return total;
};
console.log(sum(1,2,3,4,5,6,7,8,9));
// 45

this implicit variable that makes reference to the object responsible for its invocation.

//example:
const rectangle = {
     x: 10,
     y: 2,
     calculateArea: function() {
         return this.x * this.y;
     }
};
console.log(rectangle.calculateArea());
// 20

call operation where it is possible to invoke a function passing this as a parameter.

⚠️ The first parameter must always be this.

//example:
const calculateArea = function(fn) {
     return fn(Math.PI * Math.pow(this.radius, 2));
};
const circle = {
     radius: 10,
     calculateArea
};
console.log(calculateArea.call(circle, Math.round));
// 314

apply operation where it is possible to invoke a function passing this as a parameter.

⚠️ The first parameter must always be this. From the second one, the parameters must be passed inside an array.

//example:
const calculateArea = function(fn) {
     return fn(Math.PI * Math.pow(this.radius, 2));
};
const circle = {
     radius: 10,
     calculateArea
};
console.log(calculateArea.apply(circle, [Math.ceil]));
// 315

bind operation that allows encapsulating this inside the function, returning it.

//example:
const calculateArea = function(fn) {
     return fn(Math.PI * Math.pow(this.radius, 2));
};
const circle = {
     radius: 10,
     calculateArea
};
const calculateAreaForCircle = calculateArea.bind(circle);
console.log(calculateAreaForCircle(Math.round));
// 314
console.log(calculateAreaForCircle(Math.ceil));
// 315

new operator that allows you to create a constructor function that returns a new object when invoked.

//example:
const Person = function(name, city, year) {
     this.name = name,
     this.city = city,
     this.year = year,
     this.getAge = function() {
         return ((new Date()).getFullYear() - this.year);
     }
};
const person1 = new Person("Linus Torvald", "Helsinki", 1969);
const person2 = new Person("Bill Gates", "Seattle", 1955);
console.log(person1);
// Person {
// name: 'Linus Torvald',
// city: 'Helsinki',
// year: 1969,
// getAge: [Function] }
console.log(person1.getAge());
// 51
console.log(person2);
// Person {
// name: 'Bill Gates',
// city: 'Seattle',
// year: 1955,
// getAge: [Function] }
console.log(person2.getAge());
// 65

prototype property that is bound to the __proto__ of the object created by the new operator.

//example:
const Person = function(name, city, year) {
     this.name = name,
     this.city = city,
     this.year = year
};
Person.prototype.getAge = function() {
     return ((new Date()).getFullYear() - this.year);
};
const person1 = new Person("Linus Torvald", "Helsinki", 1969);
const person2 = new Person("Bill Gates", "Seattle", 1955);
console.log(person1);
// Person {
// name: 'Linus Torvald',
// city: 'Helsinki',
// year: 1969,
// getAge: [Function] }
console.log(person1.getAge());
// 51
console.log(person2);
// Person {
// name: 'Bill Gates',
// city: 'Seattle',
// year: 1955,
// getAge: [Function] }
console.log(person2.getAge());
// 65

instanceof property that it is possible to verify if an object was created through a certain constructor function by analyzing its chain of prototypes.

//example:
const date = new Date();
console.log(date instanceof Date);
// true
console.log(date instanceof Object);
// true
console.log(date instanceof Array);
// false

1.7 Array

length Returns the size of the Array.

⚠️ Empty elements are not considered in the length.

//example:
const timeUnits = [];
timeUnits[0] = "minute";
timeUnits[1] = "hour";
timeUnits[2] = "day";
console.log(timeUnits.length);
// 3

1.7.1 Mutator methods API

When invoked they modify the array.

push Adds an element to the end of the Array.

//example:
const languages = [ "Python", "C", "Java" ];
languages.push("Ruby");
languages.push("Go");
console.log(languages);
// [ 'Python', 'C', 'Java', 'Ruby', 'Go' ]

pop Remove an element from the end of the Array.

//example:
const languages = [ "Python", "C", "Java", "Ruby", "Go" ];
languages.pop();
console.log(languages);
// [ 'Python', 'C', 'Java', 'Ruby' ]

unshift Adds an element at the beginning of the Array.

//example:
const languages = [ "Python", "C", "Java" ];
languages.unshift("Ruby");
console.log(languages);
// [ 'Ruby', 'Python', 'C', 'Java' ]

shift Remove an element at the beginning of the Array.

//example:
const languages = [ "Ruby", "Python", "C", "Java" ];
languages.shift();
console.log(languages);
// [ 'Python', 'C', 'Java' ]

splice Remove, replace or add one or more elements at a given position in the Array.

⚠️ Returns an array with the removed elements.

//example:
const languages = ["Python", "C", "Java"];
console.log(languages);
// [ 'Python', 'C', 'Java' ]
console.log(languages.splice(1, 1));
// [ 'Ç' ]
console.log(languages);
// [ 'Python', 'Java' ]
console.log(languages.splice(1, 0, "C++", "C#"));
// []
console.log(languages);
// [ 'Python', 'C++', 'C#', 'Java' ]
console.log(languages.splice(1, 2, "C"));
// [ 'C++', 'C#' ]
console.log(languages);
// [ 'Python', 'C', 'Java' ]

sort Order the elements according to the ordering function.

⚠️ The return with values -1 and 0 remains as it is and 1 inverts.

//example:
const languages = [
     {
         name: "Python",
         year: 1991
     },
     {
         name: "C",
         year: 1972
     },
     {
         name: "Java",
         year: 1995
     }
];
languages.sort(function (a, b) {
     return a.name.localeCompare(b.name); //is comparing if string a is < = or > than b
});
console.log(languages);
// [ { name: 'C', year: 1972 },
// { name: 'Java', year: 1995 },
// { name: 'Python', year: 1991 } ]

reverse Inverts the order of the elements.

//example:
const languages = ["Python", "C", "Java"];
languages.reverse();
console.log(languages);
// [ 'Java', 'C', 'Python' ]
languages.reverse();
console.log(languages);
// [ 'Python', 'C', 'Java' ]

fill Fill in the elements according to the start and end position.

//example:
const languages = ["Python", "C", "Java"];
languages.fill("JavaScript", 0, 2);
console.log(languages);
// [ 'JavaScript', 'JavaScript', 'Java' ]

1.7.2 Iteration methods API

When invoked, they iterate over the elements of the array.

forEach Executes the function passed by the parameter for each element.

//example:
const frameworks = ["Angular.js", "Ember.js", "Vue.js"];
frameworks.forEach(framework => console.log(framework));
// Angular.js
// ember.js
// vue.js

filter Returns a new array containing only the elements that returned true in the function passed by the parameter.

//example:
const frameworks = [
     {
         name: "Angular.js",
         contributors: 1598
     },
     {
         name: "Ember.js",
         contributors: 746
     },
     {
         name: "Vue.js",
         contributors: 240
     }
];
const result = frameworks.filter(function (framework) {
     return framework.contributors < 1000;
});
console.log(result);
// [
// { name: 'Ember.js', contributors: 746 },
// { name: 'Vue.js', contributors: 240 }
// ]

find Returns the first element that returned true in the function passed by the parameter.

//example:
const frameworks = [
     {
         name: "Angular.js",
         contributors: 1598
     },
     {
         name: "Ember.js",
         contributors: 746
     },
     {
         name: "Vue.js",
         contributors: 240
     }
];
const result = frameworks.find(function (framework) {
     return framework.name === "Angular.js";
});
console.log(result);
// { name: 'Angular.js', contributors: 1598 }

some Returns true if one or more elements returned true in the function passed by the parameter.

//example:
const frameworks = [
     {
         name: "Angular.js",
         contributors: 1598
     },
     {
         name: "Ember.js",
         contributors: 746
     },
     {
         name: "Vue.js",
         contributors: 240
     }
];
const result = frameworks.some(function (framework) {
     return framework.name === "Angular.js";
});
console.log(result);
// true

every Returns true if all elements returned true in the function passed by the parameter.

//example:
const frameworks = [
     {
         name: "Angular.js",
         contributors: 1598
     },
     {
         name: "Ember.js",
         contributors: 746
     },
     {
         name: "Vue.js",
         contributors: 240
     }
];
const result = frameworks.every(function (framework) {
     return framework.name.includes("js");
});
console.log(result);
// true

map Returns a new array based on the return of the function passed by the parameter.

//example:
const frameworks = [
     {
         name: "Angular.js",
         contributors: 1598
     },
     {
         name: "Ember.js",
         contributors: 746
     },
     {
         name: "Vue.js",
         contributors: 240
     }
];
const result = frameworks.map((framework) => framework.name);
console.log(result);
// [ 'Angular.js', 'Ember.js', 'Vue.js' ]

reduce Returns a value based on the return of the function passed by the parameter.

//example:
const frameworks = [
     {
         name: "Angular.js",
         contributors: 1598
     },
     {
         name: "Ember.js",
         contributors: 746
     },
     {
         name: "Vue.js",
         contributors: 240
     }
];
const result = frameworks.reduce(function (total, framework) {
     return total + framework.contributors;
}, 0); // the second parameter of reduce represents the initialization of the accumulator.
console.log(result);
// 2584

1.7.3 Accessor methods API

When invoked, they return specific information about the array.

indexOf Returns the position of the first element found.

⚠️ If the element is not found, returns -1.

//example:
const languages = ["Python", "C", "Java"];
console.log(languages.indexOf("Python"));
// 0
console.log(languages.indexOf("JavaScript"));
// -1

lastIndexOf Returns the position of the last element found.

⚠️ If the element is not found, returns -1.

//example:
const languages = ["Python", "C", "C", "Java"];
console.log(languages.lastIndexOf("C"));
// two
console.log(languages.lastIndexOf("JavaScript"));
// -1

includes Returns true if the element exists.

//example:
const languages = ["Python", "C", "Java"];
console.log(languages.includes("Python"));
// true
console.log(languages.includes("C"));
// true
console.log(languages.includes("JavaScript"));
// false

concat Returns a new array resulting from the concatenation of one or more arrays.

//example:
const ooLanguages = ["Smalltalk", "C++", "Simula"];
const functionalLanguages = ["Haskell", "Scheme"];
const languages = [].concat(ooLanguages, functionalLanguages);
console.log(languages);
// [ 'Smalltalk', 'C++', 'Simula', 'Haskell', 'Scheme' ]

slice Returns parts of a given array according to the start and end position.

//example:
const languages = ["Smalltalk", "C++", "Simula", "Haskell", "Scheme"];
console.log(languages.slice(0, 2));
// [ 'Smalltalk', 'C++' ]
console.log(languages.slice(2, 4));
// [ 'Simulate', 'Haskell' ]
console.log(languages.slice(1));
// [ 'C++', 'Simula', 'Haskell', 'Scheme' ]

join Convert the array to a String, joining the elements based on a separator.

//example:
const languages = ["Smalltalk", "C++", "Simula", "Haskell", "Scheme"];
console.log(languages.join(","));
// Smalltalk,C++,Simula,Haskell,Scheme
console.log(languages.join(";"))
// Smalltalk;C++;Simula;Haskell;Scheme
console.log(languages.join(" "))
// Smalltalk C++ Simulates Haskell Scheme

1.8 Map

It is an object that stores a set of keys and values that can be of any data type.

//example:
const timeUnits = new Map([['second', 1], ['minute', 60], > ['hour', 3600]]);
console.log(timeUnits);
// Map { 'second' => 1, 'minute' => 60, 'hour' => 3600 }

Array.from converts a map object back into an array of pairs.

//example:
const timeUnits = new Map([['second', 1], ['minute', 60], ['hour', 3600]]);
console.log(Array.from(timeUnits));
// [ [ 'second', 1 ], [ 'minute', 60 ], [ 'hour', 3600 ] ]

size Returns the number of elements.

//example:
const timeUnits = new Map([['second', 1], ['minute', 60], ['hour', 3600]]);
console.log(timeUnits.size);
// 3

set Adds a key and value pair.

//example:
const timeUnits = new Map();
console.log(timeUnits);
// map {}
timeUnits.set("second", 1);
timeUnits.set("minute", 60);
timeUnits.set("hour", 3600);
console.log(timeUnits);
// Map { 'second' => 1, 'minute' => 60, 'hour' => 3600 }

has Returns true if the key exists.

//example:
const timeUnits = new Map([['second', 1], ['minute', 60], ['hour', 3600]]);
console.log(timeUnits.has("hour"));
// true
console.log(timeUnits.has("day"));
// false

get Returns the value of a given key.

//example:
const timeUnits = new Map([['second', 1], ['minute', 60], ['hour', 3600]]);
console.log(timeUnits.get("second"));
// 1
console.log(timeUnits.get("minute"));
// 60
console.log(timeUnits.get("hour"));
// 3600

delete Remove a key and value pair. ⚠️ returns a bollean if the key exists true, if it does not exist false.

//example:
const timeUnits = new Map([['second', 1], ['minute', 60], ['hour', 3600]]);
timeUnits.delete("hour");
console.log(timeUnits);
// Map { 'second' => 1, 'minute' => 60 }

clear Remove all elements.

//example:
const timeUnits = new Map([['second', 1], ['minute', 60], ['hour', 3600]]);
console.log(timeUnits);
// Map { 'second' => 1, 'minute' => 60, 'hour' => 3600 }
timeUnits.clear();
console.log(timeUnits);
// map {}

1.8.1 WeakMap

It is an object, similar to Map, which only allows keys of type Object and maintains references weakly, being volatile and non-iterable.

⚠️ It only has the methods: set, has, get, delete.

// example:
const areas = new WeakMap();
const rectangle1 = {
     x: 10,
     y: 2
};
const rectangle2 = {
     x: 5,
     y: 3
};
function calculateArea(rectangle) {
     const area = rectangle.x * rectangle.y;
     if (areas.has(rectangle)) {
         console.log("Using cache");
         return areas.get(rectangle);
     }
     areas.set(rectangle, area);
     return area;
}
console.log(calculateArea(rectangle1));
// 20
console.log(calculateArea(rectangle1));
// Using cache
// 20
console.log(calculateArea(rectangle2));
// 15

1.9 Sep

It is an object that stores unique elements, which can be of any type of data. It has the size, forEach, has, delete, clear methods similar to MAP.

⚠️ Do not let the elements repeat themselves within its structure, if they repeat they are not added.

// example:
const set = new Set();
set.add("10");
set.add("10");
set.add("10");
console.log(set);
// Set { '10' }
console.log(set.size);
// 1

It is also possible to convert an array into a set by removing its repeated values.

// example:
const set = new Set();
set.add("10");
set.add("10");
set.add("10");
console.log(set);
// Set { '10' }
console.log(set.size);
// 1

Array.from converts a set object back to an array.

//example:
const charsets = new Set(["ASCII", "ISO-8599-1", "UTF-8"]);
console.log(charsets);
// Set { 'ASCII', 'ISO-8599-1', 'UTF-8' }
console.log(Array.from(charsets));
// [ 'ASCII', 'ISO-8599-1', 'UTF-8' ]

add Adds an element to the Set, similar to an Array push and a Map set.

//example:
const charsets = new Set();
charsets.add("ASCII");
charsets.add("ISO-8859-1");
charsets.add("UTF-8");
console.log(charsets);
// Set { 'ASCII', 'ISO-8859-1', 'UTF-8' }

1.9.1 WeakSet

It is an object, similar to Set, which only allows values of type Object and maintains references weakly, being volatile and not iterable.

⚠️ It only has the methods: add, has, delete similar to Set.

// example:
const circles = new WeakSet();
function Circle(radius) {
     circles.add(this);
     this.radius = radius;
}
Circle.prototype.calculateArea = function() {
     if (!circles.has(this)) throw "Invalid object";
     return Math.PI * Math.pow(this.radius, 2);
};
const circle1 = new Circle(10);
const circle2 = {
     radius: 5
};
console.log(circle1.calculateArea());
// 314.1592653589793
console.log(circle1.calculateArea.call(circle2));
// /home/guilherme/Documents/JSMasterclass/14_set/0_weakset/weakset_5.js:7
// if (!circles.has(this)) throw "Invalid object";
// ^
// Invalid object

2 Iterables and Iterators

These are conventions implemented by Arrays, Maps, Sets and Strings that make them iterable through an iteration protocol.

⚠️ Every Iterable has a key property Symbol.iterator that defines the iteration protocol for the object.

//example:
 const languages = ["Fortran", "Lisp", "COBOL"];
 const iterator = languages[Symbol.iterator]();

 console.log(iterator.next());
// { value: 'Fortran', done: false }
 console.log(iterator.next());
// { value: 'Lisp', done: false }
 console.log(iterator.next());
// { value: 'COBOL', done: false }
 console.log(iterator.next());
// { value: undefined, done: true }

for of Loops through the keys of an array*.

//example:
var txt = 'Ireland'; // iterable
var it = txt[Symbol.iterator](); // iterator
for (letter of txt) {
   console.log(letter);
   if (letter === 'a') break; // for the interaction
}
//I
//r
//and
//l
//The

for in Loops through the keys of an object*.

//example:
const languages = {
     Fortran: 1957,
     Lisp: 1958,
     COBOL: 1959
};
for (let language in languages) {
     console.log(language + ":" + languages[language]);
}
// fortran:1957
// lisp:1958
// COBOL:1959

spread operator (...) Expanded the elements of an iterable into an array.

//example:
const classicLanguages = ["Fortran", "Lisp", "COBOL"];
const modernLanguages = ["Python", "Ruby", "JavaScript"]
const languages = [...classicLanguages, ...modernLanguages];
console.log(languages);
// [ 'Fortran', 'Lisp', 'COBOL', 'Python', 'Ruby', 'JavaScript' ]

3 Classes

Classes are a special type of function that act as a template for creating objects._

⚠️ They do not suffer from hoisting.

//example:
const square = class {}
const square = new Square();
console.log(square);
// square {}

constructor is invoked when a class is instantiated and serves to initialize a given object.

//example:
class Square {
     constructor(side) {
         this.side = side;
     }
}
const square = new Square(4);
console.log(square);
// Square { side: 4 }

prototype methods depend on an instance to be invoked.

//example:
class Square {
     constructor(side) {
         this.side = side;
     }
    
     toString() {
         return `side: ${this.side}`;
     }
}
const square = new Square(4);
console.log(square.toString());
// side: 4

static methods does not depend on an instance to be invoked.

//example:
class Square {
     constructor(side) {
         this.side = side;
     }
    
     calculateArea() {
         return Math.pow(this.side, 2);
     }

     toString() {
         return `side: ${this.side} area: ${this.calculateArea()}`;
     }

     static fromArea(area) {
         return new Square(Math.sqrt(area));
     }
}
const square = Square.fromArea(16); // static method that does not depend on object instantiation.
console.log(square.toString());
// side: 4 area: 16

extends It is possible to create a hierarchy of classes through the keyword extends.

//example:
class Shape {
     constructor(side) {
         this.side = side;
     }
}

class Square extends Shape {
     calculateArea() {
         return Math.pow(this.side, 2);
     }

     toString() {
         return `side: ${this.side} area: ${this.calculateArea()}`;
     }

     static fromArea(area) {
         return new Square(Math.sqrt(area));
     }
}
const square = Square.fromArea(16);
console.log(square.toString());
// side: 4 area: 16

super When declaring a constructor in the subclass, it is necessary to invoke the superclass constructor through super() before using the this reference.

//example:
class Shape {
     toString() {
         return `area: ${this.calculateArea()}`;
     }
}

class Square extends Shape {
     constructor(side) {
         super();
         this.side = side;
     }
    
     calculateArea() {
         return Math.pow(this.side, 2);
     }

     toString() {
         return `side: ${this.side} ${super.toString()}`;
     }

     static fromArea(area) {
         return new Square(Math.sqrt(area));
     }
}
const square = Square.fromArea(16);
console.log(square.toString());
// side: 4 area: 16

4 proxy

A proxy is capable of intercepting several types of operations on a target object. Through methods, called trap, for various types of events related to an object, such as:

  • apply
  • construct
  • defineProperty
  • deleteProperty
  • get
  • getOwnPropertyDescriptor
  • getPrototypeOf
  • has
  • isExtensible
  • ownKeys
  • preventExtensions
  • set
  • setPrototypeOf

set The set method is invoked when a property is defined on the object. Receives as a parameter (target, key, value).

//example:
function createArray() {
     return new Proxy({}, {
         set(target, key, value) {
             target.length = target.length || 0;
             target.length++;
             target[key] = value;
         }
     });
}
const languages = createArray();
languages[0] = "Python";
languages[2] = "JavaScript";
console.log(languages);
// {
// '0': 'Python',
// '2': 'JavaScript',
// length: 2
// }
console.log(languages.length);
// two

deleteProperty The deleteProperty method is invoked when a property is deleted. Receives as a parameter (target, key, value).

//example:
function createArray() {
     return new Proxy({}, {
         set(target, key, value) {
             target.length = target.length || 0;
             target.length++;
             target[key] = value;
         },
         deleteProperty(target, key) {
             if (key in target) {
                 target.length--;
                 delete target[key];
             }
         }
     });
}
const languages = createArray();
languages[0] = "Python";
languages[1] = "Ruby";
languages[2] = "JavaScript";
console.log(languages);
// { '0': 'Python', '1': 'Ruby', '2': 'JavaScript', length: 3 }
console.log(languages.length);
// 3
delete languages[1];
delete languages[2];
delete languages[3];
console.log(languages);
// { '0': 'Python', length: 1 }
console.log(languages.length);
// 1

get The get method is invoked when a property is accessed. Receives as a parameter (target, key, value).

//example:
function createArray() {
     return new Proxy({}, {
         set(target, key, value) {
             target.length = target.length || 0;
             target.length++;
             target[key] = value;
         },
         get(target, key) {
             if (typeof key === "string" && key.match(/^\d+$/)) {
                 if (!(key in target)) {
                     throw `Property ${key} not found`;
                 }
             }
             return target[key];
         },
         deleteProperty(target, key) {
             if (key in target) {
                 target.length--;
                 delete target[key];
             }
         }
     });
}
const languages = createArray();
languages[0] = "Python";
languages[1] = "JavaScript";
console.log(languages[1]);
// JavaScript
console.log(languages[3]);
// Property 3 not found

5 Reflect API

The Reflect API has the same methods that exist in the Proxy, allowing the execution of different types of operations on the target object, they are:

  • apply
  • construct
  • defineProperty
  • deleteProperty
  • get
  • getOwnPropertyDescriptor
  • getPrototypeOf
  • has
  • isExtensible
  • ownKeys
  • preventExtensions
  • set
  • setPrototypeOf
//example:
function createArray() {
     return new Proxy({}, {
         set(target, key, value) {
             target.length = target.length || 0;
             target.length++;
             Reflect.set(target, key, value); // set value to key like: target[key] = value
         },
         get(target, key) {
             if (typeof key === "string" && key.match(/^\d+$/)) {
                 if (!Reflect.has(target, key)) {
                     throw `Property ${key} not found`;
                 }
             }
             return Reflect.get(target, key); // returns key value like: target[key]
         },
         deleteProperty(target, key) {
             if (Reflect.has(target, key)) {
                 target.length--;
                 Reflect.deleteProperty(target, key); // delete key the same way as: delete target[key]
             }
         }
     });
}
const languages = createArray();
languages[0] = "Python";
languages[1] = "JavaScript";
console.log(languages[1]);
// JavaScript
console.log(languages[3]);
// Property 3 not found

6 Modules

In ES6, or ECMAScript 2015, it was specified in the language itself, based on the concept of import and export.

⚠️ To use modules in Node.js, the files must have the extension .mjs in addition to executing with the flag --experimental-modules.

export. By means of the export keyword, it is possible to export any type of data existing within a module._

//example:
export const PI = 3.141592;
export function pow(base, exponential) {
     if (exponential === 0) return 1;
     return base * pow(base, exponential - 1);
}

We can also import and export by default using the default keyword.

//example:
export default class Circle {
     constructor(radius) {
         this.radius = radius;
     }
}
//in the other module where the Circle will be imported it will no longer be necessary to use the keys:
import Circle from './Circle';

import The import keyword imports any type of exported data into the module.

⚠️ It is not allowed to import and export within blocks.

//example:
import {PI, pow} from './math';
class Circle {
     constructor(radius) {
         this.radius = radius;
     }

     get area() {
         return PI * pow(this.radius, 2);
     }
}
const circle = new Circle(10);

It is possible to use an alias in the import, renaming what is being imported followed by the as and the alias.

//example:
import {PI as pi, pow} from './math';
class Circle {
     constructor(radius) {
         this.radius = radius;
     }

     get area() {
         return pi * pow(this.radius, 2);
     }
}
const circle = new Circle(10);

Through **** it is possible to import everything that is being exported into a single object.

//example:
import * as math from './math';
class Circle {
     constructor(radius) {
         this.radius = radius;
     }

     get area() {
         return math.PI * math.pow(this.radius, 2);
     }
}
const circle = new Circle(10);

7 promises

Promises are objects responsible for modeling asynchronous behavior, allowing their treatment in an easier and more direct way.

⚠️ To create a promise, just instantiate it, executing the function resolve in case of success, being handled by then.

//example:
function delayedSum(a, b) {
     return new Promise(function (resolve) {
         setTimeout(function() {
             solve(a + b);
         }, 1000);
     });
}
delayedSum(2, 2).then(function(result) {
     console.log(result);
});
// 4

In case of failure, the reject function must be executed, being handled by catch.

//example:
function delayedSum(a, b) {
     return new Promise(function (resolve) {
         setTimeout(function() {
             solve(a + b);
         }, 1000);
     });
}
delayedSum(2, ) // simulating an error
     .then(function(result) {
         console.log(result);
     }).catch(function (e) {
         console.log(e);
     });
// NaN

Promise.all We can execute several promises at the same time, returning after all succeed using Promise.all.

⚠️ Returns an array with the values of each executed function.

// example:
function delayedSum(a, b) {
     return new Promise(function (resolve, reject) {
         if (!a || !b) return reject("Invalid input");
         setTimeout(function() {
             solve(a + b);
         }, 1000);
     });
}
Promise.all([
     delayedSum(2, 2),
     delayedSum(4, 4)
]).then(function(values) { // values = [4, 8]
     let [a, b] = values;
     return delayedSum(a, b).then(function(result) {
         console.log(result);
     });
}).catch(function (e) {
     console.log(e);
});
// 12

Promise.race We can also execute several promises at the same time, returning after the first succeeds using Promise.race.

⚠️ Returns only the result of the first returned function.

// example:
function delayedSum(a, b) {
     return new Promise(function (resolve, reject) {
         if (!a || !b) return reject("Invalid input");
         setTimeout(function() {
             solve(a + b);
         }, Math.random() * 1000);
     });
}
Promise.race([
     delayedSum(2, 2),
     delayedSum(4, 4)
]).then(function(value) {
     return delayedSum(value, value).then(function(result) {
         console.log(result);
     });
}).catch(function (e) {
     console.log(e);
});
// 16

8 Generators

Generators make it possible to pause the execution of a given function, allowing the use of the event loop cooperatively.

⚠️ To create a generator just add * next to the function.

yield Upon encountering a yield, function execution is paused until the next() method is invoked again.

//example:
function* forever() {
    let value = 1;
    while (true) {
        console.log(value++);
        yield; // pause and exit the loop...
    }
}

function today() {
    console.log("Crossed to today");
}

const foreverGenerator = forever();
foreverGenerator.next();
today();
// 1
// Moved to today

Through yield it is possible to return values similarly to return in the value attribute of the returned obj.

// example:
function* forever() {
    let value = 1;
    while (true) {
        yield value++;
    }
}

function today() {
    console.log("Crossed to today");
}

const foreverGenerator = forever();
console.log(foreverGenerator.next());
// { value: 1, done: false }
console.log(foreverGenerator.next());
// { value: 2, done: false }
console.log(foreverGenerator.next());
// { value: 3, done: false }
today();
// Moved to today
console.log(foreverGenerator.next());
// { value: 4, done: false }
console.log(foreverGenerator.next());
// { value: 5, done: false }

In addition, it is also possible to send a value into the generator through the next method.

// example:
function* forever() {
    let value = 1;
    while (true) {
        let reset = yield value++; // YIELD receives value passed by the parameter in the next invocation
        if (reset) value = 1; // when the yield value passed to the RESET variable returns true, it will assign value 1
    }
}
const foreverGenerator = forever();
console.log(foreverGenerator.next());
  // { value: 1, done: false }
console.log(foreverGenerator.next());
  // { value: 2, done: false }
console.log(foreverGenerator.next(true)); // receive parameter through next
  // { value: 1, done: false }
console.log(foreverGenerator.next());
  // { value: 2, done: false }

next Generators use the next() method to iterate over the available values during function execution.

//example:
function* forever() {
    let value = 1;
    while (true) {
        console.log(value++);
    }
}

function today() {
    console.log("Crossed to today");
}

const foreverGenerator = forever();
foreverGenerator.next();
today();
// 1
// two
// this way it will run infinitely...
// and will not pass to the next function.

The next method returns an object containing value and done, following the iteration protocol.

// example:
function* forever() {
	let value = 1;
	while (true) {
		console.log(value++);
		yield;
	}
}
const foreverGenerator = forever();
console.log(foreverGenerator.next());
// { value: undefined, done: false }

return The return method closes the generator and can return a specific value.

//example:
function* forever() {
    let value = 1;
    while (true) {
        let reset = yield value++;
        if (reset) value = 1;
    }
}
const foreverGenerator = forever();
console.log(foreverGenerator.next());
// { value: 1, done: false }
foreverGenerator.return();
console.log(foreverGenerator.next());
// { value: undefined, done: true } does not execute the second next because it already hears a return before

return can also receive a specific value per parameter.

// example:
function* forever() {
    let value = 1;
    while (true) {
        let reset = yield value++;
        if (reset) value = 1;
    }
}

const foreverGenerator = forever();
console.log(foreverGenerator.next());
// { value: 1, done: false }
console.log(foreverGenerator.return("end"));
// { value: 'end', done: true }

throw The throw method throws an exception inside the generator, interrupting the flow of execution if the exception has not been handled properly.

// example:
function* forever() {
let value = 1;
while (true) {
         try {
             let reset = yield value++;
             if (reset) value = 1;
         } catch (e) {
             console.log(e);
         }
}
}
const foreverGenerator = forever();
console.log(foreverGenerator.next());
// { value: 1, done: false }
console.log(foreverGenerator.throw("error"));
// { value: 2, done: false }
// error
console.log(foreverGenerator.next());
// { value: 3, done: false }

9 Async/Await

async/await facilitates interaction with asynchronous calls, waiting for a given promise to return.

// example:
function sum(a, b) {
    return new Promise(function(resolve, reject) {
        if (!a || !b) return reject("Invalid input");
        setTimeout(function() {
            resolve(a + b);
        }, 1000);
    });
}

(async function () {
    const a = await sum(2);
    const b = await sum(4, 4);
    const result = await sum(a, b);
    console.log(result);
})();
// Invalid input
// Unhandled promise rejection. unhandled error warning

To handle possible exceptions associated with asynchronous calls, you can use a try/catch block.

// example:
function sum(a, b) {
     return new Promise(function(resolve, reject) {
         if (!a || !b) return reject("Invalid input");
         setTimeout(function() {
             solve(a + b);
         }, 1000);
     });
}

(async function() {
     try {
         const a = await sum(2);
         const b = await sum(4, 4);
         const result = await sum(a, b);
         console.log(result);
     } catch (e) {
         console.log(e);
     }
})();
// Invalid input

It is possible to iterate using async/await through for-of, avoid using forEach because it cannot work asynchronously.

// example:
function sum(a, b) {
     return new Promise(function(resolve, reject) {
         if (!a || !b) return reject("Invalid input");
         setTimeout(function() {
             solve(a + b);
         }, 1000);
     });
}

(async function() {
     try {
         const functions = [
             sum(2, 2),
             sum(4, 4)
         ];
         const results = [];
         for (let fn of functions) {
             const result = await fn;
             results.push(result);
         }
         const [a,b] = results;
         const result = await sum(a, b);
         console.log(result);
     } catch (e) {
         console.log(e);
     }
})();
  // 12

It is possible to use the for-await-of block to iterate over a promise iterator.

⚠️ To use it is necessary to use the flag --harmony-async-iteration.

// example:
function sum(a, b) {
     return new Promise(function(resolve, reject) {
         if (!a || !b) return reject("Invalid input");
         setTimeout(function() {
             solve(a + b);
         }, 1000);
     });
}

(async function() {
     try {
         const functions = [
             sum(2, 2),
             sum(4, 4)
         ];
         const results = [];
         for await (let result of functions) {
             results.push(result);
         }
         const [a,b] = results;
         const result = await sum(a, b);
         console.log(result);
     } catch (e) {
         console.log(e);
     }
})();
  // 12

10. Conclusion

What did you think of this post? Do you have any suggestions or criticisms? Leave a reaction or a comment below. And thanks for visiting! 😉

Comments