1. Cơ bản
Câu 1. Phân biệt var, let, const và Phân loại scope ?
Có 3 loại scope:
- Block scope - xuất hiện từ ES6
- Function scope
- Global scope
var | let | const | |
Xuất hiện | Trước ES6 | Từ ES6 | Từ ES6 |
Khai báo lại | có | không | không |
Tham chiếu giá trị khác | có | có | không |
Hoisting | có | không | không |
Scope | function scope | block scope | block scope |
Câu 2. Các kiểu dữ liệu trong JS. Phân biệt các giá trị falsy
1. Có 6 kiểu dữ liệu (Data Types) nguyên thủy (primitives): undefined, Boolean, Number, BigInt, String, Symbol
2. Có 2 kiểu cấu trúc (Structural Types): Object, Function
3. Cấu trúc gốc nguyên thủy (Structural Root Primitive): null (typeof null = "object")
Phân biệt các giá trị falsy
1. Các giá trị falsy là các giá trị khi phủ định được trả về kết quả "true"
Các giá trị falsy
typeof | Ý nghĩa | So sánh | |
undefined |
'undefined' |
Chưa được khai báo, hoặc đã khai báo nhưng chưa gán giá trị |
- NaN khác mọi thứ: NaN == NaN // false, NaN === NaN //false - Nhóm undefined và null bằng nhau: null == undefined //true , đương nhiên null === undefined //false - Nhóm còn lại bằng nhau: 0 == false == "", đương nhiên so sánh === // false
|
null | "object" | Gán giá trị null | |
false |
"boolean" |
||
NaN |
"number" |
Không thể trả về 1 số cụ thể, Vd: 1/"haha" |
|
0 |
"number" |
||
"" |
"string" |
Một số giá trị trusthy đặc biệt: [], {}, Infinity (khi 1 phép chia cho 0)
Đặc biệt hơn
0 == [] // true -----> [] vẫn là trusthy nhé :V
0 == {} // false
Câu 3: Những tính năng mới trong ES6
1. let và const.
2. template strings
3. Object
- destructuring, rest: VD: {destructurin, ...rest} = obj
- spread: ...[array]
- Literals object (khai báo rút gọn)
- class
4. Function
- default parameter
- arrow functions
- promise
- function generator: yield
5. module es6: export, import
Câu 4: Hiểu thế nào về Call stack, event loop, callback, JS engine
http://latentflip.com/loupe/
1. JS Engine và V8 Engine là gì?
- JS engine là 1 công cụ có khả năng biên dịch và thông dịch JS ra mã máy
- JS engine có 2 thành phần chính: 'Memory Heap' và 'Call Stack'
- AJAX, setTimeout, DOM không nằm trong JS Engine
- V8 engine là một JS Engine có mặt ở 2 công cụ lớn nhất hiện nay: browser (Chrome), nodejs
- Một số Engine khác: SpiderMonkey (Firefox), JavaScriptCore (Safari)
2. JS Runtime là gì
- Browser's JS runtime Enviroment bao gồm: JS Engine + công cụ của Browser cung cấp: WebAPIs, event loop, callback queue (chạy trên 1 thread riêng)
- Node's JS runtime Enviroment bao gồm: JS Engine + + công cụ của NodeJS cung cấp: C++ APIs, event loop và callback được implement bằng C++
- Các bộ cung cấp đó được chạy trên 1 thread riêng và được bảo trợ bỏi concurrency
3. Event loop là gì
- Event loop có nhiệm vụ đợi cho Call Stack rỗng, rồi soi xem Callback Queue có gì không, nếu có thì bốc cái đầu tiên bỏ vào CS để chạy
4. render() là gì
- Browser không thể gọi render() nếu có code JS cần chạy trong CallStack. Kiểu như tự nó là async callback vậy, phải đợi cho CallStack rỗng mới chạy được.
- Chỉ khác một chút là render() được ưu tiên hơn so với các callback thông thường.
- Cứ mỗi 16ms (với chỉ số lý tưởng 60fps), một lời gọi render() sẽ được đưa vào hàng đợi và đến khi CS rỗng thì mới được thực thi.
- Nên nếu bạn block CallStack quá lâu thì UI sẽ bị đơ, user chẳng thể click lên button hay edit text được nữa