JavaScript
Number Methods
Math.abs / Math.sign
เรียนรู้ Math.abs() สำหรับหาค่าสัมบูรณ์ และ Math.sign() สำหรับตรวจสอบเครื่องหมาย
Math.abs / Math.sign คืออะไร และเมื่อไหร่ต้องใช้
บนออบเจกต์ `Math` มี method สำหรับตรวจสอบค่าเลข 2 ตัวที่ใช้บ่อย: - **Math.abs()** — หาค่าสัมบูรณ์ (absolute value) คือระยะทางจาก 0 - **Math.sign()** — ตรวจเครื่องหมายของเลข ว่าเป็นบวก ลบ หรือศูนย์ ทั้ง 2 method เป็น **static method** บน `Math` เรียกใช้ได้ทันทีโดยไม่ต้อง `new`
| Method | หน้าที่ | ค่าที่คืน | ตัวอย่าง | ผลลัพธ์ |
|---|---|---|---|---|
| Math.abs(x) | หาค่าสัมบูรณ์ | number (ค่าบวกเสมอ) | Math.abs(-7) | 7 |
| Math.sign(x) | ตรวจเครื่องหมาย | 1, 0, หรือ -1 | Math.sign(-5) | -1 |
console.log(Math.abs(-42)); // 42 — ค่าสัมบูรณ์
console.log(Math.abs(42)); // 42 — เลขบวกไม่เปลี่ยน
console.log(Math.sign(-8)); // -1 — เลขลบ
console.log(Math.sign(0)); // 0 — ศูนย์
console.log(Math.sign(8)); // 1 — เลขบวก- ทั้ง 2 method เป็น static method บน `Math` เรียกตรงได้เลย
- รับ argument 1 ตัว คืนค่าเป็น `number` เสมอ
- ถ้า argument ไม่ใช่ number → คืน `NaN`
- ไม่เปลี่ยนแปลงค่าเดิม (number เป็น primitive — immutable)
Math.abs() — หาค่าสัมบูรณ์
`Math.abs(x)` คืน **ค่าสัมบูรณ์** ของ `x` — คือระยะทางจาก 0 โดยไม่สนเครื่องหมาย เลขบวกคืนค่าเดิม เลขลบเปลี่ยนเป็นบวก
// เลขบวก — ไม่เปลี่ยน
console.log(Math.abs(5)); // 5
console.log(Math.abs(3.14)); // 3.14
// เลขลบ — เปลี่ยนเป็นบวก
console.log(Math.abs(-5)); // 5
console.log(Math.abs(-3.14)); // 3.14
// edge cases
console.log(Math.abs(0)); // 0
console.log(Math.abs(-0)); // 0
console.log(Math.abs(Infinity)); // Infinity
console.log(Math.abs(-Infinity)); // Infinity
console.log(Math.abs("hello")); // NaN ← แปลงไม่ได้
console.log(Math.abs(null)); // 0 ← null ถูก coerce เป็น 0การใช้จริง: หาระยะห่างระหว่าง 2 จุด
สูตร: `Math.abs(a - b)` ตัวอย่าง: อุณหภูมิวันนี้ 28 องศา เมื่อวาน 35 องศา → `Math.abs(28 - 35)` = **7 องศา** ไม่ต้องกังวลว่า a หรือ b มากกว่า — `abs` จัดการให้
// ระยะห่างระหว่าง 2 ตัวเลข
const a = 28;
const b = 35;
const distance = Math.abs(a - b);
console.log(distance); // 7
// ถ้าไม่ใช้ abs ต้องเขียน if-else เอง
const manual = a > b ? a - b : b - a;
console.log(manual); // 7 — ผลเหมือนกัน แต่ abs กระชับกว่า- `Math.abs()` คืนค่าสัมบูรณ์ — ระยะทางจาก 0
- เลขบวกคืนค่าเดิม, เลขลบเปลี่ยนเป็นบวก
- ใช้หาระยะห่าง: `Math.abs(a - b)` ไม่ต้องกังวลว่า a หรือ b มากกว่า
- `Math.abs(-0)` ได้ `0`, `Math.abs(null)` ได้ `0` (null ถูก coerce)
Math.sign() — ตรวจสอบเครื่องหมาย
`Math.sign(x)` ตรวจสอบเครื่องหมายของ `x` แล้วคืนค่า 3 แบบ: - `1` → เลขบวก - `-1` → เลขลบ - `0` → ศูนย์ เหมาะสำหรับตรวจสอบทิศทาง หรือแยกประเภทเลข สังเกต: `Math.sign()` **ไม่ได้คืน boolean** — คืน `number` ที่บอกทิศทาง
| ค่าที่ส่งเข้า | ผลลัพธ์ | ความหมาย |
|---|---|---|
| 12 | 1 | เลขบวก (positive) |
| -12 | -1 | เลขลบ (negative) |
| 0 | 0 | ศูนย์ (zero) |
| -0 | -0 | ศูนย์ติดลบ (negative zero) |
| NaN | NaN | ไม่ใช่ตัวเลข |
| Infinity | 1 | อนันต์บวก |
// เลขบวก → 1
console.log(Math.sign(5)); // 1
console.log(Math.sign(0.01)); // 1
// เลขลบ → -1
console.log(Math.sign(-5)); // -1
console.log(Math.sign(-0.01)); // -1
// ศูนย์ → 0
console.log(Math.sign(0)); // 0
console.log(Math.sign(-0)); // -0 ← จุดที่ต้องระวัง!
// ไม่ใช่ number → NaN
console.log(Math.sign("abc")); // NaN
console.log(Math.sign(null)); // 0 ← null ถูก coerce เป็น 0จุดที่ต้องระวัง: Math.sign(-0)
`Math.sign(-0)` คืน `-0` ไม่ใช่ `0` แม้ว่า `-0 === 0` เป็น `true` แต่ `Object.is(-0, 0)` เป็น `false` ในทางปฏิบัติแทบไม่เจอ แต่ควรรู้ไว้
function classifyNumber(num) {
const s = Math.sign(num);
if (s === 1) return "เลขบวก";
if (s === -1) return "เลขลบ";
return "ศูนย์";
}
console.log(classifyNumber(42)); // "เลขบวก"
console.log(classifyNumber(-7)); // "เลขลบ"
console.log(classifyNumber(0)); // "ศูนย์"
// ใช้คูณเพื่อรักษาหรือกลับเครื่องหมาย
const direction = Math.sign(-15); // -1
console.log(direction * 10); // -10 — รักษาทิศทางเดิม- `Math.sign()` คืน `1` (บวก), `-1` (ลบ), หรือ `0` (ศูนย์)
- ไม่ได้คืน boolean — คืน number ที่บอกทิศทาง
- `Math.sign(-0)` ได้ `-0` ไม่ใช่ `0`
- ใช้จริง: แยกประเภทเลข, ตรวจทิศทาง, หรือคูณเพื่อรักษา/กลับเครื่องหมาย
เปรียบเทียบ Math.abs กับ Math.sign และเลือกใช้ให้ถูก
ทั้ง 2 method ทำงานกับเครื่องหมายของเลข แต่จุดประสงค์ต่างกัน: - `Math.abs()` ต้องการ **ค่า** (ระยะทาง) - `Math.sign()` ต้องการ **ทิศทาง** (เครื่องหมาย) เลือกใช้ให้ตรงกับสถานการณ์
| ค่า | Math.abs | Math.sign |
|---|---|---|
| 5 | 5 | 1 |
| -5 | 5 | -1 |
| 0 | 0 | 0 |
| -3.7 | 3.7 | -1 |
| Infinity | Infinity | 1 |
const values = [5, -5, 0, -3.7, Infinity];
for (const v of values) {
console.log(`${v} → abs:${Math.abs(v)} sign:${Math.sign(v)}`);
}
// 5 → abs:5 sign:1
// -5 → abs:5 sign:-1
// 0 → abs:0 sign:0
// -3.7 → abs:3.7 sign:-1
// Infinity → abs:Infinity sign:1- ต้องการระยะทางหรือค่าไม่ติดลบ → **Math.abs()** — หาระยะห่าง, บังคับให้เป็นบวก
- ต้องการรู้ทิศทางหรือเครื่องหมาย → **Math.sign()** — แยกบวก/ลบ/ศูนย์, ตรวจทิศ
- ใช้คู่กันได้: `Math.abs(x)` เอาค่า, `Math.sign(x)` เอาทิศทาง
- ทั้ง 2 method ไม่เปลี่ยนค่าเดิม ต้องเก็บผลลัพธ์ในตัวแปรใหม่