Skip to content

Object.is() và những điều chưa biết

Vien Huynh
Posted on:October 25, 2023 at 09:40 PM

Object.is() có nhiệm vụ so sánh hai đối tượng có bằng nhau hay không? Trước đây thì có toán tử == và ===, hầu hết lập trình viện thời nay đều quen thuộc với toán tử ===, nhưng họ khôn biết rằng vẫn có một số trường hợp sai khi sử dụng toán tử đó.

Trước tiên chúng ta tìm hiểu một chút về Object.is() thì cũng nên tìm hiểu sự vì sao khi so sánh chúng ta phải sử dụng toán tử ===. Để làm gì, để chúng ta có cái nhìn lịch sử phát triển của một toán tử như thế nào trong ngôn ngữ lập trình javascript. Ngoài ra khi đến với nghề lập trình thì cần phải hiểu và đầu tư nhiều nhất về Objects và Arrays. Vì sao, chính là vì những lý do “Để trở thành một lập trình viên tốt”.

Table of contents

Open Table of contents

Toán tử ==

Trong Javascript khi chúng ta sử dụng so sánh == để so sánh, Javascript sẽ tự động ép kiểu. Do đó sẽ có những kết quả không mong muốn. Ví dụ:

console.log('0 == " "', 0 == " "); // true
console.log("null == undefined", null == undefined); // true
console.log("[1] == true", [1] == true); // true

Toán tử ===

Do đó, JavaScript cung cấp cho chúng ta toán tử ===, toán tử này nghiêm ngặt hơn toán tử đề cập ở trên và không trải qua quá trình chuyển đổi kiểu. Nhưng sử dụng === để so sánh không phải là giải pháp tốt nhất. Bạn có thể nhận được:

// NaN === NaN //false
console.log("NaN === NaN", NaN === NaN); // false

Object.is()

// Object.is(0 , ' '); //false
// Object.is(null, undefined); //false
// Object.is([1], true); //false
// Object.is(NaN, NaN); //true

console.log('Object.is(0 , " ")', Object.is(0, " ")); // false
console.log("Object.is(null , undefined)", Object.is(null, undefined)); // false
console.log("Object.is([1] , true)", Object.is([1], true)); // false
console.log("Object.is(NaN , NaN)", Object.is(NaN, NaN)); // true

// Case 2: Signed zero
Object.is(0, -0); // false
Object.is(+0, -0); // false
Object.is(-0, -0); // true
const n = 15;
Object.is(0n, -0n); // true

// Case 3: NaN
Object.is(NaN, 0 / 0); // true
Object.is(NaN, Number.NaN); // true

Team Mozilla không cho rằng Object.is “nghiêm ngặt” hơn ===. Họ nói rằng điều chúng ta nên xem xét là cách phương pháp này xử lý NaN, -0 và +0. Nhưng nói chung, tôi nghĩ rằng đó là một thực hành tốt trong các ứng dụng thực tế.


Có thể bạn sẽ thích: