aedev.net
  • Trang chủ
  • AI
  • Mobile
  • Flutter
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
No Result
View All Result
SAVED POSTS
aedev.net
  • Trang chủ
  • AI
  • Mobile
  • Flutter
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
No Result
View All Result
aedev.net
No Result
View All Result
Lập trình viên chuẩn bị phỏng vấn fresher React Native với laptop, điện thoại và thẻ câu hỏi

Phỏng vấn JavaScript: Object.is khác === thế nào với NaN, +0 và -0?

Suong Nguyen by Suong Nguyen
27/10/2026
in Phỏng vấn
0
585
SHARES
3.2k
VIEWS
Summarize with ChatGPTShare to Facebook

Một câu hỏi phỏng vấn có thể bắt đầu rất ngắn: Object.is(NaN, NaN) và NaN === NaN có cùng kết quả không? Câu trả lời tốt cần giải thích quy tắc, rồi phân biệt nó với việc so nội dung của object.

Bài dùng các đoạn JavaScript độc lập với React và trình duyệt, đối chiếu MDN ngày 27/10/2026. Snippet được chạy bằng Node.js 24.18.1 trong lượt biên tập. Đây là kiểm tra ngữ nghĩa với dữ liệu nhỏ, không phải đánh giá tốc độ của các phép so sánh.

1. Dự đoán rồi chạy các cặp giá trị

const pairs = [
  ['NaN', NaN, NaN],
  ['signed zero', +0, -0],
  ['different types', '0', 0],
  ['null/undefined', null, undefined],
  ['same number', 3, 3],
];
for (const [label, left, right] of pairs) {
  console.log(label, left === right, Object.is(left, right));
}

Kết quả hai phép kiểm tra theo từng dòng:

Cặp === Object.is
NaN với NaN false true
+0 với -0 true false
Chuỗi '0' với số 0 false false
null với undefined false false
Số 3 với số 3 true true

Cả hai đều không ép chuỗi '0' thành số 0. Khác biệt về giá trị số ở đây là cách xử lý NaN và hai giá trị 0 khác dấu. Vì vậy, mô tả Object.is là “triple equals chặt hơn” dễ gây hiểu nhầm: nó trả true ở một ca mà triple equals trả false, nhưng cũng làm điều ngược lại ở ca khác.

2. NaN là một giá trị cần quy tắc riêng

NaN xuất hiện trong một số phép tính không tạo ra một số thông thường. Với ===, việc so nó với chính nó vẫn trả false. Với Object.is, hai giá trị NaN được coi là cùng giá trị theo quy tắc của hàm này.

Nếu mục tiêu của code là phát hiện một giá trị số có phải NaN hay không, hãy diễn đạt trực tiếp thay vì vô tình dùng một phép so sánh không đúng ý:

const invalid = Number('khong-phai-so');
console.log(invalid === NaN);
console.log(Object.is(invalid, NaN));
console.log(Number.isNaN(invalid));
console.log(Number.isNaN('khong-phai-so'));

Bốn kết quả lần lượt là false, true, true, false. Dòng cuối quan trọng: một chuỗi chưa được chuyển thành số không tự trở thành giá trị NaN chỉ vì nó không giống cách viết số. Khi review validation, hãy hỏi code đã ở tầng chuỗi nhập liệu hay tầng số đã parse.

3. +0 và -0 có thể nhìn giống nhau

Nhiều cách hiển thị khiến bạn chỉ thấy một số 0, nhưng dấu của zero có thể làm khác kết quả tính toán tiếp theo:

console.log(1 / +0);
console.log(1 / -0);
console.log(Object.is(+0, -0));

Kết quả là Infinity, -Infinity, false. Điều này giúp giải thích vì sao ngôn ngữ có một phép so sánh phân biệt hai giá trị. Không có nghĩa rằng mọi form số lượng hàng hóa phải giữ hai loại zero khác nhau; quy tắc chuẩn hóa dữ liệu vẫn do nghiệp vụ quyết định.

Trong câu trả lời phỏng vấn, đưa một phép tính nhỏ như trên sẽ rõ hơn việc chỉ nhớ bảng true/false. Sau đó nói rõ tình huống của ứng dụng có cần phân biệt dấu đó không, thay vì đề xuất đổi mọi === thành Object.is.

4. Object.is không so sánh sâu object

const first = {id: 1};
const alias = first;
const another = {id: 1};
console.log(Object.is(first, alias), first === alias);
console.log(Object.is(first, another), first === another);

Hai kết quả trên mỗi dòng lần lượt là true true và false false. Alias trỏ đến cùng object; another là một object khác dù có cùng thuộc tính. Tên “Object.is” không có nghĩa hàm duyệt từng khóa rồi so nội dung.

Nếu yêu cầu là xác định hai bản ghi có cùng ID, hãy so trường ID theo hợp đồng dữ liệu. Nếu yêu cầu là so nội dung lồng nhau, bạn cần định nghĩa cách xử lý array, ngày tháng, giá trị thiếu và các kiểu dữ liệu liên quan. Đó là một yêu cầu khác với identity.

