Đã tạo: tháng 3-17, 2022 Toán tử Elvis là phiên bản ngắn hơn của toán tử ternary. Nhà điều hành này được gọi là toán tử hợp tác
6 trong JavaScript và nó được biểu thị bằng biểu tượng let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
7.let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
Nó chỉ trả về một giá trị mặc định khi giá trị biểu thức là
let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
8 hoặc let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
9.Thực hiện let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
6 Nhà điều hành hợp tác let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
7 trong JavaScript
let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
Nhà điều hành hợp tác
let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
6 let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
7 đã được giới thiệu trong phiên bản ECMAScript 2020 của ngôn ngữ lập trình JavaScript.Syntax:
leftExpr ?? rightExpr
Toán tử
let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
7 sẽ chỉ trả về let val_1 = undefined || 'Hello!';
let val_2 = false || 'Hello!';
let val_3 = "" || 'Hello!';
console.log[val_1, val_2, val_3];
5 [biểu thức có mặt ở bên phải của toán tử let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
7] chỉ khi let val_1 = undefined || 'Hello!';
let val_2 = false || 'Hello!';
let val_3 = "" || 'Hello!';
console.log[val_1, val_2, val_3];
7 [biểu thức có mặt ở bên trái của toán tử let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
7] là let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
8 hoặc let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
9.Code:
let myObj = {
name: {
firstname: "Adam",
lastname: "Smith"
}
};
let val = myObj.name ?? "Default Value";
console.log[val];
Ở đây, chúng tôi đã tạo một đối tượng gọi là
Hello! Hello! Hello!
1 có chứa một thuộc tính gọi là Hello! Hello! Hello!
2 chứa toàn bộ đối tượng làm giá trị. Sau đó, chúng tôi đang sử dụng toán tử let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
7.Ở bên trái của toán tử
let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
7, chúng ta có biểu thức Hello! Hello! Hello!
5, trong khi bên phải, chúng ta có biểu thức Hello! Hello! Hello!
6. Biểu thức đúng, tức là, giá trị mặc định, sẽ chỉ được gán cho biến Hello! Hello! Hello!
7 nếu Hello! Hello! Hello!
5 là let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
8 hoặc let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
9.Biểu thức
Hello! Hello! Hello!
5 chứa một số giá trị và nó không phải là let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
8 hoặc let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
9. Do đó, giá trị Hello! Hello! Hello!
5 sẽ được lưu trữ bên trong biến Hello! Hello! Hello!
7 và sau khi bạn in biến Hello! Hello! Hello!
7, đầu ra bạn nhận được như sau.Output:
Toán tử kết hợp
let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
6 let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
7 có thể được sử dụng bên trong một câu lệnh & nbsp; với bất kỳ biểu thức số nào như trong ví dụ dưới đây.Code:
let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
Trong ví dụ này, nếu cả
let val_1 = undefined ?? 'Hello!';
let val_2 = false ?? 'Hello!';
let val_3 = "" ?? 'Hello!';
console.log[val_1, val_2, val_3];
9 và Hello! false
0 đều là let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
8 hoặc let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
9, thì chỉ có toán tử let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
7 sẽ trả về chuỗi hoặc nó sẽ trả về giá trị của bất kỳ một biểu thức đầu tiên nào không phải là let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
8 hoặc let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
9.Vì vậy, ở đây, chỉ có biểu thức
Hello! false
0 là let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
9 chứ không phải Hello! Hello! Hello!
5, do đó, giá trị của biểu thức Hello! Hello! Hello!
5 sẽ được trả về và lưu trữ bên trong biến Hello! Hello! Hello!
7.Biến
Hello! Hello! Hello!
7 hiện sẽ chứa đối tượng mà thuộc tính Hello! Hello! Hello!
2 đang lưu trữ và đối tượng này sẽ được in trên bảng điều khiển.Output:
Nhà điều hành
let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
7 không được hỗ trợ trên các trình duyệt IE và Opera. Để biết thêm chi tiết liên quan đến khả năng tương thích của trình duyệt, bạn có thể đọc tài liệu MDN.Trước khi toán tử
let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
7 được giới thiệu bên trong ngôn ngữ lập trình JavaScript, một cách tiếp cận phổ biến là sử dụng toán tử logic obj.val?.prop
obj.val?.[expr]
obj.func?.[args]
5 obj.val?.prop
obj.val?.[expr]
obj.func?.[args]
6 để gán giá trị mặc định của biến. Nhưng cách tiếp cận này của việc gán một giá trị mặc định tạo ra các vấn đề khác nhau.Code:
let val_1 = undefined || 'Hello!';
let val_2 = false || 'Hello!';
let val_3 = "" || 'Hello!';
console.log[val_1, val_2, val_3];
Output:
Hello! Hello! Hello!
obj.val?.prop
obj.val?.[expr]
obj.func?.[args]
7 là toán tử logic Boolean, toán tử này có thể gây ra hành vi bất ngờ nếu bạn coi obj.val?.prop
obj.val?.[expr]
obj.func?.[args]
8, obj.val?.prop
obj.val?.[expr]
obj.func?.[args]
9 hoặc const nestedProp = obj.first && obj.first.second;
0 là các giá trị hợp lệ như được hiển thị ở trên.Thay đổi ví dụ tương tự bằng cách thay thế toán tử
obj.val?.prop
obj.val?.[expr]
obj.func?.[args]
5 bằng toán tử liên kết let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
6 let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
7 sẽ mang lại kết quả khác nhau.Code:
let val_1 = undefined ?? 'Hello!';
let val_2 = false ?? 'Hello!';
let val_3 = "" ?? 'Hello!';
console.log[val_1, val_2, val_3];
Output:
Hello! false
Như bạn có thể thấy, toán tử này tạo ra đầu ra thích hợp. Đây là lý do tại sao nhà điều hành liên kết
let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
6 let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
7 đã được giới thiệu trong JavaScript.Bài viết liên quan - Nhà điều hành JavaScript
Một trong những yêu cầu tính năng đầu tiên của TypeScript là toán tử Elvis. Chính xác hơn, toán tử điều hướng an toàn null. Đó là một biến thể của toán tử "DOT" cho phép bạn truy cập các thuộc tính và phương thức ngay cả khi đối tượng trước dấu chấm là null hoặc không xác định.optional chaining operator [
6] accesses an object's property or calls a function. If the object is const nestedProp = obj.first && obj.first.second;
9 or let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
8, it returns
let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
9 instead of throwing an error.let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
Toán tử chuỗi tùy chọn [const nestedProp = obj.first && obj.first.second;
6] truy cập vào thuộc tính của một đối tượng hoặc gọi hàm. Nếu đối tượng là let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
9 hoặc let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
8, nó sẽ trả về let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
9 thay vì ném lỗi.
const nestedProp = obj.first && obj.first.second;
let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
Thử nó
obj.val?.prop
obj.val?.[expr]
obj.func?.[args]
Cú pháp
Sự mô tả
Điều này dẫn đến các biểu thức ngắn hơn và đơn giản hơn khi truy cập các thuộc tính chuỗi khi khả năng tồn tại là một tham chiếu có thể bị thiếu. Nó cũng có thể hữu ích trong khi khám phá nội dung của một đối tượng khi không có sự đảm bảo nào về việc yêu cầu thuộc tính nào.
Ví dụ, hãy xem xét một đối tượng
const nestedProp = obj.first?.second;
6 có cấu trúc lồng nhau. Không có chuỗi tùy chọn, tìm kiếm một Subproperty được lồng sâu đòi hỏi phải xác nhận các tài liệu tham khảo ở giữa, chẳng hạn như:const nestedProp = obj.first && obj.first.second;
Giá trị của
const nestedProp = obj.first?.second;
7 được xác nhận là không phải là -____ 28 [và không phải -____ 29] trước khi truy cập giá trị của let myObj = {
name: {
firstname: "Adam",
lastname: "Smith"
}
};
let val = myObj.name ?? "Default Value";
console.log[val];
00. Điều này ngăn ngừa lỗi sẽ xảy ra nếu bạn truy cập trực tiếp let myObj = {
name: {
firstname: "Adam",
lastname: "Smith"
}
};
let val = myObj.name ?? "Default Value";
console.log[val];
00 mà không cần kiểm tra const nestedProp = obj.first?.second;
7.Đây là một mô hình thành ngữ trong JavaScript, nhưng nó được dài dòng khi chuỗi dài và nó không an toàn. Ví dụ: nếu
const nestedProp = obj.first?.second;
7 là một giá trị giả mà không phải là let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
8 hoặc let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
9, chẳng hạn như obj.val?.prop
obj.val?.[expr]
obj.func?.[args]
8, nó vẫn sẽ ngắn mạch và làm cho let myObj = {
name: {
firstname: "Adam",
lastname: "Smith"
}
};
let val = myObj.name ?? "Default Value";
console.log[val];
07 trở thành obj.val?.prop
obj.val?.[expr]
obj.func?.[args]
8, có thể không mong muốn.Tuy nhiên, với toán tử chuỗi tùy chọn [
const nestedProp = obj.first && obj.first.second;
6], bạn không phải kiểm tra rõ ràng và ngắn mạch dựa trên trạng thái của const nestedProp = obj.first?.second;
7 trước khi cố gắng truy cập let myObj = {
name: {
firstname: "Adam",
lastname: "Smith"
}
};
let val = myObj.name ?? "Default Value";
console.log[val];
00:const nestedProp = obj.first?.second;
Bằng cách sử dụng toán tử
const nestedProp = obj.first && obj.first.second;
6 thay vì chỉ const nestedProp = obj.first?.second;
1, JavaScript biết kiểm tra ngầm để chắc chắn const nestedProp = obj.first?.second;
7 không phải là let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
8 hoặc let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
9 trước khi cố gắng truy cập let myObj = {
name: {
firstname: "Adam",
lastname: "Smith"
}
};
let val = myObj.name ?? "Default Value";
console.log[val];
00. Nếu const nestedProp = obj.first?.second;
7 là let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
8 hoặc let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
9, biểu thức sẽ tự động ngắn mạch, trả về let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
9.Điều này tương đương với các điều sau đây, ngoại trừ biến tạm thời trên thực tế không được tạo ra:
let myObj = {
name: {
firstname: "Adam",
lastname: "Smith"
}
};
let val = myObj.name ?? "Default Value";
console.log[val];
0Chuỗi tùy chọn không thể được sử dụng trên một đối tượng gốc không được khai báo, nhưng có thể được sử dụng với một đối tượng gốc có giá trị
let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
9.let myObj = {
name: {
firstname: "Adam",
lastname: "Smith"
}
};
let val = myObj.name ?? "Default Value";
console.log[val];
1Chuỗi tùy chọn với các cuộc gọi chức năng
Bạn có thể sử dụng chuỗi tùy chọn khi cố gắng gọi một phương thức có thể không tồn tại. Điều này có thể hữu ích, ví dụ, khi sử dụng API trong đó phương thức có thể không khả dụng, do tuổi thực hiện hoặc do tính năng không có sẵn trên thiết bị của người dùng.
Sử dụng chuỗi tùy chọn với các cuộc gọi chức năng khiến biểu thức tự động trả về
let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
9 thay vì ném ngoại lệ nếu phương thức không tìm thấy:let myObj = {
name: {
firstname: "Adam",
lastname: "Smith"
}
};
let val = myObj.name ?? "Default Value";
console.log[val];
2Tuy nhiên, nếu có một thuộc tính có tên như vậy không phải là một hàm, sử dụng
const nestedProp = obj.first && obj.first.second;
6 vẫn sẽ tăng ngoại lệ let myObj = {
name: {
firstname: "Adam",
lastname: "Smith"
}
};
let val = myObj.name ?? "Default Value";
console.log[val];
25 "SomeInterface.Custommethod không phải là một hàm". Lưu ý: Nếu bản thân
26 là let myObj = {
name: {
firstname: "Adam",
lastname: "Smith"
}
};
let val = myObj.name ?? "Default Value";
console.log[val];
8 hoặc let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
9, ngoại lệ let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
25 vẫn sẽ được nâng lên ["một số thông minh là null"]. Nếu bạn mong đợi rằng let myObj = {
name: {
firstname: "Adam",
lastname: "Smith"
}
};
let val = myObj.name ?? "Default Value";
console.log[val];
26 có thể là let myObj = {
name: {
firstname: "Adam",
lastname: "Smith"
}
};
let val = myObj.name ?? "Default Value";
console.log[val];
8 hoặc let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
9, bạn cũng phải sử dụng let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
6 tại vị trí này: const nestedProp = obj.first && obj.first.second;
34. If let myObj = {
name: {
firstname: "Adam",
lastname: "Smith"
}
};
let val = myObj.name ?? "Default Value";
console.log[val];
let myObj = {
name: {
firstname: "Adam",
lastname: "Smith"
}
};
let val = myObj.name ?? "Default Value";
console.log[val];
26 itself is let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
8 or let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
9, a let myObj = {
name: {
firstname: "Adam",
lastname: "Smith"
}
};
let val = myObj.name ?? "Default Value";
console.log[val];
25 exception will still be raised ["someInterface is null"]. If you expect that let myObj = {
name: {
firstname: "Adam",
lastname: "Smith"
}
};
let val = myObj.name ?? "Default Value";
console.log[val];
26 itself may be
let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
8 or let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
9, you have to use const nestedProp = obj.first && obj.first.second;
6 at this position as well: let myObj = {
name: {
firstname: "Adam",
lastname: "Smith"
}
};
let val = myObj.name ?? "Default Value";
console.log[val];
34. let myObj = {
name: {
firstname: "Adam",
lastname: "Smith"
}
};
let val = myObj.name ?? "Default Value";
console.log[val];
35 là cách ngắn nhất để vào chế độ Eval gián tiếp. Để biết thêm thông tin, xem trang tham chiếu let myObj = {
name: {
firstname: "Adam",
lastname: "Smith"
}
};
let val = myObj.name ?? "Default Value";
console.log[val];
36.Chuỗi tùy chọn với biểu thức
Bạn cũng có thể sử dụng toán tử chuỗi tùy chọn với ký hiệu khung, cho phép chuyển biểu thức làm tên thuộc tính:
let myObj = {
name: {
firstname: "Adam",
lastname: "Smith"
}
};
let val = myObj.name ?? "Default Value";
console.log[val];
3Điều này đặc biệt hữu ích cho các mảng, vì các chỉ số mảng phải được truy cập bằng dấu ngoặc.
let myObj = {
name: {
firstname: "Adam",
lastname: "Smith"
}
};
let val = myObj.name ?? "Default Value";
console.log[val];
4Chuỗi tùy chọn không hợp lệ ở phía bên trái của một nhiệm vụ
Không hợp lệ khi cố gắng gán cho kết quả của một biểu thức chuỗi tùy chọn:
let myObj = {
name: {
firstname: "Adam",
lastname: "Smith"
}
};
let val = myObj.name ?? "Default Value";
console.log[val];
5Short-circuiting
Khi sử dụng chuỗi tùy chọn với các biểu thức, nếu toán hạng bên trái là
let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
8 hoặc let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
9, biểu thức sẽ không được đánh giá. Ví dụ:let myObj = {
name: {
firstname: "Adam",
lastname: "Smith"
}
};
let val = myObj.name ?? "Default Value";
console.log[val];
6Truy cập tài sản tiếp theo cũng sẽ không được đánh giá.
let myObj = {
name: {
firstname: "Adam",
lastname: "Smith"
}
};
let val = myObj.name ?? "Default Value";
console.log[val];
7Điều này tương đương với:
let myObj = {
name: {
firstname: "Adam",
lastname: "Smith"
}
};
let val = myObj.name ?? "Default Value";
console.log[val];
8Tuy nhiên, hành vi ngắn mạch này chỉ xảy ra dọc theo một "chuỗi" truy cập tài sản liên tục. Nếu bạn nhóm một phần của chuỗi, thì quyền truy cập thuộc tính tiếp theo vẫn sẽ được đánh giá.
let myObj = {
name: {
firstname: "Adam",
lastname: "Smith"
}
};
let val = myObj.name ?? "Default Value";
console.log[val];
9Điều này tương đương với:
let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
0Tuy nhiên, hành vi ngắn mạch này chỉ xảy ra dọc theo một "chuỗi" truy cập tài sản liên tục. Nếu bạn nhóm một phần của chuỗi, thì quyền truy cập thuộc tính tiếp theo vẫn sẽ được đánh giá.
Ngoại trừ biến let myObj = {
name: {
firstname: "Adam",
lastname: "Smith"
}
};
let val = myObj.name ?? "Default Value";
console.log[val];
39 không được tạo.
let myObj = {
name: {
firstname: "Adam",
lastname: "Smith"
}
};
let val = myObj.name ?? "Default Value";
console.log[val];
Ví dụ
Ví dụ cơ bản
let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
1 Ví dụ này tìm kiếm giá trị của thuộc tính Hello! Hello! Hello!
2 cho thành viên let myObj = {
name: {
firstname: "Adam",
lastname: "Smith"
}
};
let val = myObj.name ?? "Default Value";
console.log[val];
41 trong bản đồ khi không có thành viên như vậy. Do đó, kết quả là let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
9.
Hello! Hello! Hello!
let myObj = {
name: {
firstname: "Adam",
lastname: "Smith"
}
};
let val = myObj.name ?? "Default Value";
console.log[val];
let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
Xử lý các cuộc gọi lại tùy chọn hoặc trình xử lý sự kiện
let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
2let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
3 Nếu bạn sử dụng các cuộc gọi lại hoặc tìm nạp các phương thức từ một đối tượng có gán phá hủy, bạn có thể có các giá trị không tồn tại mà bạn không thể gọi là chức năng trừ khi bạn đã kiểm tra sự tồn tại của chúng. Sử dụng const nestedProp = obj.first && obj.first.second;
6, bạn có thể tránh được bài kiểm tra bổ sung này:
const nestedProp = obj.first && obj.first.second;
Xếp chồng toán tử chuỗi tùy chọn
let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
4Với các cấu trúc lồng nhau, có thể sử dụng chuỗi tùy chọn nhiều lần:
Kết hợp với nhà điều hành liên kết không
let val = myObj.name ?? myObj.email ?? "something null or undefined";
console.log[val]
5Thông số kỹ thuật
Đặc tả ngôn ngữ Ecmascript # prod-optionalexpression # prod-OptionalExpression |
Tính tương thích của trình duyệt web
Bảng BCD chỉ tải trong trình duyệt