Javascript: Difference between revisions

From bibbleWiki
Jump to navigation Jump to search
No edit summary
No edit summary
Line 3: Line 3:
Found this which might be useful. [[https://exploringjs.com/impatient-js/toc.html]]
Found this which might be useful. [[https://exploringjs.com/impatient-js/toc.html]]
=Module Formats=
=Module Formats=
Before I forget here are the two formats for JavaScript modules
Before I forget here are the two formats for JavaScript modules CommonJS and ES6 (EMCAScript modules)
[[File:CommonJs And ES6.png]]
[[File:CommonJs And ES6.png]]
==One Liners==
=Variables=
===Get count from Object===
<syntaxhighlight lang="javascript">
cart.map(item => item.quantity).reduce(previous, next) => previous + next,0) : 0}
</syntaxhighlight>
 
== Variables ==
<syntaxhighlight lang="javascript">
<syntaxhighlight lang="javascript">
let a = 50; // Can be changed but only valid in scope
let a = 50; // Can be changed but only valid in scope
Line 18: Line 12:
</syntaxhighlight>
</syntaxhighlight>


== Objects ==
=Objects=
You can create an object using this
You can create an object using this
<syntaxhighlight lang="javascript">
<syntaxhighlight lang="javascript">
const sessionId = 1;
const sessionId = 1;
const burke1 = sessionId
const burke1 = sessionId
Line 45: Line 37:
</syntaxhighlight>
</syntaxhighlight>


== Class Field declarations ==
= Class Field declarations =


You can declare classes like  
You can declare classes like  
Line 77: Line 69:
</syntaxhighlight>
</syntaxhighlight>


== Property Syntax ==  
=Property Syntax=
You can reference a property of an object via a variable. In the example below we have assigned c to myPropertyName.
You can reference a property of an object via a variable. In the example below we have assigned c to myPropertyName.


Line 92: Line 84:
</syntaxhighlight>
</syntaxhighlight>


== Comparisons ==
=Comparisons=
The following would be true with loose comparisons
The following would be true with loose comparisons
<syntaxhighlight lang="javascript">
<syntaxhighlight lang="javascript">
Line 115: Line 107:
This is because the type is compared in strict comparisons
This is because the type is compared in strict comparisons


== Array ==
=Array=
===Introduction===
==Introduction==
This is about immutable array because it seems this is the way with javascript.
This is about immutable array because it seems this is the way with javascript.
===Add Element to array in Object===
==Add Element to array in Object==
Here is an example of adding an element
Here is an example of adding an element
<syntaxhighlight lang="js">
<syntaxhighlight lang="js">
Line 140: Line 132:
</syntaxhighlight>
</syntaxhighlight>


===Remove Element using an index in an Object Array===
==Remove Element using an index in an Object Array==
Here is an example of removing an element from a given index
Here is an example of removing an element from a given index
<syntaxhighlight lang="js">
<syntaxhighlight lang="js">
Line 167: Line 159:
</syntaxhighlight>
</syntaxhighlight>


===Replace an Element in an Object array===
==Replace an Element in an Object array==
Replace a use in an array of users.
Replace a use in an array of users.
<syntaxhighlight lang="js">
<syntaxhighlight lang="js">
Line 193: Line 185:


</syntaxhighlight>
</syntaxhighlight>
 
==Add==
=== Add ===
<syntaxhighlight lang="js">
<syntaxhighlight lang="js">
     const newArray = myArray.concat(newElement)
     const newArray = myArray.concat(newElement)
</syntaxhighlight>
</syntaxhighlight>
 
==Filter==
=== Filter ===
<syntaxhighlight lang="js">
<syntaxhighlight lang="js">
     const newArray = myArray.filter(
     const newArray = myArray.filter(
Line 205: Line 195:
     }
     }
</syntaxhighlight>
</syntaxhighlight>
 
==Spread==
== Spread ==
 
===Spreading array===
===Spreading array===


Line 229: Line 217:
     <Card { name="Freda" age=30} />
     <Card { name="Freda" age=30} />
</syntaxhighlight>
</syntaxhighlight>
===Appending to an array===
===Appending to an array===
<syntaxhighlight lang="javascript">
<syntaxhighlight lang="javascript">
     testData: [...prevState.testData, newTestData]
     testData: [...prevState.testData, newTestData]
</syntaxhighlight>
</syntaxhighlight>
 
===Map===
== Map ==
Given we can spread elements we can also spread array e.g
Given we can spread elements we can also spread array e.g
<syntaxhighlight lang="javascript">
<syntaxhighlight lang="javascript">
Line 244: Line 229:
</syntaxhighlight>
</syntaxhighlight>


==functions==
=functions=
===Simple Functions===
==Simple Functions==
<syntaxhighlight lang="javascript">
<syntaxhighlight lang="javascript">


Line 252: Line 237:
}
}
</syntaxhighlight>
</syntaxhighlight>
===Arrow Functions===
==Arrow Functions==
Not great for me so need to write it down. <br><br>
Not great for me so need to write it down. <br><br>
Normal controller no function  
Normal controller no function  
Line 283: Line 268:
</syntaxhighlight>
</syntaxhighlight>