Cách trả lời gọn trong buổi phỏng vấn

Bắt đầu bằng việc cả hai không thực hiện ép kiểu như loose equality. Nêu hai trường hợp khác nhau là NaN và signed zero. Cuối cùng dùng hai object cùng nội dung để chứng minh rằng cả hai vẫn dựa vào identity với object.

Người phỏng vấn có thể hỏi tiếp vì sao một phương thức tìm kiếm nhận ra NaN trong khi phép === không nhận ra. Khi ấy, cần đọc quy tắc so sánh mà chính API đó dùng, chẳng hạn SameValueZero; đừng suy luận mọi API đều dùng cùng một phép so sánh.

Kiểm tra và giới hạn

Hãy chạy các snippet rồi tự thêm boolean, string và object được tạo mới. Tránh dùng duy nhất output từ JSON serialization để quan sát những giá trị số đặc biệt, vì cách serialize không phải định nghĩa equality của ngôn ngữ.

Những ví dụ này chưa khảo sát mọi kiểu dữ liệu hoặc đưa ra một hàm deep equal. Điều cần mang vào công việc là chọn phép so sánh theo câu hỏi dữ liệu, đồng thời giải thích được trường hợp biên mà code đang giữ hay bỏ qua.

Nguồn tham khảo

  • MDN: Object.is
  • MDN: Strict equality
  • MDN: Equality comparisons and sameness

Tags: EqualityJavaScriptPhỏng vấn
SummarizeShare234
Suong Nguyen

Suong Nguyen

Related Stories

Lập trình viên chuẩn bị phỏng vấn fresher React Native với laptop, điện thoại và thẻ câu hỏi

JavaScript sort: vì sao số 10 đứng trước 2 và mảng gốc bị đổi?

by Suong Nguyen
26/10/2026
0

Kiểm tra thứ tự mặc định, hợp đồng comparator, tính ổn định và cách dùng toSorted để giữ mảng gốc khi sắp xếp.

Lập trình viên chuẩn bị phỏng vấn fresher React Native với laptop, điện thoại và thẻ câu hỏi

JavaScript: chọn giá trị mặc định mà không làm mất 0, false và chuỗi rỗng

by Suong Nguyen
25/10/2026
0

Phân biệt toán tử OR, nullish coalescing và optional chaining bằng ví dụ chạy được cùng các trường hợp dễ nhầm khi đọc cấu hình.

Lập trình viên chuẩn bị phỏng vấn fresher React Native với laptop, điện thoại và thẻ câu hỏi

Promise.all và allSettled: chờ kết quả không có nghĩa là tự hủy tác vụ

by Suong Nguyen
24/10/2026
0

Chạy ví dụ nhỏ để phân biệt Promise.all, allSettled, thứ tự kết quả và việc hủy công việc khi một promise thất bại.

Lập trình viên chuẩn bị phỏng vấn fresher React Native với laptop, điện thoại và thẻ câu hỏi

Phỏng vấn JavaScript: vì sao spread vẫn có thể làm đổi object gốc?

by Suong Nguyen
23/10/2026
0

Luyện cách giải thích shallow copy, so sánh tham chiếu và cập nhật một nhánh dữ liệu mà vẫn giữ object ban đầu.

0 0 votes
Article Rating
Subscribe
Login
Notify of
guest
guest
0 Comments
Oldest
Newest Most Voted
AE Dev

AE Dev mang đến các bài viết về lập trình, mobile app, backend, frontend, WordPress và công nghệ, phù hợp cho developer muốn học hỏi và cập nhật kiến thức thực tế.

Recent Posts

  • React Native SectionList: nhóm dữ liệu với key và tiêu đề riêng cho từng phần
  • Phỏng vấn JavaScript: Object.is khác === thế nào với NaN, +0 và -0?
  • Android Sharesheet: chia sẻ văn bản và đường dẫn bằng ACTION_SEND

Categories

  • AI
  • Backend
  • Đánh giá
  • DevOps
  • Flutter
  • Hướng dẫn
  • Lập trình Mobile
  • Phỏng vấn
  • React Native
  • Uncategorized

Weekly Newsletter

  • Buy JNews
  • Support Forum
  • Pre-sale Question
  • Contact Us

© 2026 AE Dev - Blog công nghệ, lập trình và chia sẻ kiến thức IT.

Welcome Back!

Login to your account below

Forgotten Password?

Retrieve your password

Please enter your username or email address to reset your password.

Log In
No Result
View All Result
  • Trang chủ
  • AI
  • Mobile
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
  • Flutter

© 2026 AE Dev - Blog công nghệ, lập trình và chia sẻ kiến thức IT.

wpDiscuz
0
0
Would love your thoughts, please comment.x
()
x
| Reply