kiến thức Javascript cho người mới bắt đầu

chuẩn bị học javascript nên chấm hóng
vKigGok.png
 
Thím ơi giải thích ngắn gọn giùm mình 3 cái này với.
  • First-class functions
  • Higher-order function
  • Pure functions and side-effects
First-class functions: A programming language is said to have First-class functions when functions in that language are treated like any other variable.
Higher-order function: A function which takes a function as an argument and/or returns a function.
Pure function: A function is pure if the return value is only determined by its input values, and does not produce side effects. The function must always return the same result when given the same input.
Side-effects: A function or expression is said to have a side effect if apart from returning a value, it interacts with (reads from or writes to) external mutable state.
 
5. Toán tử
Ở bài này chúng ta sẽ học về toán tủ, kiến thức bài này khá là cơ bản nhưng áp dụng rất nhiều trong code. "Toán tử''- cụm từ này chắc các bác đã từng nghe, nó xuất hiện khá nhiều trong toán học. Vì sao ở trên e nói là đơn giản? Vì nó chỉ là phép tính cơ bản trong lập trình, ví dụ như cộng trừ 2 biến, chia lấy dư,...
Trong bài này chúng ta chỉ học về 4 loại toán tử :
  • Toán tử số học
  • Toán tử gán
  • Toán tử so sánh
  • Toán tử logic
Còn có 1 loại là toán tử điều kiện, e sẽ nói ở phần 8.Câu lệnh điều kiện

Nào bây giờ ta đến với loại thứ nhất là toán tử số học
View attachment 1418705

Nhìn vào bảng trên chắc hẳn các bác đã biết use ra sao rồi đúng k? E sẽ chỉ nói về 2 cái cuối toán tử ++ và -- và bổ sung thêm 1 toán tử số học đc update ở phiên bản ES6. Ở ngôn ngữ nào cũng vậy, nếu bác nào k học kĩ 2 toán tử này sẽ rất hay có sai lầm.
Hai toán tử trên có tên gọi khác là "Tiền tố, hậu tố''. Có tên gọi như vậy vì có 2 cách đặt toán tử, thứ nhất là đặt phía trước biến ++a ( tiền tố) và đặt sau biến(hậu tố) a++
Để dễ hiểu, e sẽ nói chi tiết toán tử ++ còn toán tử -- thì tương tự.
Trước hết, ta cần hiểu ++ nghĩa là gì? Toán tử ++ đơn giản chỉ là cộng thêm biến thêm 1 đơn vị
Ví dụ
View attachment 1418753
Từ ví dụ trên, ta thấy a++ hay ++a đều tăng biến a thêm 1 đơn vị, vậy sự khác nhau giữa tiền tố và hậu tố là gì mà khiến nhiều người hay mắc sai lầm như vậy.
View attachment 1419104
Trên đây e có 2 đoạn code, đều nhận giá trị đầu vào(input) như nhau. Ở dòng thứ 3 mỗi đoạn, khi ta log a ra thì đều cho ra 1 kết quả là 6. Ở dòng cuối đều thực hiện phép là sử dụng toán tử ++ rồi trù cho biến b nhưng kết quả thu đc lại khác nhau. Từ đó, ta thấy đc sự khác nhau giữa tiền tố và hậu tố sẽ xuất hiện trong các phép tính biểu thức.
+ Tiền tố: thực hiện toán tử ++ trước khi thực hiện biểu thức tính toán. Trong toán học có thứ tự ưu tiên các phép toán, thì thằng tiền tố này nó đứng đầu, thực hiện cộng 1 giá trị( value) trước rồi làm gì thì làm
+ Hậu tố: Trái ngược lại với thằng anh là tiền tố, thằng em này nó chẳng có ý nghĩa gì trong biểu thức. Nhưng khi kết thúc biểu thức, giá trị của a sẽ đc cộng thêm 1.
Nói tóm lại, nếu lấy các phép tính biểu thức làm trung gian thì thằng tiền tố sẽ thực hiện cộng 1 giá trị trước, còn thằng hậu sẽ cộng 1 giá trị sau khi kết thúc biểu thức.
Tương tụ với toán tử --, toán tử này các bác tự code và trải nghiệm

Ở phiên bản ES6, chúng ta đc update thêm 1 toán tử là toán tử *, đấy là toán tử để tính lũy thừa của 1 biến. Các bác tự hiểu nó như dấu ^ trong toán học ấy ( 5 * 3 = 5^3). Có 2 cách để use toán tử này
View attachment 1419134
Bổ sung: Em quên mất ở toán tử số học này còn phép toán cộng chuỗi(string). Thiếu xót thì bổ sung thôi chứ skip thì vô tâm quá.
View attachment 1419153
Ở bài string e có nói, trong js khoảng trắng cũng là 1 kí tự, nên ở firstName sau giá trị Truong e có để trắng 1 kí tự, đó là lí do vì sao khi log ra ta đc các kết quả ở dòng 3, 4, 5 nó cách nhau.
+ Cộng string với string cho ta kết quả như cộng 2 number, cái này k có gì để nói
+ Đối với cộng string với number ( hay ngược lại), trước khi thực hiện phép cộng thì sẽ chuyển kiểu number sang string rồi cộng như 2 string với nhau. Như trong sinh học về gen, thằng string có gen mạnh hơn number, khi 2 thằng này kết hợp với nhau ( cộng) thì ta đc kết quả sẽ mang gen thằng trội là thằng string( ở đây ta nói là kiểu dữ liệu - type)

Tiếp theo, ta sẽ đến với loại toán tử thứ 2 là toán tử gán
View attachment 1419195
Phần này e cũng chẳng có gì nói nhiều, những điều cần học ở trên img hết. Ở ES6 có update toán tử *, nên phép gán sẽ có thêm phép *=, cái này e đã lấy ví dụ ở trên.

Loại thứ 3 là toán tử so sánh
View attachment 1419217
Cũng giống như trong toán học, lập trình cũng có so sánh bằng, hơn, kém, khác. Về 2 cái toán tử so sánh bằng e đã nói rất kĩ ở bài 4. String và Number , sự khác nhau của 2 cái đó, vì sao lại tách riêng 2 cái mà k gộp làm 1.
Trong lập trình hay đời sống cũng , khi so sánh khác(phủ định 1 cái gì đó) ta dùng dấu !. Thật sự đoạn này cũng chẳng có gì nói sâu cả, các bác cứ nhìn theo bảng rồi code lại thì mới hiểu + nhớ lâu đc. Lập trình học mỗi lí thuyết thì chẳng khác nào nước đổ.

Loại cuối cùng là toán tử logic
View attachment 1420181

Phần này chỉ có 3 toán tử cần phải học là && (và), || (hoặc), !(phủ định).
Toán tử && : Nếu tất cả cả các biểu thức đúng return về true
Toán tử ||: Chỉ cần ít nhất 1 biểu thức đúng sẽ return về true

Bài này e nghĩ sẽ end ở đây thôi, e có tìm hiểu thêm mà cũng chẳng thấy có gì để nói sâu. Ở ES6 nó còn update thêm 1 vài toán tử mà e chưa nói, nhưng e nghĩ chưa cần học vội. Nếu bác nào muốn nghiên cứu thêm thì có thể lên gg. IT là ngành tài liệu mở mà

Toán tử logic trong js hoạt động khác xíu đó bạn, trong js có 1 list dữ liệu được gọi là falsy value
1665052305477.png

Toán tử && sẽ hoạt động theo cơ chế: true && true => true, false && true => false, true && false => false (vậy thì theo bảng ở trên 1 && 0 => 0 chứ không phải trả về bool, 1 && 2 => 2 tương tự, như trong react họ hay có cách viết là condition && <Component />). Đối với || thì ngược lại && nhưng phương pháp chạy cũng gần như vậy.
Ngoài ra đối với ! cũng có cách viết rất hay là !! explicit coercion thay vì để implicit coercion/Boolean(value)
 
