- No installation needed.
- All web browsers can run JS.
To code:
- Sublime Text / VS Code / Atom
- freeCodeCamp Editor
- CodePen - JS & Console
- Scrimba
- Comments are lines of code that JS will intentionally ignore.
- They are just used to create notes for yourself and others about what the code does.
// in-line comment
/*
This is a multi line
comment
*/
-
In CS, data is anything that is meaningful to the computer.
-
JS provides 7 different datatypes that you can see.
-
Datatypes:
- Undefined
- null
- boolean
- string
- symbol
- number
- object
-
string is any sort of text
-
undefined: It is something that hasn't been defined. You may have a variable that you haven't set to be anything yet.
-
null means nothing. You've set it to be something and that sometimes is nothing.
-
boolean: means true or false.
-
symbol: It is an immutable primitive value that is unique.
-
object can store a lot of different key value pairs.
-
You are often going to set data into a variable.
-
A variable allows computers to store and manipulate data in a dynamic fashion.
-
It is basically a lable to point to the data.
-
A variable is almost like a box and you can fill it with anything.
-
To declare a variable, one way is to use the
var
keyword. -
var
stands for variable. -
It can be set to anything and can be of any datatypes above but it's common to set it to a string.
-
Example:
var myName = "Kamal";
-
There are 3 ways to declare a variable in JS.
-
2nd way is using
let
keyword. -
Example:
let ourName = "freeCodeCamp";
-
The third way is to use
const
. -
Example:
const pi = 3.14;
var
is going to be able to be used throughout your whole program.let
will only be used within the scope of where you declare it.const
is a variable that should never & can never change. i.e., it is immutable.
- There is a difference between declaring variables and assigning variables.
- Example:
var a; // declaration
var b = 2; // declaration + assignment
// It means '2' is assigned to 'b'
a = 7; // just assignment
var a = 9;
Example:
var a;
var b;
var c;
- They are uninitialized.
- That means their value is undefined.
- We have not set them to anything.
So,
var a = 5;
var b = 10;
var c = "I am a ";
a = a + 1;
b = b + 5;
c = c + "String!";
console.log(a);
console.log(b);
console.log(c);
6
15
I am a String!
- Variable names and function names in JS are case-sensitive.
- That means the capitalization matters.
So,
var aBc;
ABC = 10;
- Both are not the same even though they have the same letters.
- General practice is to use camel case.
- Adding 2 numbers in JS is pretty straightforward.
- You use the
+
operator.
var sum = 10 + 10;
console.log(sum);
20
- The
-
operator is used.
var diff = 45 - 33;
console.log(diff);
12
- The
*
operator is used.
var product = 8 * 10;
console.log(product);
80
- The
/
operator is used.
var quotient = 66 / 33;
console.log(quotient);
2
- To increment a number, add
1
to it.
var myVar = 87;
myVar = myVar + 1;
console.log(myVar);
myVar++;
console.log(myVar);
myVar += 1;
console.log(myVar);
++myVar;
console.log(myVar);
88
89
90
91
- To decrement a number, subtract
1
from it.
var myVar = 11;
myVar = myVar - 1;
console.log(myVar);
myVar--;
console.log(myVar);
myVar -= 1;
console.log(myVar);
--myVar;
console.log(myVar);
10
9
8
7
- These arealso referred to as floating point numbers or floats.
- Example:
- Any number that has a decimal point in it is a decimal point number.
var ourDecmial = 5.7;
- It is same as multiplying integers.
*
operator is used.
var product = 2.05 * 2.5;
console.log(product);
5.125
- It is same as dividing integers.
/
operator is used.
var quotient = 4.4 / 2.0;
console.log(quotient);
2.2
- The modulo
%
operator gives us the remainder of 2 numbers. - Example:
var remainder = 11 % 3;
console.log(remainder);
2
var a = 3;
var b = 17;
var c = 12;
a = a + 12;
b = a + b;
c = c + 7;
// The above statements can be written as
a += 12;
b += a;
c += 7;
var a = 11;
var b = 9;
var c = 3;
a = a - 6;
b = b - 15;
c = c + 1;
// The above statements can be written as
a -= 6;
b -= 15;
c -= 1;
var a = 5;
var b = 12;
var c = 4.6;
a = a * 5;
b = b * 3;
c = c * 10;
// The above statements can be written as
a *= 5;
b *= 3;
c *= 10;
var a = 48;
var b = 108;
var c = 33;
a = a / 12;
b = b / 4;
c = c / 11;
// The above statements can be written as
a /= 12;
b /= 4;
c /= 11;
- Can be enclosed in either single quotes or the double quotes.
var firstName = "Alan";
var lastName = "Turning";
Example:
var myStr = 'I am a "double quoted" string inside "double quotes"';
console.log(myStr);
I am a "double quoted" string inside "double quotes"
- Instead of using escape sequences you can first enclose the entire string in single quotes and then can use the double quotes in it.
var myStr = '<a href="http://www.example.com" target="_blank">link</a>';
- To use single quotes and double quotes you can use back ticks.
var myStr = `'<a href="www.google.com">link</a>'`;
console.log(myStr);
'<a href="www.google.com">link</a>'
Code | Output |
---|---|
\' |
single quote |
\" |
double quote |
\\ |
back slash |
\n |
new line |
\r |
carriage return |
\t |
tab |
\b |
back space |
\f |
form feed |
var myStr = "First Line \n\t\\Second Line\nThird Line";
console.log(myStr);
First Line
\Second Line
Third Line
var str1 = "first" + "second";
var str2 = "start" + "end";
console.log(str1);
console.log(str2);
firstsecond
startend
var str1 = "first";
str1 += "second";
console.log(str1);
firstsecond
var myName = "Alan";
var str = "My name is " + myName + ".";
console.log(str);
My name is Alan.
var anAdjective = "awesome";
var myStr = "I am ";
myStr += anAdjective;
console.log(myStr);
I am awesome
var nameLength = 0;
var myName = "Alan";
nameLength = myName.length;
console.log(nameLength);
4
var name = "Alan";
var firstCharacter = name[0];
console.log(firstCharacter);
A
- Strings are immutable. i.e., they cannot be altered once created.
- This does not mean they cannot be changed.
- Just that the individual characters of a string literal cannot be changed.
var myStr = "Jello";
myStr[0] = "H"; // Not Possible
myStr = "Hello"; // Possible
var firstName = "Ada";
var secondLetterOfFirstName = firstName[1];
console.log(secondLetterOfFirstName);
var lastName = "Lovelace";
var thirdLetterOfLastName = lastName[2];
console.log(thirdLetterOfLastName);
d
v
var firstName = "Ada";
var lastLetterOfFirstName = firstName[firstName.length - 1];
console.log(lastLetterOfFirstName);
// var lastName = "Lovelace";
a
var firstName = "Ada";
var secondLastLetterOfFirstName = firstName[firstName.length - 2];
console.log(secondLastLetterOfFirstName);
d
- In the arrays you can have any datatype.
var arr = ["Jan", 24];
console.log(arr);
- A nested array looks like this:
var arr = [
["Bulls", 23],
["White Sox", 34],
];
- Indexing works with arrays too.
- Array indexes can be used to modify the data at a given index.
- Bracket notation
[]
can be used to access elements of a multi-dimensional arrays. - Data can be appended to the end of an array using the
push()
function. It needs the value to be pushed as an argument. - Data can be removed from the end of an array using the
pop()
function. It returns the element removed. - Data can be removed from the start of an array using the
shift()
function. It returns the element removed. - Data can be appended to the start of an array using the
unshift()
function. It needs the value to be pushed as an argument. - Functions allow us to create reusable codes.
- It is possible to assign a variable without using
var
keyword. If done such way, then the variable becoms global. - You can use
===
for strict equality checking. - You can use
!==
for strict inequality checking. - The usual comparision operators [
>
,<
,>=
,<=
,] apply to JS too. - The usual logical operators [
!
,&&
,||
] apply to JS too. - If-else condition is also same as CPP.
- Switch case concepts is same as CPP.
- Switch case fall through is also present.
- Object's values can be used through the
.
operator or the[]
notation. - To delete a property use
delete <objectName>.<objectProperty>
. - To check if a object has a specific property:
<objName>.hasOwnProperty(<"propertyName">)
. It is often used with if condition.
/* Question:
If the value is an empty string remove that property.
If the property is tracks and if you have a value, instead of updating the
whole tracks, append the new value to the end of the tracks.
If the object does not have the property mentioned then create it.
*/
var collection = {
2548: {
album: "Slippery When Wet",
artist: "Bon Jovi",
tracks: ["Let it Rock", "You Give Love a Bad Name"],
},
2468: {
album: "1999",
artist: "Prince",
tracks: ["1999", "Little Red Corvette"],
},
1245: {
artist: "Robert Palmer",
tracks: [],
},
5439: {
album: "ABBA Gold",
},
};
// Making a copy of the orginal object
var collectionCopy = JSON.parse(JSON.stringify(collection));
// Answer starts here.
function updateRecords(id, prop, value) {
// if value is blank, remove the property
if (value === "") {
delete collection[id][prop];
} else if (prop === "tracks") {
// if the tracks property is doesn't exist, we need to create it
collection[id][prop] = collection.[id][prop] || [];
collection[id][prop].push(value);
} else {
collection[id][prop] = value;
}
return collection;
}
updateRecords(2468, "tracks", "test");
console.log(updateRecords(5439, "artist", "ABBA"));
Math.random()
returns a random number[0, 1)
Math.floor(Math.random() * n)
to generate random whole numbers[0, n)
- To get a random number 2 limits:
function randomRange(myMin, myMax) {
return Math.floor(Math.random() * (myMax - myMin + 1)) + myMin;
}
console.log(randomRange(5, 15));
parseInt()
takes in a string and returns an integerparseInt()
can also be used with a radix. i.e. bases.- Ternary operator
?:
concept is same as CPP. - Even though an array is declared as
const
, it can still be mutated.
const = [5, 7, 2];
function editInPlace() {
// s = [2, 7, 2]; This type of direct assignment is not possible.
// This is possible
s[0] = 2;
s[1] = 5;
s[2] = 7;
}
editInPlace();
console.log(s);
Object.freeze(<objectName>);
prevents mutation even whenconst
is used.
// Example of an anonymous function
var magic = function () {
return new Date();
};
- Whenever you have an anonymous function, you can convert it to arrow a function.
- The above thing can be done as:
// Example of an arrow function
var magic = () => {
return new Date();
};
- The above line can still be simplified.
var magic = () => new Date();
// Instead of `var`, `const` could be used.
- Arrow functions with parameters
// anonymous function
var myConcat = function (arr1, arr2) {
return arr1.concat(arr2);
};
console.log(myConcat([1, 2], [3, 4, 5]));
// arrow function
var myConcat = (arr1, arr2) => arr1.concat(arr2);
console.log(myConcat([1, 2], [3, 4, 5]));
// Once again, instead of `var`, `const` could be used.
- Arrow functions work really well with higher order functions(HOF)
such as
map
,filter
andreduce
- HOFs take functions as arguments for processing collections of data.
- Whenever one function takes another function as an argument, that is a good time to use an arrow function.
// Question: Get the square of positive integers.
const realNumberArray = [4, 5.6, -9.8, 3.14, 42, 6, 8, 8.34, -2];
const squareList = (arr) => {
// This line is succint because of the arrow functions
const squaredIntegers = arr
.filter(
// The filter function is going to give us the positive integers
// Usually you use paranthesis for arrow functions.
// but if you have a single argument it is not needed.
(num) => Number.isInteger(num) && num > 0
)
.map(
// To get the square of each number in the array we are using map()
// x means every element from the array that is passed to it
(x) => x * x
);
return squaredIntegers;
};
const squaredIntegers = squaredList(realNumberArray);
console.log(squaredIntegers);
- The rest operator allows you to create a function that takes a variable number of arguments.
- The rest operator is 3 dots
...
const sum = (function () {
return function sum(...args) {
return args.reduce((a, b) => a + b, 0);
};
})();
console.log(sum(1, 2, 3, 4, 5));
- The spread operator looks just like the rest operator (3 dots
...
) - It expands an already existing array or it spreads out an array.
- It takes an array and spreads out into its individual parts.
- So, it can be used to make a copy of an existing variable.
const arr1 = ["JAN", "FEB", "MAR", "APR", "MAY"];
let arr2;
(function () {
arr2 = [...arr1];
arr1[0] = "potato";
})();
console.log(arr2);
var voxel = { x: 3.6, y: 7.4, z: 6.54 };
// Old way of reading the object's values and assigning to another variable
var x = voxel.x; // x = 3.6
var y = voxel.y; // y = 7.4
var z = voxel.z; // z = 6.54
// New way of doing things.
// The values of x, y, z from the object are assigned to a, b, c respectively
const { x: a, y: b, z: c } = voxel; // a = 3.6, b = 7.4, c = 6.54
const LOCAL_FORECAST = {
today: { min: 72, max: 83 },
tomorrow: { min: 73.3, max: 84.6 },
};
function getMaxOfTomorrow(forecast) {
const {
tomorrow: { max: maxOfTomorrow },
} = forecast;
return maxOfTomorrow;
}
console.log(getMaxOfTomorrow(LOCAL_FORECAST));
- You can use destructuring assignment to assign variables from arrays.
const [z, x] = [1, 2, 3, 4, 5, 6];
console.log(z, x);
// 1,2
// assigns the first 2 elements of the array to z and x respectively.
- The difference between destructuring from arrays and destructuring from objects is that you cannot specify which element from the array should go into a variable.
- It just goes in order.
- However, if you want the 4th element, you can add empty commas.
const [z, x, , y] = [1, 2, 3, 4, 5, 6];
console.log(z, x, y);
// 1,2,4
- You can use destructuring of arrays to switch the places of variables.
let a = 8,
b = 6;
(() => {
[a, b] = [b, a];
})();
console.log(a);
console.log(b);
- We can do it to re-assign array elements.
const source = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
function removeFirstTwo(list) {
const [, , ...arr] = list;
return arr;
}
const arr = removeFirstTwo(source);
console.log(arr);
console.log(source);
[
3, 4, 5, 6,
7, 8, 9, 10
]
[
1, 2, 3, 4, 5,
6, 7, 8, 9, 10
]
const stats = {
max: 56.78,
standard_deviation: 4.34,
median: 34.54,
mode: 23.87,
min: -0.75,
average: 35.85,
};
const half = (function () {
return function half({ max, min }) {
return (max + min) / 2.0;
};
})();
console.log(stats);
console.log(half(stats));
{
max: 56.78,
standard_deviation: 4.34,
median: 34.54,
mode: 23.87,
min: -0.75,
average: 35.85
}
28.015
const person = {
name: "Zodiac Hasbro",
age: 56,
};
// Template literal with multi-line and string interpolation
const greeting = `Hello, my name is ${person.name}!
I am ${person.age} years old.`;
console.log(greeting);
const result = {
success: ["max-length", "no-amd", "prefer-arrow-functions"],
failure: ["no-var", "var-on-top", "linebreak"],
skipped: ["id-blacklist", "no-dup-keys"],
};
function makeList(arr) {
const resultDisplayArray = [];
for (let i = 0; i < arr.length; i++) {
resultDisplayArray.push(`<li class="text-warning">${arr[i]}</li>`);
}
return resultDisplayArray;
}
/**
* makeList(result.failure) should return:
* [ `<li class="text-warning">no-var</li>`,
* `<li class="text-warning">var-on-top</li>`,
* `<li class="text-warning">linebreak</li>` ]
**/
const resultDisplayArray = makeList(result.failure);
console.log(resultDisplayArray);
Hello, my name is Zodiac Hasbro!
I am 56 years old.
[
'<li class="text-warning">no-var</li>',
'<li class="text-warning">var-on-top</li>',
'<li class="text-warning">linebreak</li>'
]
Usually we do this
const createPerson = (name, age, gender) => {
return {
name: name,
age: age,
gender: gender,
};
};
console.log(createPerson("Zodiac Hasbro", 56, "male"));
- In the above example we have the
name:name
,age:age
andgender:gender
. - Instead of doing that, you can just do this:
const createPerson = (name, age, gender) => ({ name, age, gender });
console.log(createPerson("Zodiac Hasbro", 56, "male"));
- Old roundabout way of using a funciton inside an object
const bicycle = {
gear: 2,
setGear: function (newGear) {
this.gear = newGear;
},
};
bicycle.setGear(3);
console.log(bicycle.gear);
- ES6 way of doing it - just removed the
: function
part
const bicycle = {
gear: 2,
setGear(newGear) {
this.gear = newGear;
},
};
bicycle.setGear(3);
console.log(bicycle.gear);
- Older way of creating object with a
new
keyword.
var SpaceShuttle = function (targetPlanet) {
this.targetPlanet = targetPlanet;
};
var zeus = new SpaceShuttle("Jupiter");
console.log(zeus.targetPlanet);
- ES6 way of doing things:
class SpaceShuttle {
constructor(targetPlanet) {
this.targetPlanet = targetPlanet;
}
}
var zeus = new SpaceShuttle("Jupiter");
console.log(zeus.targetPlanet);
- Example 2
function makeClass() {
class Vegetable {
constructor(name) {
this.name = name;
}
}
return Vegetable;
}
const Vegetable = makeClass();
const carrot = new Vegetable("carrot");
console.log(carrot.name);
- Example 1
class Book {
constructor(author) {
this._author = author;
}
// getter
get writer() {
return this._author;
}
// setter
set writer(updatedAuthor) {
this._author = updatedAuthor;
}
}
- Example 2
function makeClass() {
class Thermostat {
constructor(temp) {
this._temp = (5 / 9) * (temp - 32);
}
get temperature() {
return this._temp;
}
set temperature(updatedTemp) {
this._temp = updatedTemp;
}
}
return Thermostat;
}
const Thermostat = makeClass();
const thermos = new Thermostat(76);
let temp = thermos.temperature;
thermos.temperature = 26;
temp = thermos.temperature;
console.log(temp);
- It gives simpler syntax
- It allows equal syntax for properties and methods
- It can secure better data quality
- It is useful for doing things behind-the-scenes
- It's perfect for classes that will usually only be instantiated once per include.
- In the past people would use the require function to import functions and code from other files.
- But now we have import and export.
- You can export code from one file and import it in another file.
- It also allows you to only import certain functions or certain variables.
// string_function.js
export const capitalizeString = str => str.toUpperCase()
// index.js
import { capitalizeString } from "./string_function"
const cap = capitalizeString("hello!");
console.log(cap);
const capitalizeString = (string) => {
return string.charAt(0).toUpperCase() + string.slice(1);
}
export { capitalizeString };
export const foo = "bar";
export const bar = "foo";
import * as capitalizeStrings from "capitalize_strings";
// capitalizeStrings is the object name.
// The object name can be anything but for best practices it is recommended
// to use the camel casing of the imported file.
// It is through this object we will access imported objects.
- In the previous exports, we saw about named exports.
- There is also something called as export defaults.
- This is a fallback export and it is often used if you want to export only one thing from a file.
export default function subtract(x,y) {return x - y;}
- It is pretty much the same as before but there is a slight difference.
- Lets say we have a file
math_functions.js
and in that we have a default exportsubtract
. - The difference is we won't be using curly braces for default import but we
still have to say what it is from. i.e.
math_functions
.
import subtract from "math_functions";
subtract(7,4);