<html>
<head>
 <title>a2rp</title>
 <link rel="stylesheet" href="styles.css">
 <script type="text/javascript" src="jQuery_v3.6.0.js"></script>
 <script type="text/javascript" src="scripts.js"></script>
</head>
<body>
<div id="container">
 <h3>javascript algorithms and data structures</h3>
 <hr />
 javascript comments
 <ul>
 <li>//</li>
 <li>/**/</li>
 <li>/*<br />*/</li>
 </ul>
<pre>
<!-- comments -->
 // comments
 function program_1 () {
 console.log("this will be logged");
 // console.log("this will be commented");
 console.log("this will be logged again");
 /* console.log("this will be commented again"); */
 /*
 console.log("this will also be commented");
 */
 }
 program_1();
 // output:
 // this will be logged
 // this will be logged again
</pre>
<hr />
 javascript consists of 8 different types of data structures
 <ul>
 <li>undefined</li>
 <li>null</li>
 <li>boolean</li>
 <li>string</li>
 <li>symbol</li>
 <li>bigint</li>
 <li>number</li>
 <li>object</li>
 </ul>
 data is stored in variable with assignment operator<br />
<pre>
 // variables
 // 8 types: undefined, null, boolean, string, symbol, bigint, number, object
 var var_undefined;
 console.log(typeof var_undefined); // undefined
 var var_null = null;
 console.log(typeof var_null); // object
 // In JavaScript null is "nothing". It is supposed to be something that doesn't exist.
 // Unfortunately, in JavaScript, the data type of null is an object.
 // We can consider it a bug in JavaScript that typeof null is an object. It should be null.
 var var_boolean = true;
 console.log(typeof var_boolean); // boolean
 var var_string = "a2rp: an Ashish Ranjan presentation";
 var $_var_string = "dollar variable";
 console.log(typeof var_string, typeof $_var_string); // string string
 var var_bigint1 = 99n;
 var var_bigint2 = BigInt(99);
 console.log(typeof var_bigint1,typeof var_bigint2); // bigint bigint
 var var_number = 22.7;
 console.log(typeof var_number); // number
 var var_object = new Date();
 console.log(typeof var_object); // object
</pre>
<hr />
Assigning the Value of One Variable to Another
<br />
<pre>
// Assigning the Value of One Variable to Another
var variable_1 = 22.7;
var variable_2 = variable_1;
console.log("variable_2 = ",variable_2); // variable_2 = 22.7</pre>
<hr />
case sensitive variables
<br />
<pre>
 // javascript case sensitive variables
 var small_case_variable = true;
 var SMALL_CASE_VARIABLE = false;
 console.log(small_case_variable, SMALL_CASE_VARIABLE); // true false
</pre>
<hr />
Differences Between the var and let Keywords
<br />
<pre>
// Differences Between the var and let Keywords
var name = "Ashish";
var name = "Ranjan";
console.log("name:",name); // name: Ranjan
let name1 = "Ashish";
// Cannot redeclare block-scoped variable 'name1'.ts(2451)
// let name1 = "Ranjan"; // Uncaught SyntaxError: Identifier 'name1' has already been declared</pre>
<hr />
Declare a Read-Only Variable with the const Keyword
<br />
<pre>
// Declare a Read-Only Variable with the const Keyword
let mutable_var = 15;
mutable_var = 20;
console.log("mutable_var:",mutable_var); // mutable_var: 20

const readonly_var = 25;
// readonly_var = 30; // Uncaught TypeError: Assignment to constant variable.</pre>

<hr />
add numbers
<br />
<pre>
 // add numbers
 let number_1 = 20;
 let number_2 = 20.12;
 let number_3 = number_1 + number_2;
 console.log(number_3); // 40.120000000000005
</pre>

<hr />
subtract numbers
<br />
<pre>
// subtratc numbers
let subtract_number_1 = 20;
let subtract_number_2 = 20.12;
const subtract_result = subtract_number_1 - subtract_number_2;
console.log(subtract_result); // -0.120000000000001</pre>
<hr />

multiply numbers
<br />
<pre>
// multiply two numbers
const multiplied_numbers = 12 * 34;
console.log(multiplied_numbers); // 408</pre>
<hr />

divide numbers
<br />
<pre>
// divide numbers
const divide = 23 / 2;
console.log(divide); // 11.5</pre>
<hr />

increment
<br />
<pre>
// icrement
let i = 0, j = 0, k = 0;
console.log(++i,j++,k+=1); // 1 0 1
console.log(i,j,k); // 1 1 1
</pre>
<hr />

decrement
<br />
<pre>
// decrement
let a = 0, b = 0, c = 0;
console.log(--a,b--,c-=1); // -1 0 -1
console.log(a,b,c); // -1 -1 -1</pre>
<hr />

remainder
<br />
<pre>
// remainder
let remainder_num1 = 33;
let remainder_num2 = 10;
console.log(remainder_num1%remainder_num2); // 3</pre>
<hr />

Compound Assignment With Augmented operation
<br />
<pre>
// Compound Assignment With Augmented operation
let compound_assignment_number = 17;
console.log(compound_assignment_number+=7); // 24
console.log(compound_assignment_number-=7); // 17
console.log(compound_assignment_number*=7); // 119
console.log(compound_assignment_number/=7); // 17</pre>
<hr />

