Tìm Hiểu Object.is trong JavaScript: So Sánh Giá Trị Đúng Đắn
JavaScript cung cấp nhiều cách để so sánh giá trị: ==, ===, và Object.is. Trong phần lớn trường hợp, === là đủ, nhưng nó có một số trường hợp đặc biệt mà kết quả có thể gây bất ngờ.
Đó là lúc mà Object.is trở nên hữu ích.
📌 Object.is được giới thiệu khi nào?
- Được giới thiệu trong ES6 (ECMAScript 2015).
- Được thiết kế như một phương pháp so sánh đáng tin cậy hơn so với
===.
🤔 Tại sao chúng ta cần Object.is?
So sánh chặt chẽ (===) hoạt động tốt trong hầu hết các trường hợp, nhưng lại thất bại trong hai trường hợp phức tạp:
-
So sánh NaN
javascriptNaN === NaN // false ❌ Object.is(NaN, NaN); // true ✅ -
+0 so với -0
javascript+0 === -0 // true ❌ Object.is(+0, -0); // false ✅
Vì vậy, Object.is được giới thiệu để khắc phục những điểm kỳ quặc này và làm cho việc so sánh giá trị trở nên chính xác hơn.
🔑 So sánh ==, ===, và Object.is
| So sánh | == (lỏng lẻo) |
=== (chặt chẽ) |
Object.is |
|---|---|---|---|
| Ép kiểu | ✅ Có | ❌ Không | ❌ Không |
NaN === NaN |
false | false | ✅ true |
+0 === -0 |
true | true | ❌ false |
| Giá trị bình thường | Hoạt động với ép kiểu | Hoạt động chặt chẽ | Giống như === (trừ hai trường hợp trên) |
✅ Khi nào nên sử dụng Object.is?
-
Phát hiện giá trị NaN
javascriptconst value = 0 / 0; // NaN console.log(Object.is(value, NaN)); // true -
Phân biệt +0 và -0
javascriptconsole.log(Object.is(+0, -0)); // false -
So sánh bình diện nông: Các framework như React sử dụng
Object.isđể so sánh props/state và tránh cập nhật không cần thiết.
🌍 Ứng dụng thực tế
1. Cập nhật trạng thái trong React
React sử dụng Object.is bên trong khi kiểm tra xem giá trị trạng thái mới có khác với giá trị cũ hay không.
javascript
const [count, setCount] = useState(NaN);
// Điều này sẽ không kích hoạt lại render
setCount(NaN); // Object.is(NaN, NaN) === true
Nếu React chỉ sử dụng ===, điều này sẽ kích hoạt render không cần thiết.
2. So sánh props nông với React.memo
React.memo sử dụng so sánh nông với Object.is bên trong.
javascript
const MyComponent = React.memo(({ value }) => {
console.log("Rendered");
return <div>{value}</div>;
});
<MyComponent value={NaN} /> // Rendered
<MyComponent value={NaN} /> // Không render lại ✅
Điều này ngăn chặn việc render không cần thiết khi props thực sự "giống nhau".
📝 Kết luận
Object.is là một bổ sung nhỏ nhưng mạnh mẽ được giới thiệu trong ES6. Nó hoạt động giống như === trong hầu hết các trường hợp, nhưng có hai điểm khác biệt quan trọng:
- Nó coi
NaNlà bằng vớiNaN. - Nó coi
+0và-0là khác nhau.
Những khác biệt này khiến nó trở thành một lựa chọn đáng tin cậy cho những trường hợp đặc biệt mà so sánh chặt chẽ không đáp ứng được. Dù bạn có thể không sử dụng nó hàng ngày, nhưng nó đóng một vai trò quan trọng trong các thư viện như React, đảm bảo các so sánh chính xác và tránh công việc không cần thiết.
💡 Mẹo và Thực tiễn tốt nhất
- Sử dụng
Object.iskhi cần kiểm tra NaN hoặc phân biệt giữa +0 và -0. - Tránh sử dụng
==trừ khi bạn chắc chắn về sự ép kiểu. - Luôn kiểm tra các edge case trong mã của bạn để đảm bảo tính chính xác của các phép so sánh.
❗ Những cạm bẫy thường gặp
- Không nhầm lẫn giữa
Object.isvà===. - Đảm bảo hiểu rõ cách thức hoạt động của
Object.istrong các thư viện mà bạn đang sử dụng.
🤔 Câu hỏi thường gặp
Object.iscó giống như===không?
Không hoàn toàn.Object.iscoiNaNlà bằng vớiNaNvà phân biệt giữa+0và-0.- Khi nào nên sử dụng
Object.is?
Sử dụngObject.iskhi bạn cần so sánh giá trị một cách chính xác trong các tình huống như trong React hoặc các thư viện khác.