"hello".repeat[3]
"hello".includes["ll"]
"hello".startsWith["he"]
"hello".padStart[8] // " hello"
"hello".padEnd[8] // "hello "
"hello".padEnd[8, '!'] // hello!!!
"\u1E9B\u0323".normalize["NFC"]
5 là "hello".repeat[3]
"hello".includes["ll"]
"hello".startsWith["he"]
"hello".padStart[8] // " hello"
"hello".padEnd[8] // "hello "
"hello".padEnd[8, '!'] // hello!!!
"\u1E9B\u0323".normalize["NFC"]
6 mới. Các hằng số hoạt động giống như "hello".repeat[3]
"hello".includes["ll"]
"hello".startsWith["he"]
"hello".padStart[8] // " hello"
"hello".padEnd[8] // "hello "
"hello".padEnd[8, '!'] // hello!!!
"\u1E9B\u0323".normalize["NFC"]
5, nhưng không thể gán lại. Nhìn thấy. Tài liệu này là một tài liệu dành cho JavaScript mà bạn sẽ thường gặp trong các dự án hiện đại và hầu hết các mã mẫu hiện đại
Hướng dẫn này không nhằm dạy bạn JavaScript từ đầu, mà để giúp các nhà phát triển có kiến thức cơ bản, những người có thể gặp khó khăn trong việc làm quen với các cơ sở mã hiện đại [hoặc giả sử học React chẳng hạn] vì các khái niệm JavaScript được sử dụng
Bên cạnh đó, đôi khi tôi sẽ cung cấp các mẹo cá nhân có thể gây tranh cãi nhưng sẽ lưu ý rằng đó là đề xuất cá nhân khi tôi làm như vậy
Ghi chú. Hầu hết các khái niệm được giới thiệu ở đây đều đến từ bản cập nhật ngôn ngữ JavaScript [ES2015, thường được gọi là ES6]. Bạn có thể tìm thấy các tính năng mới được bổ sung bởi bản cập nhật này tại đây;
Tài nguyên bổ sung
Khi bạn đấu tranh để hiểu một khái niệm, tôi khuyên bạn nên tìm kiếm câu trả lời trên các nguồn sau
Mục lục
quan niệm
Sự định nghĩa biến. var, const, hãy để
Trong JavaScript, có sẵn ba từ khóa để khai báo một biến và mỗi từ khóa đều có sự khác biệt của nó. Đó là
const myVar = "Nick";
myVar = "John" // raises an error, reassignment is not allowed
5, const myVar = "Nick";
myVar = "John" // raises an error, reassignment is not allowed
6 và const myVar = "Nick";
myVar = "John" // raises an error, reassignment is not allowed
7giải thích ngắn
Các biến được khai báo với từ khóa
const myVar = "Nick";
myVar = "John" // raises an error, reassignment is not allowed
7 không thể được chỉ định lại, trong khi const myVar = "Nick";
myVar = "John" // raises an error, reassignment is not allowed
6 và const myVar = "Nick";
myVar = "John" // raises an error, reassignment is not allowed
5 có thểTôi khuyên bạn nên luôn khai báo các biến của mình với ____3_______7 theo mặc định, nhưng với ____3_______6 nếu đó là một biến mà bạn cần thay đổi hoặc gán lại sau này
mã mẫu
const person = "Nick";
person = "John" // Will raise an error, person can't be reassigned
let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
Lời giải chi tiết
Biến của một biến đại khái có nghĩa là “biến này có sẵn ở đâu trong mã”
varconst myVar = "Nick";
myVar = "John" // raises an error, reassignment is not allowed
5 biến được khai báo là phạm vi chức năng, nghĩa là khi một biến được tạo trong một hàm, mọi thứ trong hàm đó đều có thể truy cập vào biến đó. Ngoài ra, không thể truy cập một biến phạm vi chức năng được tạo trong một chức năng bên ngoài chức năng nàyTôi khuyên bạn nên hình dung nó như thể một biến trong phạm vi X có nghĩa là biến này là một thuộc tính của X
function myFunction[] {
var myVar = "Nick";
console.log[myVar]; // "Nick" - myVar is accessible inside the function
}
console.log[myVar]; // Throws a ReferenceError, myVar is not accessible outside the function.
Vẫn tập trung vào phạm vi biến, đây là một ví dụ tinh tế hơn
function myFunction[] {
var myVar = "Nick";
if [true] {
var myVar = "John";
console.log[myVar]; // "John"
// actually, myVar being function scoped, we just erased the previous myVar value "Nick" for "John"
}
console.log[myVar]; // "John" - see how the instructions in the if block affected this value
}
console.log[myVar]; // Throws a ReferenceError, myVar is not accessible outside the function.
Ngoài ra, các biến được khai báo var được chuyển lên đầu phạm vi khi thực thi. Đây là những gì chúng ta gọi
Phần mã này
console.log[myVar] // undefined -- no error raised
var myVar = 2;
được hiểu khi thực hiện như
var myVar;
console.log[myVar] // undefined -- no error raised
myVar = 2;
cho phépconst myVar = "Nick";
myVar = "John" // raises an error, reassignment is not allowed
5 và const myVar = "Nick";
myVar = "John" // raises an error, reassignment is not allowed
6 gần giống nhau, nhưng biến khai báo const myVar = "Nick";
myVar = "John" // raises an error, reassignment is not allowed
6- nằm trong phạm vi khối
- không thể truy cập trước khi chúng được chỉ định
- không thể được khai báo lại trong cùng một phạm vi
Hãy xem tác động của phạm vi khối lấy ví dụ trước của chúng tôi
function myFunction[] {
let myVar = "Nick";
if [true] {
let myVar = "John";
console.log[myVar]; // "John"
// actually, myVar being block scoped, we just created a new variable myVar.
// this variable is not accessible outside this block and totally independent
// from the first myVar created !
}
console.log[myVar]; // "Nick", see how the instructions in the if block DID NOT affect this value
}
console.log[myVar]; // Throws a ReferenceError, myVar is not accessible outside the function.
Bây giờ, ý nghĩa của việc biến let [và const] không thể truy cập được trước khi được gán
console.log[myVar] // raises a ReferenceError !
let myVar = 2;
Ngược lại với các biến var, nếu bạn cố gắng đọc hoặc viết trên một biến let hoặc const trước khi chúng được gán thì một lỗi sẽ xuất hiện. Hiện tượng này thường được gọi là hoặc TDZ
Ghi chú. Về mặt kỹ thuật, các khai báo biến let và const cũng đang được nâng lên, nhưng không phải là phép gán của chúng. Vì chúng được tạo ra để không thể sử dụng chúng trước khi gán, nên theo trực giác, có cảm giác như không có cẩu, nhưng có. Tìm hiểu thêm về lời giải thích rất chi tiết này tại đây nếu bạn muốn biết thêm
Ngoài ra, bạn không thể khai báo lại biến let
let myVar = 2;
let myVar = 3; // Raises a SyntaxError
hằng sốconst myVar = "Nick";
myVar = "John" // raises an error, reassignment is not allowed
7 các biến đã khai báo hoạt động giống như các biến let, nhưng chúng cũng không thể được gán lạiTóm lại, các biến const
- nằm trong phạm vi khối
- không thể truy cập trước khi được chỉ định
- không thể được khai báo lại trong cùng một phạm vi
- không thể chỉ định lại
const myVar = "Nick";
myVar = "John" // raises an error, reassignment is not allowed
let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
0Nhưng có một sự tinh tế.
const myVar = "Nick";
myVar = "John" // raises an error, reassignment is not allowed
7 biến không. Cụ thể, điều đó có nghĩa là các biến được khai báo của đối tượng và mảng const myVar = "Nick";
myVar = "John" // raises an error, reassignment is not allowed
7 có thể bị thay đổiĐối với các đối tượng
let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
1Đối với mảng
let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
2tài nguyên bên ngoài
chức năng mũi tên
Bản cập nhật JavaScript ES6 đã giới thiệu các hàm mũi tên, đây là một cách khác để khai báo và sử dụng các hàm. Dưới đây là những lợi ích mà chúng mang lại
- Ngắn gọn hơn
- cái này được chọn từ môi trường xung quanh
- trả lại ngầm định
mã mẫu
- Kết luận và trả lại ngầm định
let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
3let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
4Trong một hàm mũi tên, giá trị này bằng với giá trị này của bối cảnh thực thi kèm theo. Về cơ bản, với arrow functions, bạn không cần phải làm thủ thuật “that = this” trước khi gọi một hàm bên trong một hàm nữa
let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
5Lời giải chi tiết
súc tíchCác hàm mũi tên ngắn gọn hơn các hàm truyền thống theo nhiều cách. Hãy xem xét tất cả các trường hợp có thể
- Trả về tiềm ẩn VS rõ ràng
Trả về rõ ràng là một hàm trong đó từ khóa trả về được sử dụng trong phần thân của nó
let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
6Theo cách viết hàm truyền thống, trả về luôn rõ ràng. Nhưng với các hàm mũi tên, bạn có thể thực hiện trả về ngầm định, điều đó có nghĩa là bạn không cần sử dụng từ khóa return để trả về một giá trị
let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
7Vì chức năng này chỉ trả về một cái gì đó [không có hướng dẫn trước từ khóa trả về], chúng tôi có thể thực hiện trả về ngầm định
let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
8Để làm như vậy, chúng ta chỉ cần bỏ dấu ngoặc và từ khóa return. Đó là lý do tại sao nó được gọi là trả về ngầm định, không có từ khóa trả về, nhưng hàm này thực sự sẽ trả về
let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
10Ghi chú. Nếu hàm của bạn không trả về một giá trị [có tác dụng phụ], thì nó không thực hiện trả về rõ ràng hay ẩn
Ngoài ra, nếu bạn muốn trả về một đối tượng hoàn toàn, bạn phải có dấu ngoặc đơn xung quanh nó vì nó sẽ xung đột với dấu ngoặc nhọn
let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
9Nếu hàm của bạn chỉ nhận một tham số, bạn có thể bỏ qua dấu ngoặc đơn xung quanh nó. Nếu chúng tôi lấy lại mã kép ở trên
function myFunction[] {
var myVar = "Nick";
console.log[myVar]; // "Nick" - myVar is accessible inside the function
}
console.log[myVar]; // Throws a ReferenceError, myVar is not accessible outside the function.
0Dấu ngoặc đơn xung quanh tham số có thể tránh được
function myFunction[] {
var myVar = "Nick";
console.log[myVar]; // "Nick" - myVar is accessible inside the function
}
console.log[myVar]; // Throws a ReferenceError, myVar is not accessible outside the function.
1Khi không có đối số nào được cung cấp cho hàm mũi tên, bạn cần cung cấp dấu ngoặc đơn, nếu không cú pháp sẽ không hợp lệ
function myFunction[] {
var myVar = "Nick";
console.log[myVar]; // "Nick" - myVar is accessible inside the function
}
console.log[myVar]; // Throws a ReferenceError, myVar is not accessible outside the function.
2function myFunction[] {
var myVar = "Nick";
console.log[myVar]; // "Nick" - myVar is accessible inside the function
}
console.log[myVar]; // Throws a ReferenceError, myVar is not accessible outside the function.
3tài liệu tham khảo nàyĐể hiểu sự tinh tế này được giới thiệu với các hàm mũi tên, bạn phải biết cách hoạt động trong JavaScript
Trong một hàm mũi tên, giá trị này bằng với giá trị này của bối cảnh thực thi kèm theo. Điều đó có nghĩa là một hàm mũi tên không tạo cái này mới, thay vào đó, nó lấy nó từ xung quanh nó
Không có arrow function, nếu bạn muốn truy cập một biến từ this trong một hàm bên trong một hàm, bạn phải sử dụng thủ thuật that = this hoặc self = this
Chẳng hạn, sử dụng hàm setTimeout bên trong myFunc
function myFunction[] {
var myVar = "Nick";
console.log[myVar]; // "Nick" - myVar is accessible inside the function
}
console.log[myVar]; // Throws a ReferenceError, myVar is not accessible outside the function.
4Nhưng với chức năng mũi tên, cái này được lấy từ xung quanh nó
function myFunction[] {
var myVar = "Nick";
console.log[myVar]; // "Nick" - myVar is accessible inside the function
}
console.log[myVar]; // Throws a ReferenceError, myVar is not accessible outside the function.
5tài nguyên hữu ích
Giá trị tham số mặc định của hàm
Bắt đầu từ bản cập nhật JavaScript ES2015, bạn có thể đặt giá trị mặc định cho các tham số chức năng của mình bằng cú pháp sau
function myFunction[] {
var myVar = "Nick";
console.log[myVar]; // "Nick" - myVar is accessible inside the function
}
console.log[myVar]; // Throws a ReferenceError, myVar is not accessible outside the function.
6Tham số mặc định được áp dụng trong hai và chỉ hai trường hợp
- Không có tham số được cung cấp
- tham số không xác định được cung cấp
Nói cách khác, nếu bạn truyền null thì tham số mặc định sẽ không được áp dụng
Ghi chú. Gán giá trị mặc định cũng có thể được sử dụng với các tham số bị hủy cấu trúc [xem khái niệm tiếp theo để xem ví dụ]
tài nguyên bên ngoài
Phá hủy các đối tượng và mảng
Phá hủy là một cách thuận tiện để tạo các biến mới bằng cách trích xuất một số giá trị từ dữ liệu được lưu trữ trong các đối tượng hoặc mảng
Để đặt tên cho một vài trường hợp sử dụng, việc hủy cấu trúc có thể được sử dụng để hủy cấu trúc các tham số chức năng hoặc điều này. props trong các dự án React chẳng hạn
Giải thích với mã mẫu
Hãy xem xét đối tượng sau cho tất cả các mẫu
function myFunction[] {
var myVar = "Nick";
console.log[myVar]; // "Nick" - myVar is accessible inside the function
}
console.log[myVar]; // Throws a ReferenceError, myVar is not accessible outside the function.
7Không phá hủy
function myFunction[] {
var myVar = "Nick";
console.log[myVar]; // "Nick" - myVar is accessible inside the function
}
console.log[myVar]; // Throws a ReferenceError, myVar is not accessible outside the function.
8Với phá hủy, tất cả trong một dòng
function myFunction[] {
var myVar = "Nick";
console.log[myVar]; // "Nick" - myVar is accessible inside the function
}
console.log[myVar]; // Throws a ReferenceError, myVar is not accessible outside the function.
9Ghi chú. Trong
let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
11, dấu ngoặc sau từ khóa const không được sử dụng để khai báo một đối tượng hay một khối mà là cú pháp phá hủyHủy cấu trúc thường được sử dụng để hủy cấu trúc các tham số của đối tượng trong các hàm
Không phá hủy
function myFunction[] {
var myVar = "Nick";
if [true] {
var myVar = "John";
console.log[myVar]; // "John"
// actually, myVar being function scoped, we just erased the previous myVar value "Nick" for "John"
}
console.log[myVar]; // "John" - see how the instructions in the if block affected this value
}
console.log[myVar]; // Throws a ReferenceError, myVar is not accessible outside the function.
0Khi phá hủy tham số đối tượng person, chúng ta có một hàm ngắn gọn hơn
function myFunction[] {
var myVar = "Nick";
if [true] {
var myVar = "John";
console.log[myVar]; // "John"
// actually, myVar being function scoped, we just erased the previous myVar value "Nick" for "John"
}
console.log[myVar]; // "John" - see how the instructions in the if block affected this value
}
console.log[myVar]; // Throws a ReferenceError, myVar is not accessible outside the function.
1Việc hủy cấu trúc thậm chí còn dễ chịu hơn khi sử dụng với
function myFunction[] {
var myVar = "Nick";
if [true] {
var myVar = "John";
console.log[myVar]; // "John"
// actually, myVar being function scoped, we just erased the previous myVar value "Nick" for "John"
}
console.log[myVar]; // "John" - see how the instructions in the if block affected this value
}
console.log[myVar]; // Throws a ReferenceError, myVar is not accessible outside the function.
2Hãy xem xét mảng sau
function myFunction[] {
var myVar = "Nick";
if [true] {
var myVar = "John";
console.log[myVar]; // "John"
// actually, myVar being function scoped, we just erased the previous myVar value "Nick" for "John"
}
console.log[myVar]; // "John" - see how the instructions in the if block affected this value
}
console.log[myVar]; // Throws a ReferenceError, myVar is not accessible outside the function.
3Không phá hủy
function myFunction[] {
var myVar = "Nick";
if [true] {
var myVar = "John";
console.log[myVar]; // "John"
// actually, myVar being function scoped, we just erased the previous myVar value "Nick" for "John"
}
console.log[myVar]; // "John" - see how the instructions in the if block affected this value
}
console.log[myVar]; // Throws a ReferenceError, myVar is not accessible outside the function.
4Với phá hủy
function myFunction[] {
var myVar = "Nick";
if [true] {
var myVar = "John";
console.log[myVar]; // "John"
// actually, myVar being function scoped, we just erased the previous myVar value "Nick" for "John"
}
console.log[myVar]; // "John" - see how the instructions in the if block affected this value
}
console.log[myVar]; // Throws a ReferenceError, myVar is not accessible outside the function.
5tài nguyên hữu ích
Các phương thức mảng - ánh xạ/lọc/giảm/tìm
Ánh xạ, lọc, rút gọn và tìm là các phương thức mảng đến từ một mô hình lập trình có tên là lập trình chức năng
Tóm lại
- Mảng. nguyên mẫu. map[] lấy một mảng, thực hiện điều gì đó trên các phần tử của nó và trả về một mảng với các phần tử đã chuyển đổi
- Mảng. nguyên mẫu. filter[] lấy một mảng, quyết định từng phần tử xem nó có nên giữ lại hay không và trả về một mảng chỉ với các phần tử được giữ
- Mảng. nguyên mẫu. reduce[] lấy một mảng và tổng hợp các phần tử thành một giá trị duy nhất [được trả về]
- Mảng. nguyên mẫu. find[] lấy một mảng và trả về phần tử đầu tiên thỏa mãn điều kiện đã cho
Tôi khuyên bạn nên sử dụng chúng càng nhiều càng tốt theo các nguyên tắc lập trình chức năng vì chúng có thể kết hợp được, ngắn gọn và thanh lịch
Với bốn phương thức đó, bạn có thể tránh sử dụng các vòng lặp for và forEach trong hầu hết các trường hợp. Khi bạn muốn thực hiện một vòng lặp for, hãy thử thực hiện với bản đồ, bộ lọc, thu gọn và tìm tổng hợp. Ban đầu, bạn có thể gặp khó khăn khi thực hiện vì nó yêu cầu bạn học cách suy nghĩ mới, nhưng khi bạn đã hiểu thì mọi thứ sẽ trở nên dễ dàng hơn.
mã mẫu
function myFunction[] {
var myVar = "Nick";
if [true] {
var myVar = "John";
console.log[myVar]; // "John"
// actually, myVar being function scoped, we just erased the previous myVar value "Nick" for "John"
}
console.log[myVar]; // "John" - see how the instructions in the if block affected this value
}
console.log[myVar]; // Throws a ReferenceError, myVar is not accessible outside the function.
6Tính tổng điểm cho học sinh từ lớp 10 trở lên bằng cách soạn bản đồ, lọc và rút gọn
function myFunction[] {
var myVar = "Nick";
if [true] {
var myVar = "John";
console.log[myVar]; // "John"
// actually, myVar being function scoped, we just erased the previous myVar value "Nick" for "John"
}
console.log[myVar]; // "John" - see how the instructions in the if block affected this value
}
console.log[myVar]; // Throws a ReferenceError, myVar is not accessible outside the function.
7Giải trình
Hãy xem xét mảng số sau đây cho các ví dụ của chúng tôi
function myFunction[] {
var myVar = "Nick";
if [true] {
var myVar = "John";
console.log[myVar]; // "John"
// actually, myVar being function scoped, we just erased the previous myVar value "Nick" for "John"
}
console.log[myVar]; // "John" - see how the instructions in the if block affected this value
}
console.log[myVar]; // Throws a ReferenceError, myVar is not accessible outside the function.
8Mảng. nguyên mẫu. bản đồ[]function myFunction[] {
var myVar = "Nick";
if [true] {
var myVar = "John";
console.log[myVar]; // "John"
// actually, myVar being function scoped, we just erased the previous myVar value "Nick" for "John"
}
console.log[myVar]; // "John" - see how the instructions in the if block affected this value
}
console.log[myVar]; // Throws a ReferenceError, myVar is not accessible outside the function.
9Điều gì đang xảy ra ở đây? . bản đồ trên mảng số, bản đồ đang lặp lại trên từng phần tử của mảng và chuyển nó vào hàm của chúng tôi. Mục tiêu của hàm là tạo và trả về một giá trị mới từ giá trị được truyền để bản đồ có thể thay thế nó
Hãy trích xuất chức năng này để làm cho nó rõ ràng hơn, chỉ cho điều này một lần
console.log[myVar] // undefined -- no error raised
var myVar = 2;
0Ghi chú. Bạn sẽ thường xuyên gặp phải phương pháp này được sử dụng kết hợp với
console.log[myVar] // undefined -- no error raised
var myVar = 2;
1let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
12 tạo ra let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
13 bằng với let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
14Mảng. nguyên mẫu. lọc[]Ghi chú. Nếu bạn không cần trả về một mảng mới và chỉ muốn thực hiện một vòng lặp có tác dụng phụ, bạn có thể chỉ muốn sử dụng vòng lặp for/forEach thay vì bản đồ
console.log[myVar] // undefined -- no error raised
var myVar = 2;
2Ghi chú. Bạn sẽ thường xuyên gặp phải phương pháp này được sử dụng kết hợp với
console.log[myVar] // undefined -- no error raised
var myVar = 2;
3Chúng tôi đang sử dụng. bộ lọc trên mảng số, bộ lọc đang lặp lại trên từng phần tử của mảng và chuyển nó vào hàm của chúng ta. Mục tiêu của hàm là trả về một boolean sẽ xác định xem giá trị hiện tại có được giữ hay không. Bộ lọc sau đó trả về mảng chỉ với các giá trị được lưu giữ
Mảng. nguyên mẫu. giảm bớt[]Mục tiêu của phương thức rút gọn là giảm tất cả các phần tử của mảng mà nó lặp lại thành một giá trị duy nhất. Cách nó tổng hợp các yếu tố đó tùy thuộc vào bạn
console.log[myVar] // undefined -- no error raised
var myVar = 2;
4Ghi chú. Bạn sẽ thường xuyên gặp phải phương pháp này được sử dụng kết hợp với
console.log[myVar] // undefined -- no error raised
var myVar = 2;
5Cũng giống như cho. bản đồ và. phương pháp lọc,. reduce được áp dụng trên một mảng và lấy một hàm làm tham số đầu tiên
Tuy nhiên, lần này, có những thay đổi
- reduce nhận hai tham số
Tham số đầu tiên là một hàm sẽ được gọi ở mỗi bước lặp
Tham số thứ hai là giá trị của biến tích lũy [acc ở đây] ở bước lặp đầu tiên [đọc tiếp để hiểu]
Hàm bạn chuyển làm tham số đầu tiên của. reduce nhận hai tham số. Tham số đầu tiên [acc ở đây] là biến tích lũy, trong khi tham số thứ hai [n] là phần tử hiện tại
Biến bộ tích lũy bằng với giá trị trả về của hàm của bạn ở bước lặp trước đó. Ở bước đầu tiên của quá trình lặp lại, acc bằng với giá trị bạn đã chuyển thành. giảm tham số thứ hai
Ở bước lặp đầu tiênlet person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
15 vì chúng tôi đã chuyển 0 làm tham số thứ hai để giảmlet person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
16 phần tử đầu tiên của mảng sốHàm trả về acc + n –> 0 + 0 –> 0
Tại bước lặp thứ hailet person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
15 vì đó là giá trị mà hàm trả về ở bước lặp trước đólet person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
18 phần tử thứ hai của mảng sốHàm trả về acc + n –> 0 + 1 –> 1
Ở bước lặp thứ balet person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
19 vì đó là giá trị mà hàm trả về ở bước lặp trước đólet person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
20 phần tử thứ ba của mảng sốHàm trả về acc + n –> 1 + 2 –> 3
Ở bước lặp thứ tưlet person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
21 vì đó là giá trị mà hàm trả về ở bước lặp trước đólet person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
22 phần tử thứ tư của mảng sốHàm trả về acc + n –> 3 + 3 –> 6
[…] Ở bước lặp cuối cùnglet person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
23 vì đó là giá trị mà hàm trả về ở bước lặp trước đólet person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
24 phần tử cuối cùng của mảng sốHàm trả về acc + n –> 15 + 6 –> 21
Vì đây là bước lặp cuối cùng nên. giảm lợi nhuận 21
console.log[myVar] // undefined -- no error raised
var myVar = 2;
6Ghi chú. Bạn sẽ thường xuyên gặp phải phương pháp này được sử dụng kết hợp với
Chúng tôi đang sử dụng. tìm trên mảng số,. find đang lặp lại trên từng phần tử của mảng và chuyển nó vào hàm của chúng ta, cho đến khi điều kiện được đáp ứng. Mục tiêu của hàm là trả về phần tử thỏa mãn chức năng kiểm tra hiện tại. Các. phương thức find thực thi hàm gọi lại một lần cho mỗi chỉ mục của mảng cho đến khi hàm gọi lại trả về giá trị trung thực
Ghi chú. Nó ngay lập tức trả về giá trị của phần tử đó [thỏa mãn điều kiện] nếu tìm thấy. Nếu không, trả về không xác định
Tài nguyên bên ngoài
Toán tử trải rộng “…”
Toán tử trải rộng
let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
25 đã được giới thiệu với ES2015 và được sử dụng để mở rộng các phần tử của một lần lặp [như một mảng] vào những nơi mà nhiều phần tử có thể phù hợpmã mẫu
console.log[myVar] // undefined -- no error raised
var myVar = 2;
7console.log[myVar] // undefined -- no error raised
var myVar = 2;
8console.log[myVar] // undefined -- no error raised
var myVar = 2;
9Giải trình
Trong iterables [như mảng]Nếu chúng ta có hai mảng sau
var myVar;
console.log[myVar] // undefined -- no error raised
myVar = 2;
0mảng 2 phần tử đầu tiên là một mảng vì mảng 1 được thêm nguyên trạng vào mảng 2. Nhưng những gì chúng tôi muốn là arr2 là một mảng các chữ cái. Để làm như vậy, chúng ta có thể trải các phần tử của mảng1 sang mảng2
Với toán tử trải rộng
console.log[myVar] // undefined -- no error raised
var myVar = 2;
7Thông số nghỉ chức năngTrong các tham số của hàm, chúng ta có thể sử dụng toán tử còn lại để đưa các tham số vào một mảng mà chúng ta có thể lặp lại. Đã có một đối tượng đối số được liên kết với mọi hàm bằng một mảng gồm tất cả các tham số được truyền vào hàm
var myVar;
console.log[myVar] // undefined -- no error raised
myVar = 2;
2Nhưng giả sử rằng chúng ta muốn hàm này tạo một học sinh mới với điểm của nó và điểm trung bình của nó. Sẽ không thuận tiện hơn nếu trích xuất hai tham số đầu tiên thành hai biến riêng biệt, sau đó có tất cả các điểm trong một mảng mà chúng ta có thể lặp lại?
Đó chính xác là những gì toán tử còn lại cho phép chúng tôi làm
var myVar;
console.log[myVar] // undefined -- no error raised
myVar = 2;
3Trải rộng thuộc tính đối tượngGhi chú. Hàm createStudent không tốt vì chúng tôi không kiểm tra xem điểm. độ dài tồn tại hoặc khác 0. Nhưng cách này dễ đọc hơn nên mình không xử lý trường hợp này
Đối với phần này, tôi khuyên bạn nên đọc các giải thích trước đây về toán tử còn lại trên các tham số hàm và hàm lặp
var myVar;
console.log[myVar] // undefined -- no error raised
myVar = 2;
4nguồn lực bên ngoài
Viết tắt thuộc tính đối tượng
Khi gán biến cho thuộc tính đối tượng, nếu tên biến trùng với tên thuộc tính, bạn có thể thực hiện như sau
var myVar;
console.log[myVar] // undefined -- no error raised
myVar = 2;
5Giải trình
Thông thường [trước ES2015] khi bạn khai báo một đối tượng mới theo nghĩa đen và muốn sử dụng các biến làm giá trị thuộc tính đối tượng, bạn sẽ viết loại mã này
var myVar;
console.log[myVar] // undefined -- no error raised
myVar = 2;
6Như bạn có thể thấy, điều này khá lặp đi lặp lại vì tên thuộc tính của myObj giống với tên biến mà bạn muốn gán cho các thuộc tính đó
Với ES2015, khi tên biến trùng với tên thuộc tính, bạn có thể thực hiện cách viết tắt này
var myVar;
console.log[myVar] // undefined -- no error raised
myVar = 2;
7nguồn lực bên ngoài
lời hứa
Lời hứa là một đối tượng có thể được trả về đồng bộ từ hàm không đồng bộ []
Các lời hứa có thể được sử dụng để tránh địa ngục gọi lại và chúng ngày càng được bắt gặp nhiều hơn trong các dự án JavaScript hiện đại
mã mẫu
var myVar;
console.log[myVar] // undefined -- no error raised
myVar = 2;
8Giải trình
Khi bạn thực hiện một yêu cầu Ajax, phản hồi không đồng bộ vì bạn muốn một tài nguyên cần một thời gian để đến. Nó thậm chí có thể không bao giờ đến nếu tài nguyên bạn yêu cầu không có sẵn vì một số lý do [404]
Để xử lý tình huống đó, ES2015 đã hứa với chúng tôi. Lời hứa có thể có ba trạng thái khác nhau
Giả sử chúng ta muốn sử dụng lời hứa để xử lý yêu cầu Ajax để tìm nạp tài nguyên X
Tạo lời hứaĐầu tiên chúng ta sẽ tạo ra một lời hứa. Chúng ta sẽ sử dụng phương thức get của jQuery để thực hiện yêu cầu Ajax tới X
var myVar;
console.log[myVar] // undefined -- no error raised
myVar = 2;
9Như đã thấy trong ví dụ trên, đối tượng Promise nhận một hàm thực thi nhận hai tham số là giải quyết và từ chối. Các tham số đó là các hàm mà khi được gọi sẽ chuyển trạng thái đang chờ lời hứa sang trạng thái đã hoàn thành và bị từ chối tương ứng
Lời hứa ở trạng thái chờ xử lý sau khi tạo cá thể và chức năng thực thi của nó được thực thi ngay lập tức. Khi một trong các chức năng giải quyết hoặc từ chối được gọi trong chức năng thực thi, lời hứa sẽ gọi các trình xử lý liên quan của nó
Sử dụng trình xử lý lời hứaĐể có được kết quả của lời hứa [hoặc lỗi], chúng ta phải đính kèm với nó các trình xử lý bằng cách thực hiện như sau
function myFunction[] {
let myVar = "Nick";
if [true] {
let myVar = "John";
console.log[myVar]; // "John"
// actually, myVar being block scoped, we just created a new variable myVar.
// this variable is not accessible outside this block and totally independent
// from the first myVar created !
}
console.log[myVar]; // "Nick", see how the instructions in the if block DID NOT affect this value
}
console.log[myVar]; // Throws a ReferenceError, myVar is not accessible outside the function.
0Nếu lời hứa thành công, giải pháp được thực thi và chức năng được truyền dưới dạng tham số
let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
26 được thực thiNếu không thành công, từ chối được thực thi và chức năng được truyền dưới dạng tham số
let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
27 được thực thiGhi chú. Nếu lời hứa đã được thực hiện hoặc bị từ chối khi một trình xử lý tương ứng được đính kèm, thì trình xử lý đó sẽ được gọi, do đó không có điều kiện chạy đua giữa một hoạt động không đồng bộ đang hoàn thành và các trình xử lý của nó được đính kèm.
Tài nguyên bên ngoài
chữ mẫu
Chữ mẫu là một phép nội suy biểu thức cho các chuỗi đơn và nhiều dòng
Nói cách khác, đó là một cú pháp chuỗi mới mà bạn có thể thuận tiện sử dụng bất kỳ biểu thức JavaScript nào [chẳng hạn như các biến]
mã mẫu
function myFunction[] {
let myVar = "Nick";
if [true] {
let myVar = "John";
console.log[myVar]; // "John"
// actually, myVar being block scoped, we just created a new variable myVar.
// this variable is not accessible outside this block and totally independent
// from the first myVar created !
}
console.log[myVar]; // "Nick", see how the instructions in the if block DID NOT affect this value
}
console.log[myVar]; // Throws a ReferenceError, myVar is not accessible outside the function.
1nguồn lực bên ngoài
Chữ mẫu được gắn thẻ
Thẻ mẫu là các chức năng có thể được thêm tiền tố vào một. Khi một hàm được gọi theo cách này, tham số đầu tiên là một mảng các chuỗi xuất hiện giữa các biến được nội suy của mẫu và các tham số tiếp theo là các giá trị được nội suy. Sử dụng toán tử trải rộng
let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
25 để nắm bắt tất cả chúng. Ghi chú. Một thư viện nổi tiếng có tên là styled-components phụ thuộc rất nhiều vào tính năng này
Dưới đây là một ví dụ đồ chơi về cách chúng hoạt động
function myFunction[] {
let myVar = "Nick";
if [true] {
let myVar = "John";
console.log[myVar]; // "John"
// actually, myVar being block scoped, we just created a new variable myVar.
// this variable is not accessible outside this block and totally independent
// from the first myVar created !
}
console.log[myVar]; // "Nick", see how the instructions in the if block DID NOT affect this value
}
console.log[myVar]; // Throws a ReferenceError, myVar is not accessible outside the function.
2Một ví dụ thú vị hơn
function myFunction[] {
let myVar = "Nick";
if [true] {
let myVar = "John";
console.log[myVar]; // "John"
// actually, myVar being block scoped, we just created a new variable myVar.
// this variable is not accessible outside this block and totally independent
// from the first myVar created !
}
console.log[myVar]; // "Nick", see how the instructions in the if block DID NOT affect this value
}
console.log[myVar]; // Throws a ReferenceError, myVar is not accessible outside the function.
3nguồn lực bên ngoài
Nhập khẩu / Xuất khẩu
Các mô-đun ES6 được sử dụng để truy cập các biến hoặc hàm trong một mô-đun được xuất rõ ràng bởi các mô-đun mà nó nhập
Tôi thực sự khuyên bạn nên xem các tài nguyên MDN khi nhập/xuất [xem các tài nguyên bên ngoài bên dưới], nó vừa đơn giản vừa đầy đủ
Giải thích với mã mẫu
xuất khẩu được đặt tênXuất khẩu được đặt tên được sử dụng để xuất một số giá trị từ một mô-đun
Ghi chú. Bạn chỉ có thể đặt tên cho những công dân hạng nhất có tên
function myFunction[] {
let myVar = "Nick";
if [true] {
let myVar = "John";
console.log[myVar]; // "John"
// actually, myVar being block scoped, we just created a new variable myVar.
// this variable is not accessible outside this block and totally independent
// from the first myVar created !
}
console.log[myVar]; // "Nick", see how the instructions in the if block DID NOT affect this value
}
console.log[myVar]; // Throws a ReferenceError, myVar is not accessible outside the function.
4Mặc dù nhập khẩu có tên trông giống như phá hủy, nhưng chúng có cú pháp khác và không giống nhau. Chúng không hỗ trợ các giá trị mặc định cũng như không phá hủy sâu
Ngoài ra, bạn có thể tạo bí danh nhưng cú pháp khác với cú pháp được sử dụng trong việc phá hủy
function myFunction[] {
let myVar = "Nick";
if [true] {
let myVar = "John";
console.log[myVar]; // "John"
// actually, myVar being block scoped, we just created a new variable myVar.
// this variable is not accessible outside this block and totally independent
// from the first myVar created !
}
console.log[myVar]; // "Nick", see how the instructions in the if block DID NOT affect this value
}
console.log[myVar]; // Throws a ReferenceError, myVar is not accessible outside the function.
5Nhập/xuất mặc địnhLiên quan đến xuất mặc định, chỉ có một xuất mặc định duy nhất cho mỗi mô-đun. Xuất mặc định có thể là một hàm, một lớp, một đối tượng hoặc bất kỳ thứ gì khác. Giá trị này được coi là giá trị xuất "chính" vì nó sẽ là giá trị nhập đơn giản nhất.
function myFunction[] {
let myVar = "Nick";
if [true] {
let myVar = "John";
console.log[myVar]; // "John"
// actually, myVar being block scoped, we just created a new variable myVar.
// this variable is not accessible outside this block and totally independent
// from the first myVar created !
}
console.log[myVar]; // "Nick", see how the instructions in the if block DID NOT affect this value
}
console.log[myVar]; // Throws a ReferenceError, myVar is not accessible outside the function.
6xuất hàm
function myFunction[] {
let myVar = "Nick";
if [true] {
let myVar = "John";
console.log[myVar]; // "John"
// actually, myVar being block scoped, we just created a new variable myVar.
// this variable is not accessible outside this block and totally independent
// from the first myVar created !
}
console.log[myVar]; // "Nick", see how the instructions in the if block DID NOT affect this value
}
console.log[myVar]; // Throws a ReferenceError, myVar is not accessible outside the function.
7nguồn lực bên ngoài
JavaScript này
toán tử này hoạt động khác với các ngôn ngữ khác và trong hầu hết các trường hợp được xác định bởi cách một hàm được gọi. [Tham khảo. MĐN]
Khái niệm này có nhiều điểm tinh tế và khá khó, tôi thực sự khuyên bạn nên tìm hiểu sâu về các nguồn bên ngoài bên dưới. Vì vậy, tôi sẽ cung cấp những gì cá nhân tôi nghĩ để xác định cái này bằng. Tôi đã học được mẹo này từ bài viết này được viết bởi Yehuda Katz
function myFunction[] {
let myVar = "Nick";
if [true] {
let myVar = "John";
console.log[myVar]; // "John"
// actually, myVar being block scoped, we just created a new variable myVar.
// this variable is not accessible outside this block and totally independent
// from the first myVar created !
}
console.log[myVar]; // "Nick", see how the instructions in the if block DID NOT affect this value
}
console.log[myVar]; // Throws a ReferenceError, myVar is not accessible outside the function.
8function myFunction[] {
let myVar = "Nick";
if [true] {
let myVar = "John";
console.log[myVar]; // "John"
// actually, myVar being block scoped, we just created a new variable myVar.
// this variable is not accessible outside this block and totally independent
// from the first myVar created !
}
console.log[myVar]; // "Nick", see how the instructions in the if block DID NOT affect this value
}
console.log[myVar]; // Throws a ReferenceError, myVar is not accessible outside the function.
9nguồn lực bên ngoài
Lớp học
JavaScript là ngôn ngữ dựa trên nguyên mẫu [ví dụ như Java là ngôn ngữ dựa trên lớp]. ES6 đã giới thiệu các lớp JavaScript có nghĩa là một đường cú pháp cho kế thừa dựa trên nguyên mẫu và không phải là mô hình kế thừa dựa trên lớp mới [tham khảo]
Lớp từ thực sự dễ bị lỗi nếu bạn đã quen thuộc với các lớp trong các ngôn ngữ khác. Nếu bạn làm như vậy, hãy tránh giả định cách các lớp JavaScript hoạt động trên cơ sở này và coi đó là một khái niệm hoàn toàn khác
Vì tài liệu này không phải là một nỗ lực để dạy bạn ngôn ngữ từ đầu, tôi sẽ cho rằng bạn biết nguyên mẫu là gì và cách chúng hoạt động. Nếu không, hãy xem các tài nguyên bên ngoài được liệt kê bên dưới mã mẫu
Mẫu
Trước ES6, cú pháp nguyên mẫu
console.log[myVar] // raises a ReferenceError !
let myVar = 2;
0Với cú pháp lớp ES6
console.log[myVar] // raises a ReferenceError !
let myVar = 2;
1nguồn lực bên ngoài
Để hiểu nguyên mẫu
Đối với các lớp hiểu
let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
29 và let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
30 từ khóa
let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
Từ khóa
let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
31 được sử dụng trong khai báo lớp hoặc biểu thức lớp để tạo một lớp là con của một lớp khác [Tham khảo. MĐN]. Lớp con kế thừa tất cả các thuộc tính của lớp cha và ngoài ra có thể thêm các thuộc tính mới hoặc sửa đổi các thuộc tính được kế thừaTừ khóa
let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
30 được sử dụng để gọi các hàm trên cha của đối tượng, bao gồm cả hàm tạo của nó- Từ khóa
30 phải được sử dụng trước từ khóalet person = "Nick"; person = "John"; console.log[person] // "John", reassignment is allowed with let
34 được sử dụng trong hàm tạolet person = "Nick"; person = "John"; console.log[person] // "John", reassignment is allowed with let
- Gọi
35 gọi phương thức khởi tạo của lớp cha. Nếu bạn muốn truyền một số đối số trong hàm tạo của một lớp cho hàm tạo của lớp cha, bạn gọi nó bằng _____12_______36let person = "Nick"; person = "John"; console.log[person] // "John", reassignment is allowed with let
- Nếu lớp cha có một phương thức [thậm chí là tĩnh] có tên là
37, bạn có thể sử dụng phương thứclet person = "Nick"; person = "John"; console.log[person] // "John", reassignment is allowed with let
38 để gọi nó trong lớp conlet person = "Nick"; person = "John"; console.log[person] // "John", reassignment is allowed with let
Mã mẫu
console.log[myVar] // raises a ReferenceError !
let myVar = 2;
2Ghi chú. Nếu chúng tôi đã cố gắng sử dụng
let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
34 trước khi gọi let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
35 trong lớp Square, ReferenceError sẽ được đưa raconsole.log[myVar] // raises a ReferenceError !
let myVar = 2;
3Tài nguyên bên ngoài
Đang chờ không đồng bộ
Ngoài ra, có một cú pháp mới mà bạn có thể gặp phải để xử lý mã không đồng bộ có tên là async/await
Mục đích của các chức năng async/await là để đơn giản hóa hành vi sử dụng các lời hứa một cách đồng bộ và thực hiện một số hành vi trên một nhóm Lời hứa. Giống như Lời hứa tương tự như cuộc gọi lại có cấu trúc, async/await tương tự như việc kết hợp trình tạo và lời hứa. Các chức năng không đồng bộ luôn trả về một Lời hứa. [Tham khảo. MĐN]
Ghi chú. Bạn phải hiểu lời hứa là gì và cách chúng hoạt động trước khi cố gắng hiểu async/await vì chúng dựa vào nó
Lưu ý 2. , có nghĩa là bạn không thể sử dụng await ở cấp cao nhất trong mã của chúng tôi vì nó không nằm trong hàm async
mã mẫu
console.log[myVar] // raises a ReferenceError !
let myVar = 2;
4Giải thích với mã mẫu
Async/Await được xây dựng dựa trên các lời hứa nhưng chúng cho phép một kiểu mã bắt buộc hơn
Toán tử async đánh dấu một hàm là không đồng bộ và sẽ luôn trả về một Lời hứa. Bạn có thể sử dụng toán tử chờ trong hàm không đồng bộ để tạm dừng thực thi trên dòng đó cho đến khi Lời hứa được trả về từ biểu thức giải quyết hoặc từ chối
console.log[myVar] // raises a ReferenceError !
let myVar = 2;
5Khi đạt đến câu lệnh trả về của hàm không đồng bộ, Lời hứa được thực hiện với giá trị được trả về. Nếu xảy ra lỗi bên trong chức năng không đồng bộ, trạng thái Promise sẽ chuyển sang bị từ chối. Nếu không có giá trị nào được trả về từ hàm async, thì Promise vẫn được trả về và không có giá trị khi thực thi hàm async hoàn tất
toán tử chờ đợi được sử dụng để chờ Lời hứa được thực hiện và chỉ có thể được sử dụng bên trong thân hàm async. Khi gặp phải, việc thực thi mã bị tạm dừng cho đến khi lời hứa được thực hiện
Ghi chú. tìm nạp là một hàm trả về một Lời hứa cho phép thực hiện một yêu cầu AJAX
Trước tiên, hãy xem cách chúng tôi có thể tìm nạp người dùng github bằng lời hứa
console.log[myVar] // raises a ReferenceError !
let myVar = 2;
6Đây là tương đương async/await
console.log[myVar] // raises a ReferenceError !
let myVar = 2;
7cú pháp async/await đặc biệt thuận tiện khi bạn cần xâu chuỗi các lời hứa phụ thuộc lẫn nhau
Chẳng hạn, nếu bạn cần lấy mã thông báo để có thể tìm nạp một bài đăng blog trên cơ sở dữ liệu và sau đó là thông tin tác giả
Ghi chú. Các biểu thức chờ đợi cần được đặt trong dấu ngoặc đơn để gọi các phương thức và thuộc tính của giá trị được phân giải của nó trên cùng một dòng
console.log[myVar] // raises a ReferenceError !
let myVar = 2;
8xử lý lỗiTrừ khi chúng tôi thêm các khối thử / bắt xung quanh các biểu thức đang chờ, các ngoại lệ chưa được bắt – bất kể chúng được ném vào phần thân của hàm async của bạn hay trong khi nó bị treo trong khi chờ – sẽ từ chối lời hứa được trả về bởi hàm async. Sử dụng câu lệnh
let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
41 trong hàm không đồng bộ cũng giống như trả về một Lời hứa từ chối. Ghi chú. Lời hứa hành xử giống nhau
Với những lời hứa, đây là cách bạn sẽ xử lý chuỗi lỗi
console.log[myVar] // raises a ReferenceError !
let myVar = 2;
9Tương đương với async/await
let myVar = 2;
let myVar = 3; // Raises a SyntaxError
0nguồn lực bên ngoài
Sự thật / Giả dối
Trong JavaScript, giá trị true hoặc false là giá trị được chuyển thành kiểu boolean khi được đánh giá trong ngữ cảnh boolean. Một ví dụ về bối cảnh boolean sẽ là việc đánh giá một điều kiện
let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
42Mọi giá trị sẽ được chuyển thành
let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
43 trừ khi chúng bằng
44let person = "Nick"; person = "John"; console.log[person] // "John", reassignment is allowed with let
45let person = "Nick"; person = "John"; console.log[person] // "John", reassignment is allowed with let
46 [chuỗi trống]let person = "Nick"; person = "John"; console.log[person] // "John", reassignment is allowed with let
47let person = "Nick"; person = "John"; console.log[person] // "John", reassignment is allowed with let
48let person = "Nick"; person = "John"; console.log[person] // "John", reassignment is allowed with let
49let person = "Nick"; person = "John"; console.log[person] // "John", reassignment is allowed with let
Dưới đây là các ví dụ về bối cảnh boolean
let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
50 có thể là bất kỳ công dân hạng nhất nào [biến, hàm, boolean] nhưng nó sẽ được chuyển thành boolean vì nó được đánh giá trong ngữ cảnh boolean- Sau toán tử logic NOT
51let person = "Nick"; person = "John"; console.log[person] // "John", reassignment is allowed with let
Toán tử này trả về false nếu toán hạng đơn của nó có thể được chuyển đổi thành true;
let myVar = 2;
let myVar = 3; // Raises a SyntaxError
1- Với hàm tạo đối tượng Boolean
let myVar = 2;
let myVar = 3; // Raises a SyntaxError
2myVar được đánh giá trong ngữ cảnh boolean
Hãy cẩn thận khi so sánh 2 giá trị. Các giá trị đối tượng [nên được chuyển thành true] không được chuyển thành Boolean nhưng nó buộc phải chuyển đổi thành một giá trị nguyên thủy bằng cách sử dụng đặc tả ToPrimitives. Bên trong, khi một đối tượng được so sánh với giá trị Boolean như
let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
52, thì nó sẽ là let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
53 nên…let myVar = 2;
let myVar = 3; // Raises a SyntaxError
3nguồn lực bên ngoài
Anamorphisms và Catamorphisms
biến hình
Biến hình là các hàm ánh xạ từ một đối tượng nào đó sang một cấu trúc phức tạp hơn có chứa loại đối tượng. Đó là quá trình mở ra một cấu trúc đơn giản thành một cấu trúc phức tạp hơn. Xem xét mở một số nguyên thành một danh sách các số nguyên. Số nguyên là đối tượng ban đầu của chúng tôi và danh sách các số nguyên là cấu trúc phức tạp hơn
mã mẫu
let myVar = 2;
let myVar = 3; // Raises a SyntaxError
4Catamorphism trái ngược với Anamorphisms, ở chỗ chúng lấy các đối tượng có cấu trúc phức tạp hơn và gấp chúng thành các cấu trúc đơn giản hơn. Lấy ví dụ sau
let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
54 lấy danh sách các số nguyên và trả về một số nguyênmã mẫu
let myVar = 2;
let myVar = 3; // Raises a SyntaxError
5nguồn lực bên ngoài
máy phát điện
Một cách khác để viết hàm
let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
55 là sử dụng Trình tạo. Để khởi tạo một đối tượng let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
56, ta phải sử dụng khai báo let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
57. Trình tạo là các chức năng có thể được thoát và sau đó được nhập lại với ngữ cảnh của nó [các ràng buộc biến] được lưu trong các lần truy cập lạiVí dụ: hàm
let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
55 ở trên có thể được viết lại thànhlet myVar = 2;
let myVar = 3; // Raises a SyntaxError
6Trình tạo trả về một đối tượng có thể lặp lại. Khi hàm
let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
59 của trình vòng lặp được gọi, nó được thực thi cho đến khi biểu thức let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
60 đầu tiên chỉ định giá trị được trả về từ trình vòng lặp hoặc với let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
61, biểu thức này ủy quyền cho một hàm tạo khác. Khi một biểu thức let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
62 được gọi trong trình tạo, nó sẽ đánh dấu trình tạo là xong và trả lại dưới dạng giá trị trả về. Các cuộc gọi tiếp theo tới let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
59 sẽ không trả về bất kỳ giá trị mới nàomã mẫu
let myVar = 2;
let myVar = 3; // Raises a SyntaxError
7Biểu thức
let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
61 cho phép trình tạo gọi một hàm tạo khác trong quá trình lặplet myVar = 2;
let myVar = 3; // Raises a SyntaxError
8let myVar = 2;
let myVar = 3; // Raises a SyntaxError
9nguồn lực bên ngoài
Phương thức tĩnh
giải thích ngắn
Từ khóa
let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
65 được sử dụng trong các lớp để khai báo các phương thức tĩnh. Các phương thức tĩnh là các hàm trong một lớp thuộc về đối tượng lớp và không có sẵn cho bất kỳ phiên bản nào của lớp đómã mẫu
const myVar = "Nick";
myVar = "John" // raises an error, reassignment is not allowed
0Lời giải chi tiết
Các phương thức tĩnh có thể được gọi bên trong một phương thức tĩnh khác bằng cách sử dụng từ khóa
let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
34, mặc dù điều này không hoạt động đối với các phương thức không tĩnh. Các phương thức không tĩnh không thể truy cập trực tiếp các phương thức tĩnh bằng từ khóa let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
34Gọi các phương thức tĩnh khác từ một phương thức tĩnhĐể gọi một phương thức tĩnh từ một phương thức tĩnh khác, từ khóa
let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
34 có thể được sử dụng như vậy;const myVar = "Nick";
myVar = "John" // raises an error, reassignment is not allowed
1Gọi các phương thức tĩnh từ các phương thức không tĩnhCác phương thức không tĩnh có thể gọi các phương thức tĩnh theo 2 cách;
Để có quyền truy cập vào một phương thức tĩnh từ một phương thức không tĩnh, chúng tôi sử dụng tên lớp và gọi phương thức tĩnh như một thuộc tính. e. g
let person = "Nick";
person = "John";
console.log[person] // "John", reassignment is allowed with let
69const myVar = "Nick";
myVar = "John" // raises an error, reassignment is not allowed
2Các phương thức tĩnh có thể được gọi là thuộc tính trên đối tượng hàm tạo
const myVar = "Nick";
myVar = "John" // raises an error, reassignment is not allowed
3nguồn lực bên ngoài
Bảng chú giải
Phạm vi
Bối cảnh trong đó các giá trị và biểu thức "hiển thị" hoặc có thể được tham chiếu. Nếu một biến hoặc biểu thức khác không nằm trong phạm vi hiện tại, thì nó không có sẵn để sử dụng