escape sequences
<br />
<ul>
 <li>\b   Backspace</li>
 <li>\f   Form Feed</li>
 <li>\n   New Line</li>
 <li>\r   Carriage Return</li>
 <li>\t   Horizontal Tabulator</li>
 <li>\v   Vertical Tabulator</li>
 <li>\'   Single quote</li>
 <li>\"   Double quote</li>
 <li>\\   Backslash</li>
</ul>
<pre>
// escape sequences
let before_escape_sequence_string = "a2rp: an Ashish Ranjan presentation";
let after_escape_sequence_string = "\ba2r\fp: \nan Ashish R\tanj\van p\'rese\"ntati\\on";
console.log(before_escape_sequence_string);
console.log(after_escape_sequence_string);
// output:
// a2rp: an Ashish Ranjan presentation
// scripts.js:134 a2rp:
// an Ashish R anj an p'rese"ntati\on</pre>
<hr />

concatenating strings with +
<br />
<pre>
// concatenating strings with +
console.log("a2rp: "+"an Ashish Ranjan presentation"); // a2rp: an Ashish Ranjan presentation
let concat_str1 = "a2rp: ";
let concat_str2 = "an Ashish Ranjan presentation";
let concat_str3 = concat_str1 + " - " + concat_str2;
console.log(concat_str3); // a2rp: - an Ashish Ranjan presentation
let concat_result = concat_str1 + concat_str2;
console.log(concat_result); // a2rp: an Ashish Ranjan presentation
concat_result += "plus_equal";
console.log(concat_result); // a2rp: an Ashish Ranjan presentationplus_equal</pre>
<hr />

string length
<br />
<pre>
// string length
let str_length = "a2rp: an Ashish Ranjan presentation";
console.log("length = "+str_length.length); // length = 35</pre>
<hr />

string index
<br />
<pre>
// string index
let str_index = "a2rp: an Ashish Ranjan presentation";
console.log("second char of string =",str_index[1],"fourth char of string =",str_index[3]); // second char of string = 2
fourth char of string = p</pre>
<hr />

immutable string
<br />
<pre>
// immutable string
let immutable_str = "ABCDEF";
immutable_str[0] = '0';
immutable_str[1] = '1';
console.log(immutable_str); // ABCDEF
immutable_str = "123456";
console.log(immutable_str[0]); // 1
console.log("last character is",immutable_str[immutable_str.length-1]); // last character is 6</pre>
<hr />

arrays
<br />
<pre>
// arrays
let array_var = ["a2rp:", "an", "Ashish", "Ranjan", "presentation"];
console.log("array_var: ",array_var);
// output:
// (5) ['a2rp:', 'an', 'Ashish', 'Ranjan', 'presentation']
// 0: "a2rp:"
// 1: "an"
// 2: "Ashish"
// 3: "Ranjan"
// 4: "presentation"
// length: 5
// [[Prototype]]: Array(0)
let nestarray_var = [["a2rp:"], ["an", "Ashish", "Ranjan", "presentation"]];
console.log(nestarray_var);
console.log(nestarray_var[1][0]); // an
// output:
// (2) [Array(1), Array(4)]
// 0: ['a2rp:']
// 1: (4) ['an', 'Ashish', 'Ranjan', 'presentation']
// length: 2
// [[Prototype]]: Array(0)
for (let i=0; i<array_var.length; ++i) { console.log("at place "+(i+1)+" value=",array_var[i]);
 }
 // output:
 // at place 1 value = a2rp:
 // at place 2 value = an
 // at place 3 value = Ashish
 // at place 4 value = Ranjan
 // at place 5 value = presentation
 array_var[1] = " the"; for (let i=0; i<array_var.length; ++i) { console.log("at place "+(i+1)+" value=",array_var[i]);
 }
 // output:
 // at place 1 value = a2rp:
 // at place 2 value = the
 // at place 3 value = Ashish
 // at place 4 value = Ranjan
 // at place 5 value = presentation
 array_var.push([1,2,3]);
 for (let i=0; i<array_var.length; ++i) {
 console.log(" at place "+(i+1)+" value=",array_var[i]);
 }
 // output:
 // at place 1 value = a2rp:
 // at place 2 value = the
 // at place 3 value = Ashish
 // at place 4 value = Ranjan
 // at place 5 value = presentation
 // at place 6 value = (3) [1, 2, 3]
 console.log(array_var.pop()); // [1, 2, 3]
 console.log(array_var.pop()); // presentation
 for (let i=0; i<array_var.length; ++i) {
 console.log(" at place "+(i+1)+" value=",array_var[i]);
 }
 // output:
 // at place 1 value = a2rp:
 // at place 2 value = the
 // at place 3 value = Ashish
 // at place 4 value = Ranjan

 array_var.shift();
 console.log(array_var); // (3) ['the', 'Ashish', 'Ranjan']
 array_var.shift();
 console.log(array_var); // ['Ashish', 'Ranjan']
 array_var.unshift(" 1"); console.log(array_var); // ['1', 'Ashish' , 'Ranjan' ] array_var.unshift("2");
 console.log(array_var); // ['2', '1' , 'Ashish' , 'Ranjan' ]
</pre>
<hr />

functions
<br />
<pre>
 // functions
 function test_function(number1,number2=3) {
 return number1 + number2;
 }
 let return_value = test_function(25);
 console.log(return_value); // 28</pre>
<hr />