1 vote cho chủ thớt chia sẻ kiến thức nhé
Nhưng nên định nghĩa cho chuẩn nhé. Const là hằng số chứ k phải biến số. Sự khác nhau giữa hằng và biến ntn thì xin mời đọc lại về số học đại cương.
Những khái niệm cơ bản ntn rất quan trọng. Có những bạn sv ra trường đi làm mình training, hỏi câu phân biệt giữa biến và hằng, khi nào dùng biến, khi nào dùng hằng mà k phân biệt đc :(

via theNEXTvoz for iPhone
 
Trước đây khi khai báo biến trong JS người ta thường sử dụng từ khó var, vì var dễ gây nhầm trong phạm vị sử dụng( scope) nên từ phiên bản ES6 người ta đã cho ra đời thêm let và const. Trong đó, const dùng để khai báo hằng tức là đồ dùng 1 lần, sẽ không thay đổi đc giá trị trong suốt chương trình.

1 vote cho chủ thớt chia sẻ kiến thức nhé
Nhưng nên định nghĩa cho chuẩn nhé. Const là hằng số chứ k phải biến số. Sự khác nhau giữa hằng và biến ntn thì xin mời đọc lại về số học đại cương.
Những khái niệm cơ bản ntn rất quan trọng. Có những bạn sv ra trường đi làm mình training, hỏi câu phân biệt giữa biến và hằng, khi nào dùng biến, khi nào dùng hằng mà k phân biệt đc :(

via theNEXTvoz for iPhone

Vâng ạ, e check lại thì thấy nói sau mất câu"khai báo biến''.
Sắp tới trong khi bác lướt voz thì có thể bỏ 1 chút time ghé qua thread của e đc k ạ? Chỗ nào e có nói sai bác góp ý giúp e với
 
Thím ơi giải thích ngắn gọn giùm mình 3 cái này với.
  • First-class functions
  • Higher-order function
  • Pure functions and side-effects
  • First-class functions , function co the truyen vao nhu 1 bien

  • Higher-order function, function tra ve 1 function khac

  • Pure functions , ket qua cua function chi phu thuoc vao input cua function

  • Side-effects, bien nam ngoai function tac dong den cac gia tri khai bao ben trong function
 
5. Array và Object
5.1 Array(mảng)

Không để mất time chứng ta vào ngay bài học, đầu tiên là array(mảng):

Hồi e học e có tìm hiểu rất nhiều về: mảng là gì, tại sao phải sử dụng mảng nhưng e nhận ra chỉ có cách giải thích trên w3s là ngắn gọn và dễ hiểu nhất. Trước khi đi vào giải thích, e nên nói về 1 kiến thức mà chắc ít bác mới học để ý đến. Ở trên có bác nói, kiến thức basic rất là quan trọng. Đúng vậy, nó là tiền đề để ta có thể tiếp thu kiến thức khác 1 cách nhanh chóng và dễ hiểu hơn. Như ta đã biết. Biến lưu trữ giá trị, khi học về biến các bác đã thử lưu từ 2 giá trị trở lên cho cùng 1 biến trong cùng 1 thời gian chưa?
1665366489304.png

Ta nhận đc cảnh báo lỗi đều là không mong muốn, vậy điều này có nghĩa là k thể gán 2 giá trị cho 1 biến cùng 1 lúc hoặc cú pháp khai báo của e là sai.
Một lớp học thêm mới mở có 3 học sinh, nếu dùng biến đơn(Biến đơn là biến chỉ lưu trữ 1 giá trị, ví dụ như let a= 2, let name = 'son') để lưu tên các học sinh thì ta sẽ phải dùng 3 biến đơn. Nếu sau 1 time, hs join vào lớp và số lượng hs tăng lên thành 30, để lưu tên thì chẳng lẽ ta dùng 30 biến đơn hay sao. Có cách nào chỉ dùng 1 biến mà lưu trữ hết 30 tên hs đó hay k? Từ đó, ta có khái niệm về mảng.

Mảng có thể dùng để lưu trữ nhiều giá trị cùng 1 lúc
1665366832437.png

Cũng như khai báo các các kiểu dữ liệu number, string,... array cũng có 2 cách khai báo.
- Khai báo thông thường, sử dụng []
- Khai báo use từ khóa new
Khi kháo báo ta có thể nhập giá trị ban đầu hoặc để rỗng.
Nói thêm 1 chút, như hồi e học C++ nó sẽ có cấp phát bộ nhớ, nhất là khi làm việc với mảng sẽ rất tốn thêm time để xử lí bộ nhớ. Nhưng ở js, sẽ tự động tạo và giải phóng khi k sử dụng. Tự động thì tự động , các bác phải quan tâm và quản lí đc bộ nhớ của mình mỗi khi code

Tiếp theo ta sẽ học về cách truy cập các phần tử trong .
index.gif

Ảnh trên nói lên tất cả, array đánh số từ 0 đến hết, suy ra nếu mảng có n phần tử thì index của phần tử cuối sẽ là n-1.

Để truy cập vào phần tử trong mảng ta chỉ cần sử dụng cú pháp: Array[n-1]
1665367040394.png

Hoặc ta có thể thêm phần tử vào mảng bằng cách sử dụng
1665367166086.png


Các bác vào trình duyệt hiển thị file HTMl của mình, bấm vào mũi tên, ta sẽ hiện đc bảng thể hiện thuộc tính và phương thức của mảng.
View attachment 1430696

Về thuộc tính chỉ hiện 1 thuộc tính duy nhất là length( độ dài). Như string, để truy cập độ dài của mảng ta sử dụng cú pháp Array.length
1665367363131.png

Ở đoạn code trên, e thay đổi length = 10 nhưng chỉ gán value cho 3 phần tử đầu. Vậy 7 phần tử sau sẽ có value như thế nào? Quay lại bài các kiểu dữ liệu, khi khai báo biến mà k gắn giá trị thì biến nó sẽ có value và type( giá trị và kiểu dữ liệu) là undefined. Array cũng như vậy, value 7 phần đó sẽ là undefined. Hiểu đơn giản hơn, ta có 10 ghế trống, cho 3 người ngồi 3 ghế đầu, còn 7 ghế sau trống, 7 ghế đó cứ để đó, nào có hs đến thì ta lại sắp xếp ngồi trong 7 ghế đó. Nhưng nếu ta lỡ sắp xếp vào 1 trong 3 ghế đầu thì sẽ như nào? Thì sẽ có 1 trong 3 e đến trc bị đuổi nhường chỗ cho e đến sau, array cũng vậy khi cố tình thì nó sẽ ghi đè lại giá trị ta đã có(đây là 1 cáh thay đổi giá trị trong array). Tương tự, các bác thử gán value cho phần tử thứ 6 rồi log ra để xem kết quả như nào.

Nói về length như thế e nghĩ có vẻ là ổn, ta sang tiếp phần prototype(phương thức). Phần này là trung tâm cốt lỗi của mảng, dùng để thao tác xử lí mảng( cắt, thêm, sắp xếp,...) E chỉ liệt kê vài phương thức mà e nghĩ là hay dùng đủ cho việc học, những phương thức còn lại sẽ các bác sẽ tiếp dần khi ta đi làm.
unshift(): Thêm phần tử vào đầu mảng
push(): Thêm phần tử vào cuối mảng
shift(): Xóa phần tử đầu mảng
pop(): Xóa phần tử cuối mảng
splice(): xóa các phần từ. Vì sao e nói là "các", nếu muốn xóa 4 phần tử đầu thì dùng nó
join():Chuyển array thành chuỗi với khoảng cách giữa các element tùy chỉnh. Bác nào code js thuần thì làm việc với cái này như cơm
concat(): Nối mảng
toString(): Chuyển array thành chuỗi nhưng khoảng cách giữa các element có dấu phẩy ngăn
filter(): Lọc mảng và trả về 1 mang mới gồm các phần tử thỏa mãn điều
find(): Tìm kiếm phần tử thỏa mãn yêu cầu xuất hiện đầu tiên trong array. Khi tìm xong thì sẽ trả về và kết thúc tìm kiếm
forEach()
map()
Rất nhiều bác dễ nhầm lẫn và không biết use forEach() hay map() trong từng case. Vì 2 cái này công dụng như nhau, nhưng cách thức hoạt động và hàm trả về lại khác nhau hoàn toàn. forEach() và map() đều làm thay đổi giá trị trong mảng theo đúng yêu cầu của mình, nhưng forEach() nó sẽ không trả lại giá trị nào trong khi map thì lại có. Và 1 điều hết sức qtrong là forEach() nó hoạt động bằng cách dùng hàm callback và thay đổi giá trị ban đầu của mảng, tức là ta sẽ mất đi mảng cũ. Trong khi đó map() nó sẽ trả về 1 mảng mới bằng với số lượng mảng cũ, và không thay đổi giá trị mảng cũ.
Em nghĩ bài này nên end ở đây, còn object thì để xuống bài sau vì còn dành time cho các bác code lại nhất là phần các phương thức xử lí mảng. 14 phương thức đó tất nhiên k phải tất cả, nhưng e nghĩ các bác nên code ví dụ từng cái rồi xem cách thức hoạt động và nó return ra cái gì thì mới nhớ lâu đc. Hồi e học lập trình rất hay code linh tinh xem nó đúng hay sai, ở trên e có nói về biến đơn, hồi đó e code biến đơn gán 2 giá trị( thử từng cái với từ khóa khai báo biến). Và tất nhiên nó báo error , e coppy cái error đó lên mạng tìm hiểu xem vì sao lại sai.
 
Toán tử logic trong js hoạt động khác xíu đó bạn, trong js có 1 list dữ liệu được gọi là falsy value
View attachment 1424135
Toán tử && sẽ hoạt động theo cơ chế: true && true => true, false && true => false, true && false => false (vậy thì theo bảng ở trên 1 && 0 => 0 chứ không phải trả về bool, 1 && 2 => 2 tương tự, như trong react họ hay có cách viết là condition && <Component />). Đối với || thì ngược lại && nhưng phương pháp chạy cũng gần như vậy.
Ngoài ra đối với ! cũng có cách viết rất hay là !! explicit coercion thay vì để implicit coercion/Boolean(value)
trong js có toán tử bitwise k bác
 
Toán tử logic trong js hoạt động khác xíu đó bạn, trong js có 1 list dữ liệu được gọi là falsy value
View attachment 1424135
Toán tử && sẽ hoạt động theo cơ chế: true && true => true, false && true => false, true && false => false (vậy thì theo bảng ở trên 1 && 0 => 0 chứ không phải trả về bool, 1 && 2 => 2 tương tự, như trong react họ hay có cách viết là condition && <Component />). Đối với || thì ngược lại && nhưng phương pháp chạy cũng gần như vậy.
Ngoài ra đối với ! cũng có cách viết rất hay là !! explicit coercion thay vì để implicit coercion/Boolean(value)
Mình bổ sung thêm cái khẩu quyết mình dùng để học toán tử logic trong javascript:
  • Tất cả đều quy về truly và falsy. Toán tử && sẽ trả về giá trị gốc của cái falsy đầu tiên, nếu không có falsy thì trả về giá trị gốc của cái cuối cùng => Ví dụ: (1 && "abc" && true && 3) sẽ trả về 3 vì cả dãy ko có giá trị nào falsy cả nên trả về giá trị gốc của cái cuối cùng, tức là 3.
  • || thì ngược lại.
 
Ủng hộ thớt, mình kỹ sư phần mềm lớp dev chính hiệu cơ mà ra làm trái ngành mấy năm ko còn nhớ cái gì, định học react làm lại cái web cá nhân
 
chủ tus, mong bác nói kĩ phần eventloop, asynchronous,cơ chế non-blocking đồ thêm đi ạ.
Mình đóng góp như này
Quá trình compile code của javascript như sau.
1. Call stack: Call Stack là một cấu trúc dữ liệu dạng ngăn xếp (stack) dùng để chứa thông tin về hoạt động của chương trình máy tính trong lúc thực thi. Khi xảy ra lỗi sẽ nhìn thấy ở log, ví dụ như stack trace, stack overflow(xảy ra 1 vòng lặp quá kích thước tối đa của stack)
2. JavaScript Runtime: JS Runtime là browser's JS runtime environment. Và nó bao gồm những thành phần sau đây: Event loop, Web APIs, Callback Queue
3. Cơ chế event loop: Khi các dòng lệnh chuẩn bị thực thi thực thi. JS runtime sinh ra 1 sự kiện tên là Event Loop, sự kiện này được chạy trong suốt quá trình runtime. Sự kiện này đưa các dòng lệnh vào call stack, web APIs, Callback Queue
4. Cơ chế bất đồng bộ: Từ cơ chế event loop, Js run time có 1 bộ đếm timer(), hàm này giúp đếm thời gian thực thi của stack, nếu stack nào có sử dụng web APIs (setTimeout, xhr, connection, http request v.v.v) => bộ đếm timer sẽ lớn. event loop sẽ đưa stack đó vào Queue để thực thi và stack tiếp theo được thực hiện, sau khi stack có timer lớn thực hiện xong thì sẽ trả về kết quả ==> nguyên nhân vì sao xảy ra tình trạng bất đồng bộ.
Có gì sai xót các fen góp ý giúp
 
Mình đóng góp như này
Quá trình compile code của javascript như sau.
1. Call stack: Call Stack là một cấu trúc dữ liệu dạng ngăn xếp (stack) dùng để chứa thông tin về hoạt động của chương trình máy tính trong lúc thực thi. Khi xảy ra lỗi sẽ nhìn thấy ở log, ví dụ như stack trace, stack overflow(xảy ra 1 vòng lặp quá kích thước tối đa của stack)
2. JavaScript Runtime: JS Runtime là browser's JS runtime environment. Và nó bao gồm những thành phần sau đây: Event loop, Web APIs, Callback Queue
3. Cơ chế event loop: Khi các dòng lệnh chuẩn bị thực thi thực thi. JS runtime sinh ra 1 sự kiện tên là Event Loop, sự kiện này được chạy trong suốt quá trình runtime. Sự kiện này đưa các dòng lệnh vào call stack, web APIs, Callback Queue
4. Cơ chế bất đồng bộ: Từ cơ chế event loop, Js run time có 1 bộ đếm timer(), hàm này giúp đếm thời gian thực thi của stack, nếu stack nào có sử dụng web APIs (setTimeout, xhr, connection, http request v.v.v) => bộ đếm timer sẽ lớn. event loop sẽ đưa stack đó vào Queue để thực thi và stack tiếp theo được thực hiện, sau khi stack có timer lớn thực hiện xong thì sẽ trả về kết quả ==> nguyên nhân vì sao xảy ra tình trạng bất đồng bộ.
Có gì sai xót các fen góp ý giúp
4. Tất cả các async callback gọi bởi Web APIs (setInterval(), setTimeout()...) sẽ được cho vào callback queue. Có nghĩa là kể cả khi bạn dùng cái setTimeOut và truyền cho nó 1 callback kèm thời gian chờ bằng 0 thì callback đó vẫn được cho vào callback queue chứ ko phải là dự vào thời gian thực thi để đưa vào.

Có thể test thử đoạn code này để thấy:
JavaScript:
console.log(1);
setTimeout(() => console.log(2), 0);
console.log(3);
console.log(4);
console.log(5);
console.log(6);
console.log(7);
console.log(8);
console.log(9);
console.log(10);
Kết quả sẽ luôn là: 1 3 4 5 6 7 8 9 10 2 dù console.log(2) được set thời gian chờ là 0.
 
Last edited:
Back
Top