[Sê-ri nhai và nuốt] Cuốn JS: The Good Parts
Nhai và nuốt là một sê-ri ghi chú lại kiến thức học được từ sách.
Đáng lẽ 1 cuốn sách phải chia ra nhiều bài vì quá dài, nhưng vì mình lười. Anh nào, em nào, bố trẻ nào, cô cậu chú bác nào có vấn đề với bài viết dài thì cứ chửi.
Lên dĩa đầu tiên trong sê-ri này là:
JavaScript: The Good Parts
Đọc xong: 10/6/17. Mình sẽ cập nhật những gì mình cho là cần nhớ trong sách ở đây.
Table of Content:
- Good Parts - chả có gì để ghi chú :lol:
- Grammar
- Objects
- Object Literals
- Retrieval
- Update
- Reference
- Prototype
- Reflection
- Enumeration
- Delete
- Global Abatement
- Functions
- Function Objects
- Function Literal
- Invocation
- Arguments
- Return
- Exceptions
- Augmenting Types
- Recursion
- Scope
- Closure
- Callbacks
- Module
- Cascade
- Curry
- Memoization
- Inheritance
- Pseudoclassical
- Object Specifiers
- Prototypal
- Functional
- Parts
- Arrays
- Array Literals
- Length
- Delete
- Enumeration
- Confusion
- Methods
- Dimensions
- Regular Expressions
- An Example
- Construction
- Elements
- Methods
- Style
- Beautiful Features
- Appendix A, B, C, D
Okay, vào phần chính.
Chapter 2: Grammar
Whitespace
block comment:
/*cái quần què gì
ở trong này
cũng được
trừ RegExp*/
line comment:
// đằng sau dấu này thì ghi cái quần què gì cũng được miễn là còn cùng trong 1 hàng
// đây là 1 line cmt khác
- Dùng block cmt không an toàn để ẩn 1 đoạn code, nên dùng line cmt (trong Sublime Text 3 chỉ cần chọn đoạn code cần ẩn đi & nhấn
Ctrl + /
). - Chỉ nên dùng block cmt ở đầu file, ví dụ như để đặt đoạn description của file đó.
Names
- Phải bắt đầu bằng 1 chữ cái, sau đó thì có thể là
A-Z
a-z
0-9
_
tuỳ ý. - Các reserved words: (các keyword không được phép sử dụng làm Name trong JS)
- Thích nguồn MDN và muốn tự hack não mình? Cái link này sẽ dư thừa cho bạn.
- Muốn dễ đọc hơn? Mò ở đây và ở đây.
Numbers
- 64-bit floating point: Có cần quan tâm không? Không? Tốt.
- JS chỉ có 1 kiểu dữ liệu số (không có kiểu số nguyên (integer) riêng biệt như các ngôn ngữ lập trình khác nên không cần khai báo kiểu dữ liệu đối với số), do đó:
1 === 1.0 //true
3e-2 === 0.03 //true, 3 nhân 10 mũ -2
3e2 === 300 //true, 3 nhân 10 mũ 2
- NaN khác mọi giá trị kể cả chính nó. NaN và Infinity là kiểu dữ liệu number.
typeof NaN; // number
typeof Infinity; // number
Strings
- 16-bit character set of Unicode: bạn sẽ lại quan tâm chứ? Okay, tốt.
- Escape characters: dành cho các ký tự đặc biệt
ý nghĩa | |
---|---|
\b |
backspace |
\f |
formfeed |
\t |
tab |
\n |
new line ký tự xuống dòng |
\r |
carriage return cái gì đây??? |
\u + <4 hex digits> |
ký tự chuyển về từ bảng mã hex |
- Str có prop
length
(chỉ str và arr có prop này).
'bảykýtự'.length === 7 // true
- Không thể thay đổi 1 str, nhưng str có các method để giúp bạn tạo ra 1 str mới từ str ban đầu.
Statements
var
, let
, const
statement
- Biến được định nghĩa bởi
var
chỉ có func scope, không có block scope,let
&const
trong ES2015 thì có block scope. - 1 block gồm nhiều statement bao bởi 2 ngoặc nhọn
{
}
. - Nên định nghĩa các biến ở đầu 1 func.
-
Các giá trị Falsy & Truthy
Những giá trị nào không nằm trong cột falsy thì đều là truthy.
Falsy | Truthy |
---|---|
false |
true |
null |
|
undefined |
|
0 , -0 |
|
'' (str rỗng) |
'false' |
NaN |
switch
statement
- Chỉ kiểm tra được các
case
cụ thể (sẽ test bằng===
operator), và chỉ đối với str và num. - Có thể liệt kê nhiều
case
liên tục. - Phải có
break
hoặcreturn
statement để tránh không cho thực thi xong case này lại test tiếp case khác.
while
statement
- Test trước thực thi sau.
for
statement
- Có 3 phần: initialization, condition, increment.
- Nếu condition bị bỏ qua, giá trị
true
sẽ được gán vào (nghĩa là vòng lặp sẽ chạy mãi nếu không cóbreak
hoặcreturn
statement trong block code được thực thi).
for...in...
statement
- Chỉ dùng riêng cho obj (giống như
forEach()
chỉ có riêng cho arr).
for (let keyName in objName) {
// viết cái gì vào đây cũng được
}
- Theo cấu trúc ở trên thì khi muốn lấy value từ tên key (keyName - theo demo ở trên) thì phải dùng objName[keyName] chứ không được dùng objName.keyName. Vì keyName là 1 biến sẽ chứa 1 str (key trong cặp key-value của prop trong obj luôn là str).
var objName = {
ahihi: 'tao là ahihi',
ahoho: 'tao là ahoho, bố của ahihi'
};
for (let keyName in objName) {
console.log(objName.keyName);// undefined
console.log(objName[keyName]);// cái này thì chuẩn
}
- Luôn dùng method objName.hasOwnProperty(keyName) để check xem prop mà vòng lặp này đang quét có thực sự là của obj đó hay không, hay là 1 prop được inherit từ prototype chain của obj đó.
do
statement
Ngược lại với while statement.
try
statement
- Thực thi 1 block và bắt tất cả exeption được throw trong block đó.
- Cách sử dụng???
throw
statement
- Tạo ra 1 exception obj. Nếu JS control gặp throw statement ở trong 1
try
block thì nó sẽ đi thẳng đến catch clause củatry
block và thực thi lệnh bên trongcatch
block. - Expression của
throw
statement thường là 1 exception (error) obj. Cần đặt value cho 2 prop quan trọng nhất của 1 error obj là:name
&message
.
return
statement
- Nếu expression của
return
statement không được xác định thì mặc định giá trị được trả về sẽ làundefined
. - JS không cho phép viết
return
trên 1 dòng rồi xuống dòng mới viết expression cho nó.
break
statement
- Dùng để thoát khỏi loop (
for
,while
,do
) hoặcif
/switch
statement. - Expression của
break
statement là 1label
, là label của loop/if/switch statement nào đó mà label của nó đã được đặt tên. - Tương tự
return
statement: không cho phép viếtbreak
vàlabel
của nó trên 2 dòng khác nhau.
expresstion statement
Thường dùng để gán giá trị cho biến (variable assignment) hoặc thực thi cái gì đó (VD: thực thi (invoke) một func).
Expressions
Expression là 1 khái niệm. Nếu xem statement là 1 bức tường thì expression là các viên gạch được dùng trong “bức tường” đó. Trong 1 statement có nhiều vị trí cho các expression.
-
Tenary operator
?:
tác dụng tương tự 1if...else
statement, nhưng tổng thể thì vẫn là 1 expression chứ không phải 1 statement. -
Thứ tự ưu tiên của các operator trong JS (giảm dần):
.
[]
()
delete
new
typeof
+
-
!
*
/
%
+
-
>=
<=
>
<
===
==
&&
||
?:
=
(???)
Đối với những operator trong cùng 1 hàng: thực hiện từ trái sang phải.
-
prefix operators:
typeof []; // obj
typeof null; // obj
- infix operators:
&&
trả về giá trị của operand đầu tiên (bên trái) nếu operand đó là falsy value (không quan tâm operand thứ hai), ngược lại, trả về giá trị của operand thứ hai (không cần biết falsy hay truthy).||
trả về giá trị của operand đầu tiên (bên trái) nếu operand đó là truthy value (không quan tâm operand thứ hai), ngược lại, trả về giá trị của operand thứ hai (không cần biết falsy* hay truthy).
Literals
Chả có gì hay ho
Functions
- Tên của func có thể có hoặc không. Chỉ đặt tên cho func khi cần gọi lại func đó mà chưa có biến nào trỏ về nó (“chứa” nó).
- Có func expression.