Giống như tất cả mọi thứ, JavaScript có giới hạn. Điều thú vị là có những giới hạn nhân tạo và sau đó là những giới hạn vật lý. Tôi sẽ khám phá những giới hạn này và cố gắng đẩy chúng đến giới hạn thực sự của chúng càng nhiều càng tốt
Trong JavaScript, một Số được xác định bởi w3schools. com như
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
Điều này có ý nghĩa gì trong thực tế? . 7976931348623157e+308 hoặc sử dụng Số. GIÁ TRỊ TỐI ĐA;
Mọi thứ bắt đầu trở nên kỳ lạ khi chúng ta cố gắng vượt qua điểm này. Tôi đã thử chạy đoạn mã dưới đây với mong đợi “Infinity”. Điều đó đã không xảy ra
console.log[Number.MAX_VALUE+1];1.7976931348623157e+308
Điều này không phù hợp với tài liệu nêu rõ “Các số lớn hơn MAX_VALUE được biểu thị bằng vô cùng. ”
lưu ý bên lề. Các thử nghiệm bên dưới được thực hiện bằng bảng điều khiển Google Chrome, vì vậy các trình thông dịch JS khác có thể mang lại kết quả khác
Sau đó tôi đã tìm thấy một số tối đa không phải là Vô cực
console.log[Number.MAX_VALUE+999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999];1.7976931348623157e+308
Nếu chúng ta thêm một "1" bổ sung như dưới đây
console.log[Number.MAX_VALUE+9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999991];Infinity
Bây giờ chúng ta có được Infinity. Vậy chuyện gì đã xảy ra?
Bây giờ chúng ta hãy nói về Số. MAX_SAFE_INTEGER, được định nghĩa là
Hằng số
Number.MAX_SAFE_INTEGER
đại diện cho số nguyên an toàn tối đa trong JavaScript [2⁵³-1]
Một lời giải thích thực tế là bất cứ điều gì vượt quá giới hạn này, trình thông dịch JavaScript sẽ không còn chịu trách nhiệm cho các hoạt động
Hãy nhìn vào đoạn mã dưới đây
console.log[Number.MAX_SAFE_INTEGER];
9007199254740991console.log[Number.MAX_SAFE_INTEGER+1];
9007199254740992let a = Number.MAX_SAFE_INTEGER+1;
let b = Number.MAX_SAFE_INTEGER+2;
console.log[a === b];
true
Từ các kết quả ở trên, chúng tôi thấy rằng chúng tôi chắc chắn có thể vượt lên trên “MAX_SAFE_INTEGER”, nhưng bất cứ điều gì chúng tôi muốn làm từ quan điểm thực tế đều không còn hiệu quả. Cả “a” và “b” đều được coi là bằng nhau, khi chúng ta biết chúng không
Nếu chúng ta muốn vượt quá MAX_SAFE_INTEGER thì sao?
JavaScript có một chức năng riêng được gọi là BigInt. Như tên của nó mô tả, nó xử lý các số lớn. Nó cũng cực kỳ đơn giản để kích hoạt. Thêm một chữ “n” vào cuối số và nó được chuyển đổi ngay lập tức
const theBiggestInt = 9007199254740991n;
typeof theBiggestInt;
"bigint"
Vậy tại sao không chỉ sử dụng “BigInt” mọi lúc? . Cuộc đuổi bắt?
Điều này có nghĩa là nếu bạn chuyển đổi từ Số sang BigInt và ngược lại, bạn có thể mất độ chính xác. Ngoài ra còn có một khả năng tương thích mà chỉ các trình duyệt hiện đại mới hỗ trợ nó. Đây thực sự không phải là một vấn đề vì rất có thể nó chỉ cần thiết trong NodeJS, được hỗ trợ
Bây giờ, chúng tôi sẽ thử MAX_VALUE mà chúng tôi đã gặp sự cố trước đó và bọc kết quả bên trong BigInt
console.log[BigInt[Number.MAX_VALUE]];
179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368nconsole.log[BigInt[Number.MAX_VALUE+1]];
179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368n
Ví dụ trên cho thấy những gì đang xảy ra. Khi chúng ta thêm nhiều hơn vào Số. MAX_VALUE, đơn giản là nó bị bỏ qua. Cả hai phương trình dẫn đến cùng một câu trả lời. Tại sao?
Những gì chúng ta có thể làm bây giờ là sử dụng BigInt để vượt qua Số. GIÁ TRỊ TỐI ĐA. Lần này, chúng tôi sẽ sử dụng số gia so với giá trị BigInt của MAX_VALUE thay vì kết quả của MAX_VALUE. Bên dưới, chú ý vị trí của “+1n” trong dấu ngoặc so với đoạn mã trên
console.log[BigInt[Number.MAX_VALUE]+1n];
179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858369n
Như chúng ta có thể thấy ở trên, chữ số cuối cùng của chúng ta đã tăng lên thành “9” từ “8”. Vì vậy, BigInt hoạt động như mô tả. Hãy thử so sánh của chúng tôi
let ab = BigInt[Number.MAX_VALUE];
let bb = BigInt[Number.MAX_VALUE]+1n;
console.log[ab === bb];
false
Như chúng ta có thể thấy, chúng ta có thể so sánh trên Số. Giới hạn MAX_VALUE, với nhược điểm là không thể sử dụng số thập phân
BigInt có giới hạn, tuy nhiên không có bất kỳ “giới hạn cứng” nào hoặc thậm chí là bất kỳ “giới hạn mềm” nào. Các tài liệu không đề cập đến nó. Từ trải nghiệm của những người khác trên StackOverflow, có vẻ như các giới hạn được điều chỉnh bởi trình thông dịch JavaScript và cả giới hạn bộ nhớ của thiết bị. Ngoài ra còn có một hiệu suất đáng chú ý khi đạt được những con số thực sự lớn
Tóm lại, có thể vượt quá giới hạn số gốc của JavaScript trong trường hợp hiếm hoi mà bạn cần. Một ví dụ sẽ là nếu bạn muốn tìm các số nguyên tố vì chúng không yêu cầu chữ số thập phân
Trong hầu hết các trường hợp, mặc dù bạn sẽ không cần sử dụng BigInt, nhưng bạn sẽ muốn đảm bảo rằng mình không vượt quá giới hạn gốc bằng cách kiểm tra Số. MAX_SAFE_INTEGER nếu bạn biết mình có thể đạt đến con số đó