Global Scope and Functions
<br />
Variables which are declared without the <b>let</b> or <b>const</b> keywords are automatically created in the global scope.
<br />
<pre>
 // variable scope and functions
 function variable_scope_function() {
 var variable_scope_number_1 = 12;
 variable_scope_number_2 = 23;
 console.log(variable_scope_number_1 + variable_scope_number_2);
 }
 variable_scope_function(); // 35

 try {
 console.log(variable_scope_number_1);
 } catch (error) {
 console.log(error.message); // variable_scope_number_1 is not defined
 }
 console.log(variable_scope_number_2); // 23</pre>
<hr />

global variable vs local variable precedence
<br />
<pre>
 // global variable vs local variable precedence
 let variable_3 = "outside global variable";
 function function_3() {
 let variable_3 = "inside local variable";
 console.log(variable_3);
 }
 function_3(); // inside local variable
</pre>
<hr />

array add and remove elements
<br />
<pre>
 // array add at last and remove first
 let number_array_1 = [1,2,3,4,5,6];
 let number2add = 7;
 function addlast_removefirst(the_array,number) {
 // add element at last
 the_array.push(number);
 console.log(JSON.stringify(the_array));
 // array.splice(index, howmany, item1, ....., itemX)
 // index: Required: The position to add/remove items: Negative value defines the position from the end of the array
 // howmany: Optional: Number of items to be removed
 // item1, ..., itemX: Optional: New elements(s) to be added
 the_array.splice(0,1);
 console.log("after remove first");
 console.log(JSON.stringify(the_array));
 // return the_array;
 }
 addlast_removefirst(number_array_1,number2add);
</pre>
<hr />

boolean values
<br />
<pre>
 // boolean values
 let boolean_value = false;
 console.log("boolean_value:",boolean_value,", its opposite:",!boolean_value); // boolean_value: false , its opposite: true
</pre>
<hr />

boolean to check condition
<br />
<pre>
 // boolean conditional
 if (boolean_value) {
 console.log("boolean value is true");
 } else if(!boolean_value) {
 console.log("boolean value is false");
 }
 // output:
 // boolean value is false 
</pre>
<hr />

comparison with equality operator
<br />
<pre>
 // comparison with equality operator
 console.log(1==1); // true
 console.log(1==2); // false
 console.log("1"==1); // true
 console.log(1=="1"); // true
</pre>
<hr />

comparison with strict equality operator
<br />
<pre>
 // strict equality operator
 console.log(1===1); // true
 console.log(1==2); // false
 console.log("1"===1); // false
 console.log(1==="1"); // false
</pre>
<hr />

comparison with not equality operator
<br />
<pre>
 // comparison with not equality operator
 console.log(1!=2); // true
 console.log(1!="1"); // false
 console.log(1!='1'); // false
 console.log(1!=true); // false
 console.log(0!=false); // false
</pre>
<hr />

strictly not equality operator
<br />
<pre>
 // strictly not equality operator
 console.log(3!==3); // false
 console.log(3!=='3'); // true
 console.log(4!==3); // true
</pre>
<hr />

switch case
<br />
<pre>
 // switch case
 for (let i=0; i<9; ++i) {
 switch (i) {
 case 1:
 console.log(i,"one");
 break;
 case 2:
 console.log(i,"two");
 break;
 case 3:
 console.log(i,"three");
 break;
 case 4:
 case 5:
 case 6:
 console.log(i,"four five six");
 break;
 case 7:
 console.log(i,"seven");
 break;
 default:
 console.log(i,"i,neither one nor two, three, four, five, six or seven... this is default");
 }
 }
 // output:
 // 0 'i,neither one nor two, three, four, five, six or seven... this is default'
 // 1 'one'
 // 2 'two'
 // 3 'three'
 // 4 'four five six'
 // 5 'four five six'
 // 6 'four five six'
 // 7 'seven'
 // 8 'i,neither one nor two, three, four, five, six or seven... this is default'
</pre>
<hr />

returning boolean from functions
<br />
<pre>
 // returning boolean from functions
 function return_booean(num1,num2) {
 return num1 > num2;
 }
 console.log(return_booean(45,34)); // true
 console.log(return_booean(-45,34)); // false
</pre>

objects
<br />
<pre>
 // object
 const object1 = {
 "property_1": "value 1",
 2: "value 2",
 "property three": "value three",
 property_four: "value four"
 };
 console.log(object1); // {2: 'value 2', property_1: 'value 1', property three: 'value three', property_four: 'value four'}
 console.log(JSON.stringify(object1)); // {"2":"value 2","property_1":"value 1","property three":"value three","property_four":"value four"}
</pre>
<hr />

accessing objects
<br />
<pre>
 // accessing objects values with properties
 let four;
 const object2 = {
 "prop_one": "value 1",
 2: "value 2",
 3.3: "three point 3",
 four: "value 4",
 prop_five: "value 5",
 "property space": "value for property space"
 };
 console.log(object2); // {2: 'value 2', prop_one: 'value 1', 3.3: 'three point 3', four: 'value 4', prop_five: 'value 5', property space: 'value for property space'}
 console.log(JSON.stringify(object2)); // {"2":"value 2","prop_one":"value 1","3.3":"three","four":"value 4","prop_five":"value 5"}
 console.log("object2['prop_one']:",object2["prop_one"]); // object2['prop_one']: value 1
 let property_2 = object2[2];
 console.log("property_2",property_2); // property_2 value 2
 console.log("object2[3.3]",object2[3.3]); // object2[3.3] three point 3
 console.log("object2.four",object2.four); // object2.four value 4
 console.log("object2.prop_five",object2.prop_five); // object2.prop_five value 5
 console.log("object2['property space']",object2["property space"]); // object2['property space'] value for property space
 object2["property space"] = "changed value";
 console.log(JSON.stringify(object2)); // {"2":"value 2","prop_one":"value 1","3.3":"three point 3","four":"value 4","prop_five":"value 5","property space":"changed value"}
 object2.new_property = "new property added";
 console.log(JSON.stringify(object2)); // {"2":"value 2","prop_one":"value 1","3.3":"three point 3","four":"value 4","prop_five":"value 5","property space":"changed value","new_property":"new property added"}
 delete object2.four;
 console.log(JSON.stringify(object2)); // {"2":"value 2","prop_one":"value 1","3.3":"three point 3","prop_five":"value 5","property space":"changed value","new_property":"new property added"}
