====== Javascript Notes ======
===== Chapter 1: Basics =====
==== Numbers ====
* 64 bit
* different notations
* 3 special values: Infinity; -infinity; NaN
==== Strings (no Char) ====
* single or double quotes, or backtick
* use backtick for newline or backslash
* unicode as standard (but js uses 16 bits/string; so some take two char positions)
* + for concatenation
* backtick for template literals: `half of 100 is ${100 /2}`
==== unary operators ====
* arithmetic
* word: typeof
==== Comparison ====
* Boolean values: true/false
* string comparison: uppercase < lowercase
* console.log(NaN == Nan) %%//%% false
* logical operators
==== ternary operators ====
* console.log(true ? 1: 2)
==== Empty values ====
* null
* undefined
* mostly interchangeable
==== Automatic type conversion ====
* console.log(null == undefined);
* // → true
* console.log(null == 0);
* // → false
* to do comparisons without type conversion, use === and !==
===== Chapter 2: Program Structure =====
* let, var, const
* for binding names, avoid keywords and reserved words
* functions - many values in the default environment have type function e.g. prompt
* function side effects and return values
* anything that produces a value is an expression in JavaScript
==== Control flow ====
* while
* do .. while
* for:
* updated to for(let entry of JOURNAL) {…} %%//%% avoids need for counter
for (let number = 0; number <= 12; number = number + 2) { console.log(number); }
* break
* switch .. case & default (like C/Java)
* don't forget the break
* camelCaseNamingConvention
* C-style comments // & /* ... */
==== Exercises ====
=== Looping triangle ===
for (let counter=1; counter <8; counter+=1){
let symbol = "#", otext = "";
let counter2 = 0;
while(counter2 < counter){
otext = otext + symbol;
counter2 += 1;
}
console.log(otext);
}
=== fizzbuzz ===
for (let ctr=1; ctr<=100; ctr++){
if (ctr%3==0 && ctr%5==0){
console.log(ctr + " fizzbuzz")
}
else if (ctr%3==0){
console.log(ctr + " fizz")
}
else if (ctr%5==0){
console.log(ctr + " buzz")
}
else {
console.log(ctr)
}
} if (ctr%5==0){
console.log("buzz")
}
=== Chessboard ===
let sym1 = "^", sym2 = "#";
let rowNumber = 7;
let colNumber = 7;
let outRow = ""
for (let y=1; y <= colNumber; y++){
if (y%2==0){
s1 = sym1, s2 = sym2;
}
else {
s1 = sym2, s2 = sym1;
}
for (let i = 1; i <= rowNumber; i++){
outRow = outRow + s1;
i += 1;
if (i <= rowNumber){
outRow = outRow + s2;
}
}
console.log(outRow);
outRow = "";
}
===== Chapter 3: Functions =====
==== Bindings abd scopes ====
* global, local
* functions
* using binding values aNewFunction = function{..}
* function declaration function aNewFunction(x){..}
* arrows aNewFunction = (x)=>{…}
* the call stack
* javascript ignores extra parameters: it has its uses
* default parameters in functions (like python)
* closures
* it can do recursions - slower
==== Exercise ====
=== Min ===
function min(x1, x2) {
return Math.min(x1, x2);
}
console.log(min(0, 10))
// → 0
console.log(min(0, -10));
// → -10
=== Recursion ===
function isEven(n){
if (n==0){
// console.log("In isEven, n is: ", n)
return true;
}
if (n==1){
return false;
}
else return (isEven(n-2));
}
console.log(isEven(0));
//true
console.log(isEven(1));
//false
console.log(isEven(3));
//false
console.log(isEven(4));
//true
console.log(isEven(43));
//false
=== Bean counting ===
== Part 1 ==
function countBs(aStr){
//console.log(aStr.length);
let charCounter = 0;
for (let i=0; i < aStr.length; i++){
if(aStr[i] == 'B'){
charCounter++;
}
}
return charCounter;
}
console.log(countBs("Bees"));
//1
console.log(countBs("Bumble Bees"));
//2
console.log(countBs("Bumblebees"));
== Part 2 ==
function countChars(aStr, char='B'){
//console.log(aStr.length);
let charCounter = 0;
for (let i=0; i < aStr.length; i++){
if(aStr[i] == char){
charCounter++;
}
}
return charCounter;
}
console.log(countChars("Bees"));
//1
console.log(countChars("Bumble Bees"));
//2
console.log(countChars("Bumblebees"));
//1
console.log(countChars("Bumblebees", 'e'));
//3
console.log(countChars("Bumblebees", 'z'));
//0
===== Chapter 4 Data/Higher order functions =====
* array methods: push, pop, shift, unshift, slice, indexOf, concat
* concat ΓÇ£addsΓÇ¥ arrays, also works on strings etc as one-element array
* strings, number, Boolean are not objects
* string methods: slice, indexOf, trim, caseChanges, zeroPad, split, join,
* … notation for rest parameter
* destructuring arrays
* JSON.stringify and JSON.parse
==== ====
// console.log(sum(range(1, 10)));
function range(startIndex,endIndex){
let rIndex = [];
for (startIndex; startIndex<=endIndex; startIndex++){
rIndex.push(startIndex);
}
console.log("range returns: ", rIndex);
return rIndex;
}
function sum(aNumArray){
console.log("in sum, aNumArray: ", aNumArray);
let total = 0;
for (let toAdd of aNumArray){
//toAdd = aNumArray[i]
//console.log("aNumber is: ", typeof(aNumber), aNumber)
total += toAdd;
}
return total;
}
aRange = range(1,10);
total = sum(aRange);
console.log(total);
==== Reversing an Array ====
function reverseArray(anArray){
let reversedArray = [];
let tempArray = [...anArray];
//https://www.freecodecamp.org/news/how-to-clone-an-array-in-javascript-1d3183468f6a/
for (let i=0; i
===== Reference: =====
Eloquent Javascript
==== History ====
* created 2021-06-13