== Importing ==
=Importing=
Using export instead of export default means you have to use destruction to import e.g.
Using export instead of export default means you have to use destruction to import e.g.
<syntaxhighlight lang="javascript">
<syntaxhighlight lang="javascript">
Line 297: Line 282:
});
});
</syntaxhighlight>
</syntaxhighlight>
 
=destructure=
== destructure ==
 
<syntaxhighlight lang="javascript">
<syntaxhighlight lang="javascript">


Line 340: Line 323:
// First be 10, restOfitems is and array of 20,30,40
// First be 10, restOfitems is and array of 20,30,40


==Template Strings==
=Template Strings=


This is like c# interpolation using back ticks.
This is like c# interpolation using back ticks.
Line 348: Line 331:
</syntaxhighlight>
</syntaxhighlight>


==Promises and Async==
=Promises and Async=
 
Old approach to async
Old approach to async
<syntaxhighlight lang="javascript">
<syntaxhighlight lang="javascript">
const fetchData = async () => {
const fetchData = async () => {
Line 379: Line 360:
</syntaxhighlight>
</syntaxhighlight>


==Generators==
=Generators=


The function * denotes a generator function. The function is executed until yield. Subsequent calls remember the value of yield and continue to the next yield
The function * denotes a generator function. The function is executed until yield. Subsequent calls remember the value of yield and continue to the next yield
Line 424: Line 405:
*Lines 1–3 define a function named sayHi.
*Lines 1–3 define a function named sayHi.
*On line 5 we call it with the usual “()” syntax to invoke the function.
*On line 5 we call it with the usual “()” syntax to invoke the function.
==Function Expression==
=Function Expression=
We can assign a function to a variable in java script.
We can assign a function to a variable in java script.
<syntaxhighlight lang="js" line >
<syntaxhighlight lang="js" line >
Line 437: Line 418:
*Lines 2–4 declare sayHi variable and assign a value to it that’s of function type.
*Lines 2–4 declare sayHi variable and assign a value to it that’s of function type.
*Line 6 calls this sayHi function.
*Line 6 calls this sayHi function.
==Two Examples==
=Two Examples=
Here are too examples of IFFE's
Here are too examples of IFFE's
<syntaxhighlight lang="js" line >
<syntaxhighlight lang="js" line >
Line 469: Line 450:
  }());
  }());
</syntaxhighlight>
</syntaxhighlight>
==IFEs with a return value==
=IFEs with a return value=
We can return values like any other function with an IFFE
We can return values like any other function with an IFFE
<syntaxhighlight lang="js" line >
<syntaxhighlight lang="js" line >
Line 478: Line 459:
  alert(result); // alerts "From IIFE"
  alert(result); // alerts "From IIFE"
</syntaxhighlight>
</syntaxhighlight>
==Finally we can Pass Parameters==
=Finally we can Pass Parameters=
Not only IIFEs can return values, but IIFEs can also take arguments while they are invoked.
Not only IIFEs can return values, but IIFEs can also take arguments while they are invoked.
<syntaxhighlight lang="js" line >
<syntaxhighlight lang="js" line >
Line 571: Line 552:
   document.getElementById('mountNode'),
   document.getElementById('mountNode'),
);
);
</syntaxhighlight>
=One Liners=
==Get count from Object==
<syntaxhighlight lang="javascript">
cart.map(item => item.quantity).reduce(previous, next) => previous + next,0) : 0}
</syntaxhighlight>
</syntaxhighlight>

Revision as of 22:43, 25 February 2022

Javascript tips

Book Online

Found this which might be useful. [[1]]

Module Formats

Before I forget here are the two formats for JavaScript modules CommonJS and ES6 (EMCAScript modules)

Variables

let a = 50; // Can be changed but only valid in scope
var a = 50; // Can be changed but global
const a = 50 // Cannot be changed

Objects

You can create an object using this

const sessionId = 1;
const burke1 = sessionId
const burke2 = sessionId +1
const burke3 = sessionId +2
const burke4 = sessionId +3
const burke5 = sessionId +4

const mee = {
  burke1,
  burke2,
  burke3,
  burke4,
  burke5,
}