</pre>
<hr />

traversing and testing objects with properties [hasOwnProperty]
<br />
<pre>
 // hasownproperty
 for (const key in object2) {
 if (object2.hasOwnProperty(key)) {
 console.log(`${key}: ${object2[key]}`);
 }
 }
 // output:
 // 2: value 2
 // prop_one: value 1
 // 3.3: three point 3
 // prop_five: value 5
 // property space: changed value
 // new_property: new property added
</pre>
<hr />

manipulating complex objects
<br />
<pre>
 const myMusic = [
 {
 "artist": "Billy Joel",
 "title": "Piano Man",
 "release_year": 1973,
 "formats": [
 "CD",
 "8T",
 "LP"
 ],
 "gold": true
 },
 {
 "artist": "artist new",
 "title": "title new",
 "release_year": 2022,
 "formats": [".wav", ".mp3"],
 }
 ];
 console.log("accessing value deep inside array",myMusic[1]["formats"][1]); // accessing value deep inside array .mp3
</pre>
<hr />

accessing nested objects
<br />
<pre>
 // accessing nested objects
 let object3 = {
 "one": {
 "oneone_prop": "oneone_value",
 "onetwo_prop": "onetwo_value"
 },
 "two": {
 "twoone_prop": {
 "twooneone_prop": "twooneone_value",
 "twoonetwo_prop": "twoonetwo_value"
 }
 }
 };
 console.log("object3['two']['twoone_prop']['twooneone_prop']:",object3["two"]["twoone_prop"]["twooneone_prop"]); // object3['two']['twoone_prop']['twooneone_prop']: twooneone_value
</pre>
<hr />

accessing nested arrays
<br />
<pre>
 // accessing nested arrays
 let nested_array = [
 {
 one_one: "1 one",
 one_two: ["1 two_one","1 two_two","1 two_three","1 two_four"]
 },
 {
 two_one: "2 one",
 two_two: ["2 two_one","2 two_two","2 two_three","2 two_four"]
 }
 ];
 console.log(JSON.stringify(nested_array)); // [{"one_one":"1 one","one_two":["1 two_one","1 two_two","1 two_three","1 two_four"]},{"two_one":"2 one","two_two":["2 two_one","2 two_two","2 two_three","2 two_four"]}]
</pre>
<hr />

iterate array, odd even reverse iterate
<br />
<pre>
 // iterate array
 let iterate_array = [];
 let increment = 0;
 while (++increment<=10) {
 iterate_array.push(increment);
 }
 console.log(JSON.stringify(iterate_array)); // [1,2,3,4,5,6,7,8,9,10]
 console.log("reverse iterate array");
 let odd_numbers = "";
 let even_numbers = "";
 for (let i=iterate_array.length-1; i>=0; --i) {
 // console.log(iterate_array[i],);
 if (iterate_array[i]%2==0) {
 even_numbers += (iterate_array[i] + " ");
 } else if (iterate_array[i]%2!=0) {
 odd_numbers += (iterate_array[i] + " ");
 }
 }
 console.log("odd numbers: ",odd_numbers, "even numbers: ", even_numbers); // odd numbers: 9 7 5 3 1 even numbers: 10 8 6 4 2 
</pre>
<hr />

nested for loops
<br />
<pre>
 // nested for loops
 let nested_forloop = [[1,2,3],[4,5,6,7,8,9],[-1,0,1]];
 console.log("complete array: ",JSON.stringify(nested_forloop)); // complete array: [[1,2,3],[4,5,6,7,8,9],[-1,0,1]]
 let first_row_values = "";
 let second_row_values = "";
 let third_row_values = "";
 for (let i=0; i<nested_forloop.length; ++i) {
 for (let j=0; j<nested_forloop[i].length; ++j) {
 if (i==0) { first_row_values += (" " + nested_forloop[i][j]); }
 else if (i==1) { second_row_values += (" " + nested_forloop[i][j]); }
 else if (i==2) { third_row_values += (" " + nested_forloop[i][j]); }
 }
 }
 console.log("first_row_values: " + first_row_values); // first_row_values: 1 2 3
 console.log("second_row_values: " + second_row_values); // second_row_values: 4 5 6 7 8 9
 console.log("third_row_values: " + third_row_values); // third_row_values: -1 0 1
</pre>
<hr />

recursion
<br />
<pre>
 // recursion
 function count_down(number) {
 console.log(number);
 number = number - 1;
 if (number > 0) {
 count_down(number);
 }
 }
 count_down(5);
 // output:
 // 5
 // 4
 // 3
 // 2
 // 1
