Tôi có một loạt các phép tính Javascript (chỉ trong IE) hiển thị Infinity tùy thuộc vào lựa chọn của người dùng.
Làm cách nào để ngăn từ Infinityxuất hiện và 0.0thay vào đó là hiển thị ?
Câu trả lời:
if (result == Number.POSITIVE_INFINITY || result == Number.NEGATIVE_INFINITY)
{
// ...
}
Bạn có thể sử dụng isFinitechức năng này thay thế, tùy thuộc vào cách bạn muốn điều trị NaN. isFinitetrả về falsenếu số của bạn là POSITIVE_INFINITY, NEGATIVE_INFINITYhoặc NaN.
if (isFinite(result))
{
// ...
}
InfinityThuộc tính toàn cục không chỉ đọc, có nghĩa là nó có thể được xác định lại: Ví dụ: var x = 42; Infinity = 42; alert(x === Infinity);hiển thị "true" . (Phải thừa nhận rằng đó là một trường hợp khó hiểu và bất kỳ ai quyết định xác định lại Infinity, NaNv.v. nên mong đợi những điều kỳ lạ sẽ xảy ra.)
Number.(POSITIVE|NEGATIVE)_INFINITYkhông chỉ đọc một trong hai, Infinity là chỉ đọc trong chế độ nghiêm ngặt. Ngoài ra, còn -?1/0trường hợp tôi đã trình bày với bạn? Dù sao, bạn hầu như luôn luôn nên sử dụng isFinitethay thế.
Number.POSITIVE_INFINITYvà ở chế độ Number.NEGATIVE_INFINITY chỉ đọc (thử nghiệm trên Chrome8, FF3.6 và IE8). Sử dụng 1/0hoạt động tốt nhưng nó sẽ không quá rõ ràng đối với những người bảo trì mã của bạn những gì bạn thực sự đang cố gắng kiểm tra. Tôi đồng ý rằng sử dụng isFinitehầu như luôn luôn là cách tốt hơn để làm mọi việc - đó là lý do tại sao tôi đã đề cập đến nó trong câu trả lời của mình - nhưng chỉ OP mới có thể quyết định liệu nó có đáp ứng yêu cầu của họ hay không.
Object.definePropertyvà __defineGetter__. InfinityMặt khác, là phi cấu hình trong chế độ nghiêm ngặt.
Một đơn giản n === n+1hoặc n === n/0hoạt động:
function isInfinite(n) {
return n === n/0;
}
Lưu ý rằng các nguyên tắc isFinite()đầu vào ép buộc các số. isFinite([])và isFinite(null)cả hai đều là trueví dụ.
n === n+1đánh giá là true cho tất cả các số lớn hơn 2 ^ 53, tức là 1e30. Hack phân chia hoạt động, ngay cả đối với NaN và -Infinity. Tuy nhiên, câu trả lời của LukeH cung cấp cho bạn mã dễ đọc hơn.
n+1không thể được biểu diễn và phải làm tròn. Vâng, ngay cả các số nguyên cũng bị ảnh hưởng bởi lỗi làm tròn. Btw, tôi không nghĩ rằng mã của bạn là "bằng toán học", chỉ cần thử n === n/-0. Khi hoàn thành số thực với +/- inf, giới hạn của bạn không được xác định rõ ràng trừ khi dãy số 0 cơ bản được giả định là số dương.
Trong ES6, Number.isFinite()Phương thức xác định xem giá trị được truyền vào có phải là một số hữu hạn hay không.
Number.isFinite(Infinity); // false
Number.isFinite(NaN); // false
Number.isFinite(-Infinity); // false
Number.isFinite(0); // true
Number.isFinite(2e64); // true
Tôi thích sử dụng Lodash vì nhiều lý do mã hóa phòng thủ cũng như tính dễ đọc. ES6 Number.isFiniterất tuyệt và không gặp vấn đề với các giá trị không phải số, nhưng nếu không thể sử dụng ES6, bạn đã có lodash hoặc muốn có mã ngắn gọn: _.isFinite
_.isFinite(Infinity); // false
_.isFinite(NaN); // false
_.isFinite(-Infinity); // false
_.isFinite(null); // false
_.isFinite(3); // true
_.isFinite('3'); // true
Tôi đã gặp phải một tình huống yêu cầu tôi kiểm tra xem giá trị có thuộc kiểu NaNhoặc không Infinitynhưng chuyển các chuỗi làm kết quả hợp lệ. Bởi vì nhiều chuỗi văn bản sẽ tạo ra dương tính giả NaN, tôi đã thực hiện một giải pháp đơn giản để tránh điều đó:
const testInput = input => input + "" === "NaN" || input + "" === "Infinity";
Đoạn mã trên chuyển đổi các giá trị thành chuỗi và kiểm tra xem chúng có hoàn toàn bằng NaN hoặc Infinity hay không (bạn sẽ cần thêm một trường hợp khác cho vô cực âm).
Vì thế:
testInput(1/0); // true
testInput(parseInt("String")); // true
testInput("String"); // false
NaNs, vv
toString()thay thế? Vui lòng phản đối hoặc nêu lý do tại sao điều này có thể mang lại kết quả không nhất quán hoặc tại sao chính xác phương pháp này không được khuyến nghị. Cho đến nay, tôi vẫn cảm thấy nó bổ sung thêm một lựa chọn cho những ai đang tìm kiếm một câu trả lời và không có bất kỳ lý do cụ thể tại sao điều này rất nguy hiểm, không ổn định, vv
Bạn có thể sử dụng isFinite trong cửa sổ, isFinite(123):
Bạn có thể viết một hàm như:
function isInfinite(num) {
return !isFinite(num);
}
Và sử dụng như:
isInfinite(null); //false
isInfinite(1); //false
isInfinite(0); //false
isInfinite(0.00); //false
isInfinite(NaN); //true
isInfinite(-1.797693134862316E+308); //true
isInfinite(Infinity); //true
isInfinite(-Infinity); //true
isInfinite(+Infinity); //true
isInfinite(undefined); //true
Bạn cũng có thể Number.isFinitkiểm tra xem giá trị có phải là Số không và chính xác hơn để kiểm tra undefinedvà nullv.v.
Hoặc bạn có thể polyfill nó như thế này:
Number.isFinite = Number.isFinite || function(value) {
return typeof value === 'number' && isFinite(value);
}
Number.(POSITIVE|NEGATIVE)_INFINITYthay vì-?Infinityhoặc-?1/0?