Will create a object with keys the same name as the values e.g.

mee.burke1 // = 1
mee.burke2 // = 2

Class Field declarations

You can declare classes like

testData = {
  { name = "Fred", age = 20 }
  { name = "Freda", age = 30 }
}

This will simplify the class state e.g. was

class App Extends React.Component {
    constructor(props) {
        super(props)
        this.state = {
            profile: testData,
        } 
    }
}

To

class App Extends React.Component {

    state = {
       profile: testData,
    }
}

Property Syntax

You can reference a property of an object via a variable. In the example below we have assigned c to myPropertyName.

const myPropertyName = 'c'

const myObject = {
  a: 5,
  b: 10,
  [myPropertyName]: 15
} 

console.log(myObject.c) // prints 15

Comparisons

The following would be true with loose comparisons

    if("20" == 20) {
       console.log("true");
    }
    else {
       console.log("false");
    }

But false with strict comparisons

    if("20" === 20) {
       console.log("true");
    }
    else {
       console.log("false");
    }

This is because the type is compared in strict comparisons

Array

Introduction

This is about immutable array because it seems this is the way with javascript.

Add Element to array in Object

Here is an example of adding an element

    // Given
    user = {
       name: "fred",
       surnname: "blogss", {
          cookies: [
             "token1",
             "token2",
             "token3"
          ]
       }
    }

    // Add the cookie to the user
    const newCookies = [...user.cookies, refreshToken];

    // Replace the cookies with the newCookies
    const newUser = { ...user, cookies: newCookies };

Remove Element using an index in an Object Array

Here is an example of removing an element from a given index

    // Given
    user = {
       name: "fred",
       surnname: "blogss", {
          cookies: [
             "token1",
             "token2",
             "token3"
          ]
       }
    }

    // We can remove the one we want with
    const tokenIndex = user.cookies.findIndex(
        (token) => token === refreshToken
    );

    const newCookies = [
      ...user.cookies.slice(0, tokenIndex),
      ...user.cookies.slice(tokenIndex + 1),
    ];

Replace an Element in an Object array

Replace a use in an array of users.

    // Given
    newUser = {
       id: 1,
       name: "fred",
       surnname: "blogss", {
          cookies: [
             "token1",
             "token2",
             "token3"
          ]
       }
    }

    this.userCollection = this.userCollection.map((user) => {
      let temp = user;
      if (temp.id === newUser.id) {
        temp = newUser;
      }
      return temp;
    });

Add

    const newArray = myArray.concat(newElement)

Filter

    const newArray = myArray.filter(
        n=> !myOtherArray.includes(n)
    }

Spread

Spreading array

const testData = {
  { name = "Fred", age = 20 }
  { name = "Freda", age = 30 }
}

Spread spreads them e.g.

    <Card {...testData[0]} />
    <Card {...testData[1]} />

Is the same as

    <Card { name="Fred"  age=20} />
    <Card { name="Freda" age=30} />

Appending to an array

    testData: [...prevState.testData, newTestData]

Map

Given we can spread elements we can also spread array e.g

    <div>
        {testData.map( element=> <Card {...element} />) }
    </div>

functions

Simple Functions

const X = () => {
   console.log("Fred");
}

Arrow Functions

Not great for me so need to write it down.

Normal controller no function

  router.get('/customers', (req, res) => {
    console.log('this is me');
    // console.log(req.query);
    res.sendStatus(404);
  });

Let put if in a function. We need to make the function signature match the original

function iain(req, res) {
    console.log('this is me');
    console.log(req.query);
    res.sendStatus(404);
}

router.get('/customers', iain)

async now is

async function iain(req, res) {
    console.log('this is me');
    console.log(req.query);
    res.sendStatus(404);
}

router.get('/customers', iain)

Importing

Using export instead of export default means you have to use destruction to import e.g.

import {ActionTypes as types} from '../constants';

For this example constants.js file

import keyMirror from 'keyMirror';

export var ActionType = keyMirror ({
    THIS_IS_A_CONST = null
});

destructure

// const PI = Math.PI;
// const E = Math.E;
// const SQRT2 = Math.SQRT2; 

// Does the same
const {PI, E, SQRT2} = Math;

You can pass a cirucla to and the radius is automatically extracted. Precision can have a default but can also be passed.

const circle = {
    label: 'circleX',
    radius: 2,
};

const circleArea = {{radius}, {precision = 2} = {}) =>
  (PI * radius * radius).toFixed(precision);

console.log(
  circleArea(circle, {precision:5})
);


And arrays

const [first, ...restOfItems] = [10,20,30,40]

// First be 10, restOfitems is and array of 20,30,40

