---
title: Javascript
created: 2018-02-15
updated: 2018-02-15
type: summary
tags: [tech, reference]
external: https://github.com/wahyd4/knowledge/blob/master/categories/javascript.md
---

# ES 6/ES 2015

- Arrow function
	- Array function doesn’t create new this, it grabs this from its surrounding instead.

- Array/Collection methods
	- map

		```javascript
			  const numbers = [0, 1, 2, 3, 4, 5, 6];
			  const doubledNumbers = numbers.map(n => n * 2);
         ```
	- filter
		- const evenNumbers = numbers.filter(n => n % 2 === 0);
	- reduce
         ```javascript
         const sum = numbers.reduce(
		    function(acc, n) {
		      return acc + n;
		    },
		    0 // accumulator variable value at first iteration step
		  );
         ```
		- reduce takes two parameters
		  The first parameter is a function that will be called at each iteration step.The second parameter is the value of the accumulator variable (*acc* here) at the first iteration step (read next point to understand)

- Class

- Template String
	- const name = "Nick";
	  `Hello ${name}, the following expression is equal to four : ${2+2}`;

- Destructing
	- Array
		- const myArray = ["a", "b", "c"];
		  //without const x = myArray[0];
		  const y = myArray[1];
		  const [x, y] = myArray;
	- Object
		 ```javascript
         const person = {
		    firstName: "Nick",
		    lastName: "Anderson",
		    age: 35,
		    sex: "M"
		  }
		  const { firstName: first, age, city = "Paris" } = person;
         ```
- Default + Rest + Spread parameters

- Const
	- can't be reassigned; but not immutable

- Let

- Modules

- Map / Set

- Promise
	- .then().catch()
        ```javascript
        function getGithubUser(username) {
		    return new Promise((resolve, reject) => {
		      fetch(`https://api.github.com/users/${username}`)
		        .then(response => {
		          const user = response.json();
		          resolve(user);
		        })
		        .catch(err => reject(err));
		    })
		  }
        ```

- Enhanced Object Literals

- Imports/ Exports
	- export default xx; import xx from ‘..’
	- export const xx; import {xx} from ‘..’

- Async/Await
	- await can only used in an async function.
		- async function getGithubUser(username) { // async keyword allows usage of await in the function and means function returns a promise
		    try { // this is how errors are handled with async / await
		      const response = await fetch(`https://api.github.com/users/${username}`); // "synchronously" waiting fetch promise to resolve before going to next line
		      return response.json();
		    } catch (err) {
		      alert(err);
		    }
		  }
		  getGithubUser('mbeaudru').then(user => console.log(user)); // logging user response - cannot use await syntax since this code isn't in async function

# Node.js

- Npm

- Yarn

- Express

- Stream

# This

- Refers who calls
     ```javascript
      function myFunc() {
	    ...
	  }
	  // After each statement, you find the value of *this* in myFunc
	  myFunc.call("myString", "hello") // "myString" -- first .call parameter value is injected into *this*
	  // In non-strict-mode
	  myFunc("hello") // window -- myFunc() is syntax sugar for myFunc.call(window, "hello")
	  // In strict-mode
	  myFunc("hello") // undefined -- myFunc() is syntax sugar for myFunc.call(undefined, "hello")

    var person = {
        myFunc: function() { ... }
        }
        person.myFunc.call(person, "test") // person Object -- first call parameter is injected into *this*
        person.myFunc("test") // person Object -- person.myFunc() is syntax sugar for person.myFunc.call(person, "test")
        var myBoundFunc = person.myFunc.bind("hello") // Creates a new function in which we inject "hello" in *this* value
        person.myFunc("test") // person Object -- The bind method has no effect on the original method
        myBoundFunc("test") // "hello" -- myBoundFunc is person.myFunc with "hello" bound to *this*
     ```
	- [http://yehudakatz.com/2011/08/11/understanding-javascript-function-invocation-and-this/](http://yehudakatz.com/2011/08/11/understanding-javascript-function-invocation-and-this/)

# Closure

# Frameworks

- Ionic

- Angular

- Vue.js
	- component
		- .sync modifier, A kind of two way binding
			- :abc.sync=“”; $tis.emit(“update:abc”, newValue) //trigger in child component
		- computed
			- computed attributes
			- computed over watcher
		- watchers
			- Monitor data changes
	- cheat sheet
		- https://vuejs-tips.github.io/cheatsheet/

- Ember.js

- Backbone

	-

- React.js

- Flux/ Redux
	- State
	- Store
		- Reducer
	- Action
	- Dispatch

# Use promise to avoid nested callbacks.

# tips

- object literal
-   ```javascript
    Object.keys(object).map(function(objectKey, index) {
	      var value = object[objectKey];
	      console.log(value);
	  });
    ```javascript

# Application

# Search
- ElasticSearch
	- Logstash
	- Kibana

# APM
- Newrelic
- Pinpoint

# Monitor
- Bosun
- Prometheus

# API

- RPC(remote procedure call)
	- disadvantages
		- coupling
		- clients needs to know the request procedure names
	- advantages
		- more freedoms to define any requests.
	- examples
		- [https://api.slack.com/methods](https://api.slack.com/methods)

- Restful /Representational State Transfer
	- Easy to cache
	- every url represent a resource
	- disadvantages
		- some special method is hard to use restful to name it. like /login, /resetpassword
	- examples
		- [https://developer.github.com/v3/](https://developer.github.com/v3/)
	- methods
		- GET
		- POST
		- PUT
		- DELETE

- GraphQL
	- Can define fields you want

- gRPC
	- protocol buffers
		 ```javascript
         // The greeter service definition.
		  service Greeter {
		    // Sends a greeting
		    rpc SayHello (HelloRequest) returns (HelloReply) {}
		  }
		  // The request message containing the user's name.
		  message HelloRequest {
		    string name = 1;
		  }
		  // The response message containing the greetings
		  message HelloReply {
		    string message = 1;
		  }
        ```javascript
	- A opensource  remote procedure call framework based on HTTP2 and protobuf
	- advantages
		- baed on HTTP2, better performance
		- call remote like local method, and support multiple language
		- protobuf serialization and deserialization is faster than JSON

# Log and Error

- Sentry
