Interview questions
Angular is TypeScript based JavaScript framework.
React is a JavaScript library for building user interfaces.
React.js 是被設計來解決大型應用在呈現資料的過程當中,由於資料經常變動而 browser 一直重新 render HTML 所造成的效能低落。
Virtual DOM 的原理是預先生成一個 DOM Tree,存有各節點的資料值及型態,再 render 我們所見到的 HTML。而當資料本身發生變動時,vDOM 將會做 diffing,藉此得知變動節點的位置,最後只會更動 HTML 上的該節點,並不會全部重新 render。
JSX 是以 JS XML 為基礎所開發的,其允許在 JS 中撰寫 HTML。
Relay & GraphQL: https://www.youtube.com/watch?v=9sc8Pyc51uU
Performance Comparison(react, ng, knockout, raw): http://chrisharrington.github.io/demos/performance/
Vue is a MVVM JavaScript framework.
可以採用 Template & Module 分離的方式開發,適合情境在於合作對象有懂 HTML5 & SCSS 的 Designer,另外也可以以 Component 的方式實作,適合情境為設計部分採用 CSS Framework 在只有 F2E 的情況下。
差異:
相較於 Redux:
Redux 是 Immutable Data,Action 會先進 Middleware 然後再到 Reducer。
Flux 是 Mutable Data,Dispatcher 會透過 Callback 將 Action 丟給有註冊的 Store。
當輸入 google.com 在網址列時會發生哪些事?
Type 'g' => Trigger auto-complete => 'google.com' [Enter] => Query DNS to retrieve record => Open socket to IP address => TLS handshake (1.2, 1.3) => HTTP request (1.1, 2) => Server handle request => Response HTML => Download CSS, JS => Construct DOM tree => Construct render tree => Layout => Paint
Ref:
一般的 code 進 call stack 採堆疊之先進後出機制,像 xhr、setTimeout 或是 click event 等 web api 則會在 request 完成或 times up 的時候進入採先進先出機制的 callback queue 等待,此時 event loop 就會去檢查 call stack 是否為 empty,如果是則從 callback queue 將 callback 移入 call stack 執行,如此重複直至結束。
body>form>input
一旦 input 觸發 onClick,form 跟 body 也會依序觸發 onClick。
http://jsfiddle.net/jensbits/Lrrys/
JS Syntax
// Obj B {...}
var B = {
b: 1,
m: function() { return this.b + 1; }
};
console.log(B.m()); // 2
// Obj A {} ---> Obj B {...}
var A = Object.create(B);
A.b = 10;
console.log(A.m()); // 11
// When A.m is called, 'this' refers to A.
// So when A inherits the function m of B,
// 'this.b' means A.b, the own property 'b' of A
// A ---> Object.prototype
var A = { b: 1 };
// B ---> Array.prototype ---> Object.prototype
var B = ["hey", "guys"];
// C ---> Function.prototype ---> Object.prototype
function C() {
return 1;
}
當 A 函數內部的 B 函數被外部變數引用時就會形成 Closure。
閉包的作用就是在 A 執行完並返回後,閉包使得JS Garbage Collection 不會收回 A 所占用的資源,因為 A 的內部函數 B 的執行需要依賴 A 中的變數。
function A() {
var counter = 0;
return function B() {
console.log(++counter);
}
}
var Counter = A();
Counter(); // 1
Counter(); // 2
Counter(); // 3
https://codepen.io/somethingkindawierd/post/es6-arrow-functions-this
var obj = {
foo: function() {
console.log(this);
},
bar: () => {
console.log(this);
},
baz: function() {
(function (){console.log(this);})();
},
qux: function() {
console.log((() => this)());
},
quux: () => {
console.log((() => this)());
}
};
obj.foo(); // obj
obj.bar(); // window
obj.baz(); // window
obj.qux(); // obj
obj.quux(); // window
var obj2 = {};
obj2.foo = obj.foo.bind(obj2);
console.log(o2.foo()); // obj2
// browser
window
// node
global
https://gist.github.com/tpai/45b0b34755ef838faacbd7512f9b2582#method-borrowing-and-binding
@uchiha_madara: Async functions are NOT a replacement for promises, they're sugar on top of them, to handle specific cases where you have many sequential asynchronous actions. http://stackoverflow.com/a/34740033
@bluepnume: every async function you write will return a promise, and every single thing you await will ordinarily be a promise. https://medium.com/@bluepnume/learn-about-promises-before-you-start-using-async-await-eb148164a9c8
return function (dispatch) {
return fetch(...)
.then(res => res.json())
.then(json => {
dispatch(action(json))
})
.catch(err => {
console.log(err);
})
}
write in async/await
return async dispatch => {
try {
const res = await fetch(...);
const json = await res.json();
dispatch(action(json));
} catch(err) {
console.log(err);
}
}
// Outputs: undefined
console.log(declaredLater);
var declaredLater = "Now it's defined!";
// Outputs: "Now it's defined!"
console.log(declaredLater);
equivalent to this:
var declaredLater;
// Outputs: undefined
console.log(declaredLater);
declaredLater = "Now it's defined!";
// Outputs: "Now it's defined!"
console.log(declaredLater);
Inner and outer scope
var name = "Baggins";
(function () {
// Outputs: "Original name was undefined"
console.log("Original name was " + name);
var name = "Underhill";
// Outputs: "New name is Underhill"
console.log("New name is " + name);
})();
window.name = "Baggins";
(function () {
// Outputs: "Original name was Baggins"
console.log("Original name was " + this.name);
var name = "Underhill";
// Outputs: "New name is Underhill"
console.log("New name is " + name);
})();
定義一個函數接受參數的同時返回一個函數,藉此達成閉包的條件將參數紀錄起來,在第二次呼叫該函數時便可調用以該參數定義好的功能。
https://llh911001.gitbooks.io/mostly-adequate-guide-chinese/content/ch4.html
function add(n) { return function(m) { return m + n; } }
add(3)(4); // 7
// inject dispatch into component
// https://github.com/reactjs/react-redux/blob/master/docs/api.md#examples
import { connect } from 'react-redux';
export default connect(mapStateToProps)(Container);
Functions that operate on other functions, either by taking them as arguments or by returning them, are called higher-order functions.
const formula = f => m => `${m} squared = ${f(m)}`;
const squared = formula(m => m * m);
squared(3);
onChange
這一類的方法變更欄位資料。// Uncontrolled
class Form extends Component {
handleSubmit = () => {
const name = this._name.value;
console.log(`submit name=${name}`);
}
render() {
return (
<div>
<input type="text" ref={input => this._name = input} />
<button onClick={this.handleSubmit}>Sign up</button>
</div>
);
}
}
// Controlled
class Form extends Component {
handleSubmit = () => {
const { name } = this.state;
console.log(`submit name=${name}`);
}
onNameChange = e => {
this.setState({ name: e.target.value });
}
render() {
return (
<div>
<input type="text" value={name} onChange={this.onNameChange} />
<button onClick={this.handleSubmit}>Sign up</button>
</div>
);
}
}