Template Strings

This is like c# interpolation using back ticks.

const html = `<div>${Math.random()}</div>`;

Promises and Async

Old approach to async

const fetchData = async () => {
  const resp = await fetch('https://api.github.com');
  const data = await resp.json();
  console.log(data);
};

fetchData();

New approach

const fetchData = async() => {

  const resp = await fetch('http::/api.github.com');
  const data = await resp.json();

  console.log(data);
}

fetchData();

Generators

The function * denotes a generator function. The function is executed until yield. Subsequent calls remember the value of yield and continue to the next yield

 function * myGen(i) 
 {
    while(true)
    {
       yield i = i * 10;
    }
 }

 fred = myGen(10);

 console.log(fred.next());
 console.log("Fred was ere 1");

 console.log(fred.next());
 console.log("Fred was ere 2");

 console.log(fred.next());
 console.log("Fred was ere 3");

Output would be{ value: 100, done: false }

Fred was ere 1
{ value: 1000, done: false }
Fred was ere 2
{ value: 10000, done: false }
Fred was ere 3

IFFE (Immediately Invoked Function Expression)

This I found very hard to understand so wanted to write it up.

Normal Function

This is how a standard function works in Java Script

 function sayHi() {
     alert("Hello, World!");
 }
 sayHi(); // shows "Hello, World!" as alert in browser.
  • Lines 1–3 define a function named sayHi.
  • On line 5 we call it with the usual “()” syntax to invoke the function.

Function Expression

We can assign a function to a variable in java script.

 var msg = "Hello, World!";
 var sayHi = function() {
     alert(msg);
 };
 
 sayHi(); // shows "Hello, World!" as alert in browser.
  • Line 1 declares msg variable and assigns a string value to it.
  • Lines 2–4 declare sayHi variable and assign a value to it that’s of function type.
  • Line 6 calls this sayHi function.

Two Examples

Here are too examples of IFFE's

 // Variation 1
 (function() {
     alert("I am an IIFE!");
 }());
 
 // Variation 2
 (function() {
    alert("I am an IIFE, too!");
 })();
  • In Variation 1, on line 4, parentheses () for invoking the function expression is contained inside the outer parentheses. The outer parentheses are needed to make a function expression out of that function.
  • In Variation 2, on line 9, parentheses () for invoking the function expression is outside the wrapping parentheses for the function expression.

Private Variables

Probably needs saying for people who use older javascript but the parameters are private inside an IFFE

 (function IIFE_initGame() {
     // Private variables that no one has access to outside this IIFE
     var lives;
     var weapons;
     
     init(); 

     // Private function that no one has access to outside this IIFE
     function init() {
        lives = 5;
        weapons = 10;
     }
 }());

IFEs with a return value

We can return values like any other function with an IFFE

 var result = (function() {
     return "From IIFE";
 }());
 
 alert(result); // alerts "From IIFE"

Finally we can Pass Parameters

Not only IIFEs can return values, but IIFEs can also take arguments while they are invoked.

 (function IIFE(msg, times) {
     for (var i = 1; i <= times; i++) {
         console.log(msg);
     }
 }("Hello!", 5));

react functions and state

Normal function

function logRandom() {
    console.log(Math.random());
}

function Button() {
 const [count, setCounter] = useState(0);
 return <button onClick={logRandom}>{counter}</button>;
}

inline function

function Button() {
 const [count, setCounter] = useState(0);
 return <button onClick={

  function logRandom() {
      console.log(Math.random());
  }

 }>{counter}</button>;
}

inline arrow function definition

function Button() {

 // React useState hook
 const [count, setCounter] = useState(0);

 return <button 
   onClick={
      () = > console.log(Math.random())
   }
  >{counter}</button>;
}

Passing Props

function Button(props) {
  const handleClick = () => props.onClickFunction(props.increment);
	return (
  	<button onClick={handleClick}>
      +{props.increment}
    </button>
  );
}

function Display(props) {
	return (
  	<div>{props.message}</div>
  );
}

function App() {
	const [counter, setCounter] = useState(0);
  const incrementCounter = (incrementValue) => setCounter(counter+incrementValue);
	return (
    <div>
      <Button onClickFunction={incrementCounter} increment={1} />
      <Button onClickFunction={incrementCounter} increment={5} />
      <Button onClickFunction={incrementCounter} increment={10} />
      <Button onClickFunction={incrementCounter} increment={100} />
      <Display message={counter}/>
    </div>  
  );
}

ReactDOM.render(
  <App />, 
  document.getElementById('mountNode'),
);

One Liners

Get count from Object

cart.map(item => item.quantity).reduce(previous, next) => previous + next,0) : 0}