Toán tử bổ sung [+
] bị quá tải cho hai hoạt động riêng biệt. cộng số và nối chuỗi. Khi đánh giá, trước tiên nó buộc cả hai toán hạng thành nguyên hàm. Sau đó, các loại của hai toán hạng được kiểm tra
- Nếu một vế là chuỗi thì toán hạng còn lại cũng được chuyển thành chuỗi và chúng được nối với nhau
- Nếu cả hai đều là BigInt, phép cộng BigInt được thực hiện. Nếu một bên là BigInt nhưng bên kia thì không, thì một
TypeError
sẽ bị ném - Mặt khác, cả hai bên được chuyển thành số và phép cộng số được thực hiện
Nối chuỗi thường được cho là tương đương với chữ mẫu hoặc String.prototype.concat[]
, nhưng chúng không phải như vậy. Phép cộng ép buộc biểu thức thành một nguyên hàm, gọi ưu tiên valueOf[]
; . Nếu biểu thức có phương thức
const t = Temporal.Now.instant[];
"" + t; // Throws TypeError
`${t}`; // '2022-07-31T04:48:56.113918308Z'
"".concat[t]; // '2022-07-31T04:48:56.113918308Z'
1, phép nối chuỗi sẽ gọi nó với _____02 làm gợi ý, trong khi chữ mẫu sử dụng _____03. Điều này rất quan trọng đối với các đối tượng có các biểu diễn chuỗi và nguyên thủy khác nhau — chẳng hạn như Temporal, phương thức valueOf[]
của nó ném Toán tử Mô tảVí dụGiống nhưKết quảSố thập phân&AND5 & 10101 & 00010001 1. OR5. 10101. 00010101 5~NOT~ 5 ~01011010 10^XOR5 ^ 10101 ^ 00010100 4 10010 2 >>> shift phải trái dấu5 >>> 10101 >>> 10010 2
Không giống như nhiều ngôn ngữ lập trình khác, JavaScript không xác định các loại số khác nhau, như số nguyên, ngắn, dài, dấu phẩy động, v.v.
Số JavaScript luôn được lưu trữ dưới dạng số dấu phẩy động có độ chính xác kép, tuân theo tiêu chuẩn quốc tế IEEE 754
Định dạng này lưu trữ các số trong 64 bit, trong đó số [phân số] được lưu trữ trong các bit từ 0 đến 51, số mũ trong các bit từ 52 đến 62 và dấu ở bit 63
Giá trị [còn gọi là Phân số/Phần định trị]Số mũDấu52 bit [0 - 51] 11 bit [52 - 62]1 bit [63]Độ chính xác số nguyên
Số nguyên [số không có dấu chấm hoặc ký hiệu số mũ] chính xác đến 15 chữ số
Ví dụ
hãy x = 999999999999999;
let y = 9999999999999999; // y will be 10000000000000000
Số thập phân lớn nhất là 17
độ chính xác nổi
Để giải bài toán trên giúp nhân chia
đặt x = [0. 2 * 10 + 0. 1*10]/10;
Tự mình thử »Thêm số và chuỗi
CẢNH BÁO
JavaScript sử dụng toán tử + cho cả phép cộng và phép nối
Số được thêm vào. Chuỗi được nối
Nếu bạn cộng hai số, kết quả sẽ là một số
Nếu bạn thêm hai chuỗi, kết quả sẽ là nối chuỗi
Nếu bạn thêm một số và một chuỗi, kết quả sẽ là nối chuỗi
Nếu bạn thêm một chuỗi và một số, kết quả sẽ là nối chuỗi
Một sai lầm phổ biến là mong đợi kết quả này là 30
Một sai lầm phổ biến là mong đợi kết quả này là 102030
Trình thông dịch JavaScript hoạt động từ trái sang phải
10 + 20 đầu tiên được thêm vào vì x và y đều là số
Khi đó 30 + "30" được nối với nhau vì z là một chuỗi
Chuỗi số
Chuỗi JavaScript có thể có nội dung số
cho x = 100;
cho y = "100";
JavaScript sẽ cố gắng chuyển đổi chuỗi thành số trong tất cả các hoạt động số
Điều này sẽ làm việc
Điều này cũng sẽ làm việc
Và điều này sẽ làm việc
Nhưng điều này sẽ không làm việc
Trong ví dụ trước, JavaScript sử dụng toán tử + để nối các chuỗi
NaN - Không phải là số
const t = Temporal.Now.instant[];
"" + t; // Throws TypeError
`${t}`; // '2022-07-31T04:48:56.113918308Z'
"".concat[t]; // '2022-07-31T04:48:56.113918308Z'
0 là một từ dành riêng cho JavaScript cho biết một số không phải là số hợp phápCố gắng làm phép tính với một chuỗi không phải là số sẽ dẫn đến kết quả là
const t = Temporal.Now.instant[];
"" + t; // Throws TypeError
`${t}`; // '2022-07-31T04:48:56.113918308Z'
"".concat[t]; // '2022-07-31T04:48:56.113918308Z'
0 [Không phải là số]Tuy nhiên, nếu chuỗi chứa giá trị số, kết quả sẽ là một số
Bạn có thể sử dụng hàm JavaScript toàn cục
const t = Temporal.Now.instant[];
"" + t; // Throws TypeError
`${t}`; // '2022-07-31T04:48:56.113918308Z'
"".concat[t]; // '2022-07-31T04:48:56.113918308Z'
2 để tìm hiểu xem giá trị có phải là số khôngCoi chừng
const t = Temporal.Now.instant[];
"" + t; // Throws TypeError
`${t}`; // '2022-07-31T04:48:56.113918308Z'
"".concat[t]; // '2022-07-31T04:48:56.113918308Z'
0. Nếu bạn sử dụng const t = Temporal.Now.instant[];
"" + t; // Throws TypeError
`${t}`; // '2022-07-31T04:48:56.113918308Z'
"".concat[t]; // '2022-07-31T04:48:56.113918308Z'
0 trong một phép toán, kết quả cũng sẽ là const t = Temporal.Now.instant[];
"" + t; // Throws TypeError
`${t}`; // '2022-07-31T04:48:56.113918308Z'
"".concat[t]; // '2022-07-31T04:48:56.113918308Z'
0Hoặc kết quả có thể là một phép nối như NaN5
const t = Temporal.Now.instant[];
"" + t; // Throws TypeError
`${t}`; // '2022-07-31T04:48:56.113918308Z'
"".concat[t]; // '2022-07-31T04:48:56.113918308Z'
0 là một số. const t = Temporal.Now.instant[];
"" + t; // Throws TypeError
`${t}`; // '2022-07-31T04:48:56.113918308Z'
"".concat[t]; // '2022-07-31T04:48:56.113918308Z'
7 trả lại const t = Temporal.Now.instant[];
"" + t; // Throws TypeError
`${t}`; // '2022-07-31T04:48:56.113918308Z'
"".concat[t]; // '2022-07-31T04:48:56.113918308Z'
8vô cực
const t = Temporal.Now.instant[];
"" + t; // Throws TypeError
`${t}`; // '2022-07-31T04:48:56.113918308Z'
"".concat[t]; // '2022-07-31T04:48:56.113918308Z'
9 [hoặc const t = Temporal.Now.instant[];
"" + t; // Throws TypeError
`${t}`; // '2022-07-31T04:48:56.113918308Z'
"".concat[t]; // '2022-07-31T04:48:56.113918308Z'
00] là giá trị mà JavaScript sẽ trả về nếu bạn tính toán một số nằm ngoài số lớn nhất có thể