JavaScript
Number Methods
Number.isFinite
เรียนรู้ `Number.isFinite()` สำหรับตรวจสอบว่าเป็น finite number หรือไม่ ต่างจาก `isFinite()` ตรงที่ไม่ทำ type coercion — ปลอดภัยและตรงไปตรงมากว่า
Number.isFinite ใช้ตรวจสอบว่าค่าเป็น finite number ที่คำนวณได้จริง
`Number.isFinite(value)` คือ static method ของ `Number` ที่ตรวจสอบว่า `value` เป็น finite number หรือไม่ — finite number หมายถึงตัวเลขที่มีขอบเขตจำกัด ไม่ใช่ `Infinity`, `-Infinity`, หรือ `NaN` คืนค่าเป็น `boolean`: `true` ถ้าค่าเป็น finite number, `false` ในกรณีอื่นทั้งหมด (รวมถึงค่าที่ไม่ใช่ `number`) ใช้ `Number.isFinite()` เมื่อต้องการเช็คผลลัพธ์จากการคำนวณก่อนนำไปใช้ต่อ เช่น เช็คว่าการหารให้ผลลัพธ์ที่ใช้งานได้จริง หรือ validate ข้อมูลก่อนส่งเข้า function ที่ต้องการ finite number เท่านั้น
// ตัวเลขธรรมดา → finite
console.log(Number.isFinite(42)); // true
console.log(Number.isFinite(-3.14)); // true
console.log(Number.isFinite(0)); // true
// Infinity, -Infinity, NaN → ไม่ใช่ finite
console.log(Number.isFinite(Infinity)); // false
console.log(Number.isFinite(-Infinity)); // false
console.log(Number.isFinite(NaN)); // false
// ค่าที่ไม่ใช่ number → false (ไม่ทำ coercion)
console.log(Number.isFinite("42")); // false
console.log(Number.isFinite(null)); // false
console.log(Number.isFinite(undefined)); // false- `Number.isFinite()` ตรวจสอบว่าเป็นตัวเลขที่มีขอบเขตจำกัด — ไม่ใช่ `Infinity` / `-Infinity` / `NaN`
- คืน `true` เฉพาะกับ finite number เท่านั้น
- ไม่ทำ type coercion โดยเด็ดขาด — ถ้าไม่ใช่ `number` → `false` เสมอ
- ใช้ validate ค่าก่อนคำนวณหรือก่อนเก็บผลลัพธ์
Number.isFinite กับ global isFinite ต่างกันตรงที่ไม่ทำ coercion
JavaScript มีทั้ง `Number.isFinite()` (ES6) และ global `isFinite()` — ทั้งสองเช็ค finite number แต่ต่างกันที่การแปลง type: - **`isFinite(value)` (global)**: แปลง `value` เป็น number ก่อนเช็ค — ทำให้ `isFinite("42")` → `true` เพราะ "42" ถูกแปลงเป็น `42` ก่อน - **`Number.isFinite(value)` (ES6)**: ไม่แปลง type — ถ้า `value` ไม่ใช่ `number` ตั้งแต่แรก → `false` ทันที ใช้ `Number.isFinite()` ถ้าต้องการความแม่นและไม่ต้องการให้ string หรือค่าอื่นเล็ดลอดเข้าไป ในทางปฏิบัติ modern code ควรใช้ `Number.isFinite()` เพราะปลอดภัยและตรงไปตรงมากว่า
// string "123" — global isFinite แปลงก่อนเช็ค
console.log(isFinite("123")); // true ← แปลง "123" → 123
console.log(Number.isFinite("123")); // false ← ไม่ใช่ number → false
// string ว่าง — global isFinite แปลง "" → 0
console.log(isFinite("")); // true ← "" → 0 → finite!
console.log(Number.isFinite("")); // false ← ไม่ใช่ number → false
// boolean — global isFinite แปลง true → 1
console.log(isFinite(true)); // true ← true → 1 → finite!
console.log(Number.isFinite(true)); // false ← ไม่ใช่ number → false
// null — global isFinite แปลง null → 0
console.log(isFinite(null)); // true ← null → 0 → finite!
console.log(Number.isFinite(null)); // false ← ไม่ใช่ number → false| input | isFinite(input) | Number.isFinite(input) |
|---|---|---|
| 42 | true | true |
| "42" | true (โคเอิร์สเป็น 42) | false (ไม่ใช่ number) |
| "" | true (โคเอิร์สเป็น 0) | false (ไม่ใช่ number) |
| true | true (โคเอิร์สเป็น 1) | false (ไม่ใช่ number) |
| null | true (โคเอิร์สเป็น 0) | false (ไม่ใช่ number) |
| undefined | false (โคเอิร์สเป็น NaN) | false (ไม่ใช่ number) |
| Infinity | false | false |
| NaN | false | false |
- global `isFinite()` → แปลง type ก่อนเช็ค — string, boolean, null อาจเล็ดลอดเข้ามา
- `Number.isFinite()` → ไม่แปลง type — false ถ้าไม่ใช่ number
- ใช้ `Number.isFinite()` เสมอเมื่อตรวจสอบแบบเข้มงวด
- ถ้าตั้งใจให้รับ string แล้วแปลงเป็น number ควรใช้ `Number()` แปลงก่อน แล้วค่อยใช้ `Number.isFinite()`
edge case ที่ต้องระวัง และ real use-case
นอกจากการแยกความต่างกับ `isFinite()` แล้ว ยังมี edge case ที่ควรรู้เพื่อป้องกัน bug: - `BigInt` ไม่สามารถใช้กับ `Number.isFinite()` โดยตรง — จะ throw `TypeError` - `Infinity` และ `-Infinity` ถือว่าไม่ใช่ finite ทั้งคู่ - Object, Array, Function → `false` เสมอ ในทางปฏิบัติ `Number.isFinite()` มักใช้ validate input จาก API, user input, หรือผลลัพธ์ก่อนเก็บลง database
// ใช้ validate ก่อนคำนวณ
function safeDivide(a, b) {
if (!Number.isFinite(a) || !Number.isFinite(b)) {
return "Error: ต้องส่ง finite number เท่านั้น";
}
if (b === 0) {
return "Error: หารด้วย 0 ไม่ได้";
}
return a / b;
}
console.log(safeDivide(10, 2)); // 5
console.log(safeDivide(10, 0)); // "Error: หารด้วย 0 ไม่ได้"
console.log(safeDivide(Infinity, 2)); // "Error: ต้องส่ง finite number…"
console.log(safeDivide(10, "hi")); // "Error: ต้องส่ง finite number…"
// validate ผลลัพธ์หลังแปลง type
function parseAndValidate(raw) {
const num = Number(raw);
return Number.isFinite(num) ? num : null;
}
console.log(parseAndValidate("42")); // 42
console.log(parseAndValidate("3.14")); // 3.14
console.log(parseAndValidate("abc")); // null
console.log(parseAndValidate("Infinity")); // null- Object, Array, Function → `Number.isFinite()` คืน `false` เสมอ
- `BigInt` → throw `TypeError` — ต้องใช้ `typeof` เช็ค `bigint` ก่อน
- ถ้าต้องการรับ string แล้ว validate ให้ใช้ `Number()` แปลงก่อน แล้วเช็คด้วย `Number.isFinite()`
- `Number.isFinite()` เป็นวิธีที่ปลอดภัยที่สุดในการเช็คว่าค่าพร้อมใช้งานเป็นตัวเลขหรือไม่