JavaScript là ngôn ngữ kịch bản được sử dụng trong các trang web để thêm chức năng và tính tương tác. Đối với người mới bắt đầu đến từ một ngôn ngữ lập trình khác, JavaScript khá dễ hiểu. Với một vài hướng dẫn, bạn sẽ có thể bắt đầu với nó ngay lập tức
Tuy nhiên, có một vài lỗi phổ biến mà nhiều lập trình viên mới bắt đầu mắc phải. Trong bài viết này, chúng tôi sẽ giải quyết 9 lỗi phổ biến [hoặc các lỗi thực hành không tốt] và các giải pháp của chúng để giúp bạn trở thành một nhà phát triển JS giỏi hơn
Nhầm lẫn các toán tử gán [=] và đẳng thức [==, ===]
Giống như tên gọi của nó, toán tử gán [=] được sử dụng để gán giá trị cho các biến. Các nhà phát triển thường nhầm lẫn nó với toán tử đẳng thức
Đây là một ví dụ
const name = "javascript";
if [[name = "nodejs"]] {
console.log[name];
}
// output - nodejs
Biến tên và chuỗi ‘nodejs' không được so sánh trong trường hợp này. Thay vào đó, 'nodejs' được gán cho tên và 'nodejs' được in ra bảng điều khiển
Trong JavaScript, dấu bằng kép [==] và dấu bằng ba [===] được gọi là toán tử so sánh
Đối với đoạn mã trên, đây là cách thích hợp để so sánh các giá trị
const name = "javascript";
if [name == "nodejs"] {
console.log[name];
}
// no output
// OR
if [name === "nodejs"] {
console.log[name];
}
// no output
Sự khác biệt giữa các toán tử so sánh này là dấu bằng kép thực hiện phép so sánh lỏng lẻo trong khi dấu bằng ba thực hiện phép so sánh nghiêm ngặt
Trong một so sánh lỏng lẻo, chỉ các giá trị được so sánh. Nhưng trong một so sánh nghiêm ngặt, các giá trị và kiểu dữ liệu được so sánh
Đoạn mã sau giải thích nó tốt hơn
const number = "1";
console.log[number == 1];
// true
console.log[number === 1];
// false
Biến số được gán giá trị chuỗi là 1. Khi được so sánh với 1 [của loại số] bằng cách sử dụng giá trị kép, nó sẽ trả về giá trị đúng vì cả hai giá trị đều là 1
Nhưng khi so sánh bằng ba giá trị, nó trả về false vì mỗi giá trị có một kiểu dữ liệu khác nhau
Mong đợi các cuộc gọi lại được đồng bộ
Gọi lại là một cách mà JavaScript xử lý các hoạt động không đồng bộ. Tuy nhiên, các lời hứa và không đồng bộ/chờ đợi là các phương pháp thích hợp hơn để xử lý các hoạt động không đồng bộ vì nhiều lệnh gọi lại dẫn đến địa ngục gọi lại
Gọi lại không đồng bộ. Chúng được sử dụng như một chức năng được gọi sau một hoạt động khi quá trình thực thi bị trì hoãn hoàn tất
Một ví dụ là hàm
const number = "1";
console.log[number == 1];
// true
console.log[number === 1];
// false
3 toàn cầu nhận hàm gọi lại làm đối số đầu tiên và thời lượng [tính bằng ms] làm đối số thứ hai như vậyfunction callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
Sau 300 mili giây, chức năng gọi lại được gọi. Nhưng trước khi hoàn thành, phần còn lại của mã sẽ chạy. Đây là lý do tại sao giao diện điều khiển cuối cùng. nhật ký được chạy đầu tiên. .
Một lỗi phổ biến mà các nhà phát triển mắc phải là hiểu sai các cuộc gọi lại là đồng bộ. Ví dụ: một cuộc gọi lại trả về một giá trị sẽ được sử dụng cho các hoạt động khác
Đây là sai lầm đó
function addTwoNumbers[] {
let firstNumber = 5;
let secondNumber;
setTimeout[function [] {
secondNumber = 10;
}, 200];
console.log[firstNumber + secondNumber];
}
addTwoNumbers[];
// NaN
const number = "1";
console.log[number == 1];
// true
console.log[number === 1];
// false
4 là đầu ra vì const number = "1";
console.log[number == 1];
// true
console.log[number === 1];
// false
5 không xác định. Tại thời điểm chạy const number = "1";
console.log[number == 1];
// true
console.log[number === 1];
// false
6, const number = "1";
console.log[number == 1];
// true
console.log[number === 1];
// false
7 vẫn chưa được xác định vì hàm const number = "1";
console.log[number == 1];
// true
console.log[number === 1];
// false
8 sẽ thực hiện gọi lại sau const number = "1";
console.log[number == 1];
// true
console.log[number === 1];
// false
9Cách tốt nhất để tiếp cận điều này là thực thi phần còn lại của mã trong hàm gọi lại
const name = "javascript";
if [name == "nodejs"] {
console.log[name];
}
// no output
// OR
if [name === "nodejs"] {
console.log[name];
}
// no output
2Tham chiếu sai đến function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
0
function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
0 là một khái niệm thường bị hiểu lầm trong JavaScript. Để sử dụng function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
2 trong JavaScript, bạn thực sự cần hiểu cách thức hoạt động của nó vì nó hoạt động hơi khác so với các ngôn ngữ khácĐây là một ví dụ về một lỗi phổ biến khi sử dụng
function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
0const name = "javascript";
if [name == "nodejs"] {
console.log[name];
}
// no output
// OR
if [name === "nodejs"] {
console.log[name];
}
// no output
7Kết quả đầu tiên là
function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
4 vì function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
5 trỏ chính xác đến thuộc tính name của đối tượng. Kết quả thứ hai là function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
6 vì function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
0 đã mất tham chiếu đến các thuộc tính của đối tượng [bao gồm cả tên]Điều này là do
function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
0 phụ thuộc vào đối tượng gọi hàm chứa nó. Có một biến function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
2 trong mọi hàm nhưng đối tượng mà nó trỏ tới được xác định bởi đối tượng gọi nófunction callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
0 trong function addTwoNumbers[] {
let firstNumber = 5;
let secondNumber;
setTimeout[function [] {
secondNumber = 10;
}, 200];
console.log[firstNumber + secondNumber];
}
addTwoNumbers[];
// NaN
1 trỏ trực tiếp đến function addTwoNumbers[] {
let firstNumber = 5;
let secondNumber;
setTimeout[function [] {
secondNumber = 10;
}, 200];
console.log[firstNumber + secondNumber];
}
addTwoNumbers[];
// NaN
2. function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
2 trong function addTwoNumbers[] {
let firstNumber = 5;
let secondNumber;
setTimeout[function [] {
secondNumber = 10;
}, 200];
console.log[firstNumber + secondNumber];
}
addTwoNumbers[];
// NaN
4 trỏ trực tiếp đến function addTwoNumbers[] {
let firstNumber = 5;
let secondNumber;
setTimeout[function [] {
secondNumber = 10;
}, 200];
console.log[firstNumber + secondNumber];
}
addTwoNumbers[];
// NaN
5. Nhưng function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
0 trong hàm gọi lại của const number = "1";
console.log[number == 1];
// true
console.log[number === 1];
// false
3 không trỏ đến bất kỳ đối tượng nào vì không có đối tượng nào gọi nóĐối với một đối tượng được gọi là
const number = "1";
console.log[number == 1];
// true
console.log[number === 1];
// false
3, một cái gì đó như function addTwoNumbers[] {
let firstNumber = 5;
let secondNumber;
setTimeout[function [] {
secondNumber = 10;
}, 200];
console.log[firstNumber + secondNumber];
}
addTwoNumbers[];
// NaN
9 sẽ được thực thi. Vì không có đối tượng nào gọi hàm đó nên đối tượng mặc định [là const name = "javascript";
if [name == "nodejs"] {
console.log[name];
}
// no output
// OR
if [name === "nodejs"] {
console.log[name];
}
// no output
20] được sử dụng_
const name = "javascript";
if [name == "nodejs"] {
console.log[name];
}
// no output
// OR
if [name === "nodejs"] {
console.log[name];
}
// no output
21 không tồn tại trên cửa sổ, kết quả là const name = "javascript";
if [name == "nodejs"] {
console.log[name];
}
// no output
// OR
if [name === "nodejs"] {
console.log[name];
}
// no output
22Cách tốt nhất để giữ lại tham chiếu đến
function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
2 trong const number = "1";
console.log[number == 1];
// true
console.log[number === 1];
// false
8 là sử dụng ________ 125, ________ 126, ________ 127 hoặc các hàm mũi tên [được giới thiệu trong ES6]. Không giống như các chức năng thông thường, các chức năng mũi tên không tạo function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
2 của riêng mìnhVì vậy, phần sau đây sẽ giữ nguyên tham chiếu đến
function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
0. .function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
4Bỏ qua tính biến đổi của đối tượng
Không giống như các kiểu dữ liệu nguyên thủy như chuỗi, số, v.v., trong JavaScript các đối tượng là kiểu dữ liệu tham chiếu. Ví dụ: trong các đối tượng khóa-giá trị
function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
5const name = "javascript";
if [name == "nodejs"] {
console.log[name];
}
// no output
// OR
if [name === "nodejs"] {
console.log[name];
}
// no output
70 và const name = "javascript";
if [name == "nodejs"] {
console.log[name];
}
// no output
// OR
if [name === "nodejs"] {
console.log[name];
}
// no output
71 sở hữu cùng một tham chiếu đến vị trí trong bộ nhớ nơi đối tượng được lưu trữTrong mảng
function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
8Một lỗi phổ biến mà các nhà phát triển mắc phải là họ coi thường bản chất này của JavaScript và điều này dẫn đến các lỗi không mong muốn. Chẳng hạn, nếu 5 đối tượng có cùng tham chiếu đến cùng một đối tượng, một trong các đối tượng có thể can thiệp vào các thuộc tính trong cơ sở mã quy mô lớn
Khi điều này xảy ra, mọi nỗ lực truy cập các thuộc tính ban đầu sẽ trả về không xác định hoặc có thể gây ra lỗi
Cách thực hành tốt nhất cho việc này là luôn tạo các tham chiếu mới cho các đối tượng mới khi bạn muốn sao chép một đối tượng. Để làm được điều này, toán tử nghỉ [
const name = "javascript";
if [name == "nodejs"] {
console.log[name];
}
// no output
// OR
if [name === "nodejs"] {
console.log[name];
}
// no output
72 được giới thiệu trong ES6] là một giải pháp hoàn hảoVí dụ: trong các đối tượng khóa-giá trị
const name = "javascript";
if [name == "nodejs"] {
console.log[name];
}
// no output
// OR
if [name === "nodejs"] {
console.log[name];
}
// no output
0trong mảng
const name = "javascript";
if [name == "nodejs"] {
console.log[name];
}
// no output
// OR
if [name === "nodejs"] {
console.log[name];
}
// no output
1Lưu mảng và đối tượng vào bộ lưu trữ của trình duyệt
Đôi khi, khi làm việc với JavaScript, các nhà phát triển có thể muốn tận dụng lợi thế của
const name = "javascript";
if [name == "nodejs"] {
console.log[name];
}
// no output
// OR
if [name === "nodejs"] {
console.log[name];
}
// no output
73 để lưu các giá trị. Nhưng một lỗi phổ biến là cố lưu các mảng và đối tượng như vốn có trong const name = "javascript";
if [name == "nodejs"] {
console.log[name];
}
// no output
// OR
if [name === "nodejs"] {
console.log[name];
}
// no output
73. const name = "javascript";
if [name == "nodejs"] {
console.log[name];
}
// no output
// OR
if [name === "nodejs"] {
console.log[name];
}
// no output
73 chỉ chấp nhận chuỗiTrong nỗ lực lưu các đối tượng, JavaScript chuyển đổi đối tượng thành một chuỗi. Kết quả là
const name = "javascript";
if [name == "nodejs"] {
console.log[name];
}
// no output
// OR
if [name === "nodejs"] {
console.log[name];
}
// no output
76 đối với các đối tượng và một chuỗi được phân tách bằng dấu phẩy đối với các phần tử mảngVí dụ
const name = "javascript";
if [name == "nodejs"] {
console.log[name];
}
// no output
// OR
if [name === "nodejs"] {
console.log[name];
}
// no output
2Khi các đối tượng được lưu như thế này, việc truy cập chúng trở nên khó khăn. Đối với ví dụ đối tượng, việc truy cập đối tượng như
const name = "javascript";
if [name == "nodejs"] {
console.log[name];
}
// no output
// OR
if [name === "nodejs"] {
console.log[name];
}
// no output
77 sẽ dẫn đến lỗi. Điều này là do hiện tại const name = "javascript";
if [name == "nodejs"] {
console.log[name];
}
// no output
// OR
if [name === "nodejs"] {
console.log[name];
}
// no output
76 là một chuỗi, không có thuộc tính const name = "javascript";
if [name == "nodejs"] {
console.log[name];
}
// no output
// OR
if [name === "nodejs"] {
console.log[name];
}
// no output
79Cách tốt hơn để lưu các đối tượng và mảng trong bộ nhớ cục bộ là sử dụng
function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
40 [để chuyển đổi đối tượng thành chuỗi] và function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
41 [để chuyển đổi chuỗi thành đối tượng]. Bằng cách này, việc truy cập các đối tượng trở nên dễ dàngPhiên bản chính xác của đoạn mã trên sẽ là
const name = "javascript";
if [name == "nodejs"] {
console.log[name];
}
// no output
// OR
if [name === "nodejs"] {
console.log[name];
}
// no output
3Không sử dụng giá trị mặc định
Đặt giá trị mặc định trong các biến động là một phương pháp rất tốt để ngăn ngừa các lỗi không mong muốn. Đây là một ví dụ về một sai lầm phổ biến. .
const name = "javascript";
if [name == "nodejs"] {
console.log[name];
}
// no output
// OR
if [name === "nodejs"] {
console.log[name];
}
// no output
4Kết quả là
function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
42 vì function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
43 là const name = "javascript";
if [name == "nodejs"] {
console.log[name];
}
// no output
// OR
if [name === "nodejs"] {
console.log[name];
}
// no output
22 và function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
45 là function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
46. Bằng cách sử dụng các giá trị mặc định, các lỗi như thế này có thể được ngăn chặn. Ví dụconst name = "javascript";
if [name == "nodejs"] {
console.log[name];
}
// no output
// OR
if [name === "nodejs"] {
console.log[name];
}
// no output
5Ngoài ra, tính năng giá trị mặc định được giới thiệu trong ES6 có thể được sử dụng như vậy
const name = "javascript";
if [name == "nodejs"] {
console.log[name];
}
// no output
// OR
if [name === "nodejs"] {
console.log[name];
}
// no output
6Ví dụ này, mặc dù tối thiểu, nhấn mạnh tầm quan trọng của các giá trị mặc định. Ngoài ra, nhà phát triển có thể cung cấp lỗi hoặc thông báo cảnh báo khi giá trị dự kiến không được cung cấp
Đặt tên biến không đúng
Vâng, các nhà phát triển vẫn mắc lỗi này. Đặt tên rất khó, nhưng các nhà phát triển thực sự không có lựa chọn nào khác. Nhận xét là cách thực hành tốt trong lập trình và đặt tên biến cũng vậy
Ví dụ
const name = "javascript";
if [name == "nodejs"] {
console.log[name];
}
// no output
// OR
if [name === "nodejs"] {
console.log[name];
}
// no output
7Biến
function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
47 thì không sao, nhưng còn function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
48 hoặc function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
49 thì sao? const name = "javascript";
if [name == "nodejs"] {
console.log[name];
}
// no output
// OR
if [name === "nodejs"] {
console.log[name];
}
// no output
8Việc đặt tên biến đúng cách rất quan trọng vì nhà phát triển có thể không bao giờ là nhà phát triển duy nhất trên cơ sở mã tại một thời điểm cụ thể hoặc trong tương lai
Đặt tên biến đúng cách sẽ cho phép những người đóng góp dễ dàng hiểu cách thức hoạt động của một dự án
Kiểm tra các giá trị boolean
const name = "javascript";
if [name == "nodejs"] {
console.log[name];
}
// no output
// OR
if [name === "nodejs"] {
console.log[name];
}
// no output
9Thực tế phổ biến là kiểm tra các giá trị boolean như đã thấy trong đoạn mã trên. Mặc dù điều này không sao, nhưng đã xảy ra lỗi khi kiểm tra một số giá trị
Trong JavaScript, một phép so sánh lỏng lẻo giữa
function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
50 và function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
51 trả về function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
52 và function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
53 và function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
54 trả về function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
52. Điều này có nghĩa là nếu function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
56 là function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
53, thì function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
56 sẽ là function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
52Đây cũng là lỗi thường mắc phải ở các đối tượng. Ví dụ
const number = "1";
console.log[number == 1];
// true
console.log[number === 1];
// false
0Mặc dù thuộc tính
function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
80 tồn tại, nhưng function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
81 trả về function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
50, là giá trị function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
83, do đó, khối function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
84 được thực thiVì vậy, trừ khi bạn chắc chắn về phạm vi giá trị sẽ được sử dụng, các giá trị và thuộc tính boolean trong các đối tượng sẽ được kiểm tra như thế này
const number = "1";
console.log[number == 1];
// true
console.log[number === 1];
// false
1Nhầm lẫn bổ sung và nối
Dấu cộng
function callback[] {
console.log["I am the first"];
}
setTimeout[callback, 300];
console.log["I am the last"];
// output
// I am the last
// I am the first
85 có hai chức năng trong JavaScript. cộng và nối. Phép cộng dành cho số và Phép nối dành cho chuỗi. Một số nhà phát triển thường sử dụng sai toán tử nàyVí dụ
const number = "1";
console.log[number == 1];
// true
console.log[number === 1];
// false
2Khi thêm chuỗi và số, JavaScript sẽ chuyển đổi số thành chuỗi và nối tất cả các giá trị. Để cộng các số, một phép toán được thực hiện. .
Phần kết luận
Tất nhiên, có nhiều lỗi [một số nhỏ, một số nghiêm trọng] hơn những lỗi được liệt kê ở trên. Vì vậy, chỉ cần đảm bảo rằng bạn luôn cập nhật những phát triển trong ngôn ngữ
Nghiên cứu và tránh những sai lầm này sẽ giúp bạn xây dựng các công cụ và ứng dụng web tốt hơn và đáng tin cậy hơn
QUẢNG CÁO
QUẢNG CÁO
QUẢNG CÁO
QUẢNG CÁO
QUẢNG CÁO
QUẢNG CÁO
QUẢNG CÁO
QUẢNG CÁO
QUẢNG CÁO
[ Kỹ sư phần mềm full-stack. Nhà phát triển phụ trợ. Pythonista ] Tôi thích viết mã bằng python. Trong thời gian rảnh của tôi, tôi đọc sách. Tôi thích học hỏi và trải nghiệm những kỹ năng mới
Nếu bạn đọc đến đây, hãy tweet cho tác giả để cho họ thấy bạn quan tâm. Tweet một lời cảm ơn
Học cách viết mã miễn phí. Chương trình giảng dạy mã nguồn mở của freeCodeCamp đã giúp hơn 40.000 người có được việc làm với tư cách là nhà phát triển. Bắt đầu