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ừ Infinity
xuất hiện và 0.0
thay 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 isFinite
chức năng này thay thế, tùy thuộc vào cách bạn muốn điều trị NaN
. isFinite
trả về false
nếu số của bạn là POSITIVE_INFINITY
, NEGATIVE_INFINITY
hoặc NaN
.
if (isFinite(result))
{
// ...
}
Infinity
Thuộ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
, NaN
v.v. nên mong đợi những điều kỳ lạ sẽ xảy ra.)
Number.(POSITIVE|NEGATIVE)_INFINITY
không chỉ đọc một trong hai, Infinity
là chỉ đọc trong chế độ nghiêm ngặt. Ngoài ra, còn -?1/0
trườ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 isFinite
thay thế.
Number.POSITIVE_INFINITY
và ở chế độ Number.NEGATIVE_INFINITY
chỉ đọc (thử nghiệm trên Chrome8, FF3.6 và IE8). Sử dụng 1/0
hoạ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 isFinite
hầ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.defineProperty
và __defineGetter__
. Infinity
Mặt khác, là phi cấu hình trong chế độ nghiêm ngặt.
Một đơn giản n === n+1
hoặc n === n/0
hoạ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à true
ví 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+1
khô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.isFinite
rấ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 NaN
hoặc không Infinity
như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
NaN
s, 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.isFinit
kiểm tra xem giá trị có phải là Số không và chính xác hơn để kiểm tra undefined
và null
v.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)_INFINITY
thay vì-?Infinity
hoặc-?1/0
?