====== 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