</pre>
<pre>
 function sum(number) {
 console.log("the number: ",number);
 if (number<=1) {
 return number;
 }
 return number + sum(number-1);
 }
 console.log("result: ",sum(5));
 // output:
 // the number: 5
 // the number: 4
 // the number: 3
 // the number: 2
 // the number: 1
 // result: 15
</pre>
<hr />

random number
<br />
<pre>
 // random
 let minimum_number = 10;
 let maximum_number = 100;
 for (let i=0; i<5; ++i) {
 let random_number = Math.floor(Math.random() * (maximum_number - minimum_number)) + minimum_number;
 console.log(`random number between between ${minimum_number} and ${maximum_number} is ${random_number}`);
 }
 // output:
 // random number between between 10 and 100 is 80
 // random number between between 10 and 100 is 39
 // random number between between 10 and 100 is 83
 // random number between between 10 and 100 is 49
 // random number between between 10 and 100 is 95
</pre>
<hr />

parseInt
<br />
<pre>
 // parseInt
 console.log(parseInt("007")); // 7
 console.log(parseInt("5dr")); // 5
 console.log(parseInt("59")); // 59
 console.log(parseInt("0x123")); // 291
 console.log(parseInt("11",2)); // 3
</pre>
<hr />

ternary operator
<br />
<pre>
 // ternary operator
 console.log(1>2?true:false); // false
</pre>
<pre>
 let ternary_result = 2 > 1 ? 2 > 3 ? "2 > 3" : "2 < 3" : "2 < 1";
 console.log(ternary_result); // 2 < 3
</pre>








</div>
</body>
</html>




$(document).ready(function(){
 console.log("a2rp: an Ashish Ranjan presentation");

 // not working: why ???
 // const element = document.getElementById("container");
 // element.scrollTop = element.scrollHeight;
 // console.log(element.scrollHeight);

 $('html,body').animate({scrollTop: document.body.scrollHeight},"slow");

 // comments
 function program_1 () {
 console.log("this will be logged");
 // console.log("this will be commented");
 console.log("this will be logged again");
 /* console.log("this will be commented again"); */
 /*
 console.log("this will also be commented");
 */
 }
 program_1();
 // output:
 // this will be logged
 // this will be logged again

 console.log("\n");
 // variables
 // 8 types: undefined, null, boolean, string, symbol, bigint, number, object
 var var_undefined;
 console.log(typeof var_undefined); // undefined
 var var_null = null;
 console.log(typeof var_null); // object
 // In JavaScript null is "nothing". It is supposed to be something that doesn't exist.
 // Unfortunately, in JavaScript, the data type of null is an object.
 // We can consider it a bug in JavaScript that typeof null is an object. It should be null.
 var var_boolean = true;
 console.log(typeof var_boolean); // boolean
 var var_string = "a2rp: an Ashish Ranjan presentation";
 var $_var_string = "dollar variable";
 console.log(typeof var_string, typeof $_var_string); // string string
 var var_bigint1 = 99n;
 var var_bigint2 = BigInt(99);
 console.log(typeof var_bigint1,typeof var_bigint2); // bigint bigint
 var var_number = 22.7;
 console.log(typeof var_number); // number
 var var_object = new Date();
 console.log(typeof var_object); // object

 console.log("\n");
 // Assigning the Value of One Variable to Another
 var variable_1 = 22.7;
 var variable_2 = variable_1;
 console.log("variable_2 = ",variable_2); // variable_2 = 22.7

 console.log("\n");
 // javascript case sensitive variables
 var small_case_variable = true;
 var SMALL_CASE_VARIABLE = false;
 console.log(small_case_variable, SMALL_CASE_VARIABLE); // true false

 console.log("\n");
 // Differences Between the var and let Keywords
 var name = "Ashish";
 var name = "Ranjan";
 console.log("name:",name); // name: Ranjan
 let name1 = "Ashish";
 // Cannot redeclare block-scoped variable 'name1'.ts(2451)
 // let name1 = "Ranjan"; // Uncaught SyntaxError: Identifier 'name1' has already been declared

 console.log("\n");
 // Declare a Read-Only Variable with the const Keyword
 let mutable_var = 15;
 mutable_var = 20;
 console.log("mutable_var:",mutable_var); // mutable_var: 20

 const readonly_var = 25;
 // readonly_var = 30; // Uncaught TypeError: Assignment to constant variable. 

 console.log("\n");
 // add numbers
 let number_1 = 20;
 let number_2 = 20.12;
 let number_3 = number_1 + number_2;
 console.log(number_3); // 40.120000000000005

 console.log("\n");
 // subtratc numbers
 let subtract_number_1 = 20;
 let subtract_number_2 = 20.12;
 const subtract_result = subtract_number_1 - subtract_number_2;
 console.log(subtract_result); // -0.120000000000001

 console.log("\n");
 // multiply two numbers
 const multiplied_numbers = 12 * 34; 
 console.log(multiplied_numbers); // 408

 console.log("\n");
 // divide numbers
 const divide = 23 / 2;
 console.log(divide); // 11.5

 console.log("\n");
 // icrement
 let i = 0, j = 0, k = 0;
 console.log(++i,j++,k+=1); // 1 0 1
 console.log(i,j,k); // 1 1 1

 console.log("\n");
 // decrement
 let a = 0, b = 0, c = 0;
 console.log(--a,b--,c-=1); // -1 0 -1
 console.log(a,b,c); // -1 -1 -1

 console.log("\n");
 // remainder
 let remainder_num1 = 33;
 let remainder_num2 = 10;
 console.log(remainder_num1%remainder_num2); // 3

 console.log("\n");
 // Compound Assignment With Augmented operation
 let compound_assignment_number = 17;
 console.log(compound_assignment_number+=7); // 24
 console.log(compound_assignment_number-=7); // 17
 console.log(compound_assignment_number*=7); // 119
 console.log(compound_assignment_number/=7); // 17

 console.log("\n");
 // escape sequences
 let before_escape_sequence_string = "a2rp: an Ashish Ranjan presentation";
 let after_escape_sequence_string = "\ba2r\fp: \nan Ashish R\tanj\van p\'rese\"ntati\\on";
 console.log(before_escape_sequence_string);
 console.log(after_escape_sequence_string);
 // output:
 // a2rp: an Ashish Ranjan presentation
 // scripts.js:134 a2rp: 
 // an Ashish R anj an p'rese"ntati\on

 console.log("\n");
 // concatenating strings with +
 console.log("a2rp: "+"an Ashish Ranjan presentation"); // a2rp: an Ashish Ranjan presentation
 let concat_str1 = "a2rp: ";
 let concat_str2 = "an Ashish Ranjan presentation";
 let concat_str3 = concat_str1 + " - " + concat_str2;
 console.log(concat_str3); // a2rp: - an Ashish Ranjan presentation
 let concat_result = concat_str1 + concat_str2;
 console.log(concat_result); // a2rp: an Ashish Ranjan presentation
 concat_result += "plus_equal";
 console.log(concat_result); // a2rp: an Ashish Ranjan presentationplus_equal

 console.log("\n");
 // string length
 let str_length = "a2rp: an Ashish Ranjan presentation";
 console.log("length = "+str_length.length); // length = 35

 console.log("\n");
 // string index
 let str_index = "a2rp: an Ashish Ranjan presentation";
 console.log("second char of string =",str_index[1],"fourth char of string =",str_index[3]); // second char of string = 2 fourth char of string = p

 console.log("\n");
 // immutable string
 let immutable_str = "ABCDEF";
 immutable_str[0] = '0';
 immutable_str[1] = '1';
 console.log(immutable_str); // ABCDEF
 immutable_str = "123456";
 console.log(immutable_str[0]); // 1
 console.log("last character is",immutable_str[immutable_str.length-1]); // last character is 6

 console.log("\n");
 // arrays
 let array_var = ["a2rp:", "an", "Ashish", "Ranjan", "presentation"];
 console.log("array_var: ",array_var);
 // output:
 // (5) ['a2rp:', 'an', 'Ashish', 'Ranjan', 'presentation']
 // 0: "a2rp:"
 // 1: "an"
 // 2: "Ashish"
 // 3: "Ranjan"
 // 4: "presentation"
 // length: 5
 // [[Prototype]]: Array(0)
 let nestarray_var = [["a2rp:"], ["an", "Ashish", "Ranjan", "presentation"]];
 console.log(nestarray_var);
 console.log(nestarray_var[1][0]); // an
 // output:
 // (2) [Array(1), Array(4)]
 // 0: ['a2rp:']
 // 1: (4) ['an', 'Ashish', 'Ranjan', 'presentation']
 // length: 2
 // [[Prototype]]: Array(0)
 for (let i=0; i<array_var.length; ++i) {
 console.log("at place "+(i+1)+" value =",array_var[i]);
 }
 // output:
 // at place 1 value = a2rp:
 // at place 2 value = an
 // at place 3 value = Ashish
 // at place 4 value = Ranjan
 // at place 5 value = presentation
 array_var[1] = "the";
 for (let i=0; i<array_var.length; ++i) {
 console.log("at place "+(i+1)+" value =",array_var[i]);
 }
 // output:
 // at place 1 value = a2rp:
 // at place 2 value = the
 // at place 3 value = Ashish
 // at place 4 value = Ranjan
 // at place 5 value = presentation
 array_var.push([1,2,3]);
 for (let i=0; i<array_var.length; ++i) {
 console.log("at place "+(i+1)+" value =",array_var[i]);
 }
 // output:
 // at place 1 value = a2rp:
 // at place 2 value = the
 // at place 3 value = Ashish
 // at place 4 value = Ranjan
 // at place 5 value = presentation
 // at place 6 value = (3) [1, 2, 3]
 console.log(array_var.pop()); // [1, 2, 3]
 console.log(array_var.pop()); // presentation
 for (let i=0; i<array_var.length; ++i) {
 console.log("at place "+(i+1)+" value =",array_var[i]);
 }
 // output:
 // at place 1 value = a2rp:
 // at place 2 value = the
 // at place 3 value = Ashish
 // at place 4 value = Ranjan

 array_var.shift();
 console.log(array_var); // (3) ['the', 'Ashish', 'Ranjan']
 array_var.shift();
 console.log(array_var); // ['Ashish', 'Ranjan']
 array_var.unshift("1");
 console.log(array_var); // ['1', 'Ashish', 'Ranjan']
 array_var.unshift("2");
 console.log(array_var); // ['2', '1', 'Ashish', 'Ranjan']

 console.log("\n");
 // functions
 function test_function(number1,number2=3) {
 return number1 + number2;
 }
 let return_value = test_function(25);
 console.log(return_value); // 28

 console.log("\n");
 // variable scope and functions
 function variable_scope_function() {
 var variable_scope_number_1 = 12;
 variable_scope_number_2 = 23;
 console.log(variable_scope_number_1 + variable_scope_number_2);
 }
 variable_scope_function(); // 35

 try {
 console.log(variable_scope_number_1);
 } catch (error) {
 console.log(error.message); // variable_scope_number_1 is not defined
 }
 console.log(variable_scope_number_2); // 23

 console.log("\n");
 // global variable vs local variable precedence
 let variable_3 = "outside global variable";
 function function_3() {
 let variable_3 = "inside local variable";
 console.log(variable_3);
 }
 function_3(); // inside local variable

 console.log("\n");
 // array add at last and remove first
 let number_array_1 = [1,2,3,4,5,6];
 let number2add = 7;
 function addlast_removefirst(the_array,number) {
 // add element at last
 the_array.push(number);
 console.log(JSON.stringify(the_array));
 // array.splice(index, howmany, item1, ....., itemX)
 // index: Required: The position to add/remove items: Negative value defines the position from the end of the array
 // howmany: Optional: Number of items to be removed
 // item1, ..., itemX: Optional: New elements(s) to be added
 the_array.splice(0,1);
 console.log("after remove first");
 console.log(JSON.stringify(the_array));
 // return the_array;
 }
 addlast_removefirst(number_array_1,number2add);

 console.log("\n");
 // boolean values
 let boolean_value = false;
 console.log("boolean_value:",boolean_value,", its opposite:",!boolean_value); // boolean_value: false , its opposite: true

 console.log("\n");
 // boolean conditional
 if (boolean_value) {
 console.log("boolean value is true");
 } else if(!boolean_value) {
 console.log("boolean value is false");
 }
 // output:
 // boolean value is false

 console.log("\n");
 // comparison with equality operator
 console.log(1==1); // true
 console.log(1==2); // false
 console.log("1"==1); // true
 console.log(1=="1"); // true

 console.log("\n");
 // strict equality operator
 console.log(1===1); // true
 console.log(1==2); // false
 console.log("1"===1); // false
 console.log(1==="1"); // false

 console.log("\n");
 // comparison with not equality operator
 console.log(1!=2); // true
 console.log(1!="1"); // false
 console.log(1!='1'); // false
 console.log(1!=true); // false
 console.log(0!=false); // false

 console.log("\n");
 // strictly not equality operator
 console.log(3!==3); // false
 console.log(3!=='3'); // true
 console.log(4!==3); // true

 console.log("\n");
 // switch case
 for (let i=0; i<9; ++i) {
 switch (i) {
 case 1:
 console.log(i,"one");
 break;
 case 2:
 console.log(i,"two");
 break;
 case 3:
 console.log(i,"three");
 break;
 case 4:
 case 5:
 case 6:
 console.log(i,"four five six");
 break;
 case 7:
 console.log(i,"seven");
 break;
 default:
 console.log(i,"i,neither one nor two, three, four, five, six or seven... this is default");
 }
 }
 // output:
 // 0 'i,neither one nor two, three, four, five, six or seven... this is default'
 // 1 'one'
 // 2 'two'
 // 3 'three'
 // 4 'four five six'
 // 5 'four five six'
 // 6 'four five six'
 // 7 'seven'
 // 8 'i,neither one nor two, three, four, five, six or seven... this is default'

 console.log("\n");
 // returning boolean from functions
 function return_booean(num1,num2) {
 return num1 > num2;
 }
 console.log(return_booean(45,34)); // true
 console.log(return_booean(-45,34)); // false

 console.log("\n");
 // object
 const object1 = {
 "property_1": "value 1",
 2: "value 2",
 "property three": "value three",
 property_four: "value four"
 };
 console.log(object1); // {2: 'value 2', property_1: 'value 1', property three: 'value three', property_four: 'value four'}
 console.log(JSON.stringify(object1)); // {"2":"value 2","property_1":"value 1","property three":"value three","property_four":"value four"}

 console.log("\n");
 // accessing objects values with properties
 let four;
 const object2 = {
 "prop_one": "value 1",
 2: "value 2",
 3.3: "three point 3",
 four: "value 4",
 prop_five: "value 5",
 "property space": "value for property space"
 };
 console.log(object2); // {2: 'value 2', prop_one: 'value 1', 3.3: 'three point 3', four: 'value 4', prop_five: 'value 5', property space: 'value for property space'}
 console.log(JSON.stringify(object2)); // {"2":"value 2","prop_one":"value 1","3.3":"three","four":"value 4","prop_five":"value 5"}
 console.log("object2['prop_one']:",object2["prop_one"]); // object2['prop_one']: value 1
 let property_2 = object2[2];
 console.log("property_2",property_2); // property_2 value 2
 console.log("object2[3.3]",object2[3.3]); // object2[3.3] three point 3
 console.log("object2.four",object2.four); // object2.four value 4
 console.log("object2.prop_five",object2.prop_five); // object2.prop_five value 5
 console.log("object2['property space']",object2["property space"]); // object2['property space'] value for property space
 object2["property space"] = "changed value";
 console.log(JSON.stringify(object2)); // {"2":"value 2","prop_one":"value 1","3.3":"three point 3","four":"value 4","prop_five":"value 5","property space":"changed value"}
 object2.new_property = "new property added";
 console.log(JSON.stringify(object2)); // {"2":"value 2","prop_one":"value 1","3.3":"three point 3","four":"value 4","prop_five":"value 5","property space":"changed value","new_property":"new property added"}
 delete object2.four;
 console.log(JSON.stringify(object2)); // {"2":"value 2","prop_one":"value 1","3.3":"three point 3","prop_five":"value 5","property space":"changed value","new_property":"new property added"}


 console.log("\n");
 // hasownproperty
 for (const key in object2) {
 if (object2.hasOwnProperty(key)) {
 console.log(`${key}: ${object2[key]}`);
 }
 }
 // output:
 // 2: value 2
 // prop_one: value 1
 // 3.3: three point 3
 // prop_five: value 5
 // property space: changed value
 // new_property: new property added

 console.log("\n");
 // accessing nested objects
 let object3 = {
 "one": {
 "oneone_prop": "oneone_value",
 "onetwo_prop": "onetwo_value"
 },
 "two": {
 "twoone_prop": {
 "twooneone_prop": "twooneone_value",
 "twoonetwo_prop": "twoonetwo_value"
 }
 }
 };
 console.log("object3['two']['twoone_prop']['twooneone_prop']:",object3["two"]["twoone_prop"]["twooneone_prop"]); // object3['two']['twoone_prop']['twooneone_prop']: twooneone_value

 console.log("\n");
 // accessing nested arrays
 let nested_array = [
 {
 one_one: "1 one",
 one_two: ["1 two_one","1 two_two","1 two_three","1 two_four"]
 },
 {
 two_one: "2 one",
 two_two: ["2 two_one","2 two_two","2 two_three","2 two_four"]
 }
 ];
 console.log(JSON.stringify(nested_array)); // [{"one_one":"1 one","one_two":["1 two_one","1 two_two","1 two_three","1 two_four"]},{"two_one":"2 one","two_two":["2 two_one","2 two_two","2 two_three","2 two_four"]}]

 console.log("\n");
 // iterate array
 let iterate_array = [];
 let increment = 0;
 while (++increment<=10) {
 iterate_array.push(increment);
 }
 console.log(JSON.stringify(iterate_array)); // [1,2,3,4,5,6,7,8,9,10]
 console.log("reverse iterate array");
 let odd_numbers = "";
 let even_numbers = "";
 for (let i=iterate_array.length-1; i>=0; --i) {
 // console.log(iterate_array[i],);
 if (iterate_array[i]%2==0) {
 even_numbers += (iterate_array[i] + " ");
 } else if (iterate_array[i]%2!=0) {
 odd_numbers += (iterate_array[i] + " ");
 }
 }
 console.log("odd numbers: ",odd_numbers, "even numbers: ", even_numbers); // odd numbers: 9 7 5 3 1 even numbers: 10 8 6 4 2 

 console.log("\n");
 // nested for loops
 let nested_forloop = [[1,2,3],[4,5,6,7,8,9],[-1,0,1]];
 console.log("complete array: ",JSON.stringify(nested_forloop)); // complete array: [[1,2,3],[4,5,6,7,8,9],[-1,0,1]]
 let first_row_values = "";
 let second_row_values = "";
 let third_row_values = "";
 for (let i=0; i<nested_forloop.length; ++i) {
 for (let j=0; j<nested_forloop[i].length; ++j) {
 if (i==0) { first_row_values += (" " + nested_forloop[i][j]); }
 else if (i==1) { second_row_values += (" " + nested_forloop[i][j]); }
 else if (i==2) { third_row_values += (" " + nested_forloop[i][j]); }
 }
 }
 console.log("first_row_values: " + first_row_values); // first_row_values: 1 2 3
 console.log("second_row_values: " + second_row_values); // second_row_values: 4 5 6 7 8 9
 console.log("third_row_values: " + third_row_values); // third_row_values: -1 0 1

 console.log("\n");
 // recursion
 function count_down(number) {
 console.log(number);
 number = number - 1;
 if (number > 0) {
 count_down(number);
 }
 }
 count_down(5);
 // output:
 // 5
 // 4
 // 3
 // 2
 // 1

 console.log("\n");
 function sum(number) {
 console.log("the number: ",number);
 if (number<=1) {
 return number;
 }
 return number + sum(number-1);
 }
 console.log("result: ",sum(5));
 // output:
 // the number: 5
 // the number: 4
 // the number: 3
 // the number: 2
 // the number: 1
 // result: 15

 console.log("\n");
 // random
 let minimum_number = 10;
 let maximum_number = 100;
 for (let i=0; i<5; ++i) {
 let random_number = Math.floor(Math.random() * (maximum_number - minimum_number)) + minimum_number;
 console.log(`random number between between ${minimum_number} and ${maximum_number} is ${random_number}`);
 }
 // output:
 // random number between between 10 and 100 is 80
 // random number between between 10 and 100 is 39
 // random number between between 10 and 100 is 83
 // random number between between 10 and 100 is 49
 // random number between between 10 and 100 is 95

 console.log("\n");
 // parseInt
 console.log(parseInt("007")); // 7
 console.log(parseInt("5dr")); // 5
 console.log(parseInt("59")); // 59
 console.log(parseInt("0x123")); // 291
 console.log(parseInt("11",2)); // 3

 console.log("\n");
 // ternary operator
 console.log(1>2?true:false); // false

 let ternary_result = 2 > 1 ? 2 > 3 ? "2 > 3" : "2 < 3" : "2 < 1";
 console.log(ternary_result); // 2 < 3



 








});