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

Map.get trả undefined: khóa không tồn tại hay đã lưu giá trị undefined?

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

Trong phỏng vấn, người hỏi đưa một Map làm cache và hỏi bạn có thể dùng get để biết khóa đã được tra cứu chưa. Câu trả lời phụ thuộc vào hợp đồng giá trị. Nếu cache được phép lưu undefined, cùng một kết quả từ get có thể đại diện cho hai trạng thái khác nhau.

Hãy tưởng tượng bộ tra cứu nhãn hiển thị. Một mã đã được kiểm tra nhưng không có nhãn có thể được lưu với undefined để tránh tra lại. Một mã chưa bao giờ được kiểm tra cũng trả undefined khi đọc cache. Dùng cùng một nhánh cho hai trường hợp sẽ khiến cache không giảm được lượt tra cứu thiếu nhãn.

Tách câu hỏi về khóa và giá trị

Theo ECMAScript, get trả giá trị đã lưu nếu có khóa, còn nếu không có khóa thì trả undefined. has trả boolean về sự hiện diện. Bạn cần has khi ứng dụng cho phép giá trị lưu trùng với giá trị biểu thị không tìm thấy của get.

const assert = require('node:assert/strict');
const labels = new Map([['known-empty', undefined], ['zero', 0]]);
assert.equal(labels.get('known-empty'), undefined);
assert.equal(labels.get('never-looked-up'), undefined);
assert.equal(labels.has('known-empty'), true);
assert.equal(labels.has('never-looked-up'), false);
assert.equal(labels.has('zero'), true);

Các assertion chạy trên Node 24.18.1. Chúng kiểm tra cả trường hợp giá trị 0 vì điều kiện dựa vào truthiness cũng có thể bỏ qua một giá trị hợp lệ. Việc 0 hay undefined có hợp lệ trong cache thật là quyết định của ứng dụng, không phải yêu cầu của Map.

Thử bằng số lượt gọi

const assert = require('node:assert/strict');
const cache = new Map();
let lookups = 0;

function lookupLabel(key) {
  if (cache.has(key)) return cache.get(key);
  lookups++;
  const label = key === 'A' ? 'Alpha' : undefined;
  cache.set(key, label);
  return label;
}

assert.equal(lookupLabel('X'), undefined);
assert.equal(lookupLabel('X'), undefined);
assert.equal(lookups, 1);
assert.equal(lookupLabel('A'), 'Alpha');
assert.equal(lookupLabel('A'), 'Alpha');
assert.equal(lookups, 2);
cache.delete('X');
assert.equal(lookupLabel('X'), undefined);
assert.equal(lookups, 3);

Ở đây lookup chỉ là một nhánh trong RAM. Bộ đếm đo số lần đi qua nhánh cache miss, không đo độ trễ hay số lần gọi API thực. Xóa khóa cho phép tra cứu lại; đó là hành vi khác với cập nhật giá trị của khóa thành undefined.

Khi nào hợp đồng cần rõ hơn?

Nếu không cho phép undefined trong giá trị lưu, việc dùng get và so với undefined có thể đủ. Hãy ghi điều kiện đó trong kiểu hoặc hàm ghi cache để người sửa code sau này không vô tình mở rộng tập giá trị mà quên cập nhật phép đọc.

Một phương án khác là lưu object thể hiện trạng thái, chẳng hạn bản ghi có nhãn hoặc bản ghi đã kiểm tra nhưng chưa có nhãn. Nó dài hơn một chút nhưng có chỗ để ghi thời điểm kiểm tra và nguồn của kết quả. Với cache dùng qua nhiều module, khả năng đọc trạng thái có thể đáng giá hơn một giá trị đặc biệt ngầm định.

Đừng lưu kết quả thiếu mãi nếu dữ liệu nguồn có thể đổi. Bài này chưa có TTL, tải đồng thời hay xử lý lỗi mạng. Nếu đem ví dụ vào tác vụ bất đồng bộ, cần quyết định riêng cách phân biệt lỗi tạm thời với kết quả đã tra cứu và không tồn tại.

Kết luận

Khi get trả undefined, hãy hỏi liệu undefined có được lưu hợp lệ không. Nếu có, dùng has để xác định khóa đã hiện diện, rồi đọc giá trị theo hợp đồng của ứng dụng.

Nguồn tham khảo

  • ECMAScript: Map.prototype.get và Map.prototype.has

Tags: JavaScriptMapPhỏ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

Promise.finally: return giá trị mới có thay kết quả của chuỗi không?

by Suong Nguyen
11/11/2026
0

Kiểm tra ba tình huống Promise.finally: trả giá trị thường, cleanup bất đồng bộ thành công và cleanup ném lỗ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: object mặc định của tham số được tạo khi nào?

by Suong Nguyen
10/11/2026
0

Phân biệt object literal trong default parameter với object dùng chung bên ngoài hàm, rồi kiểm tra thời điểm chạy biểu thức tạo giá trị mặc đị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

Phỏng vấn JavaScript: throw trong async function đi vào catch nào?

by Suong Nguyen
09/11/2026
0

Theo dõi lỗi ném trước await trong async function, bắt rejection đúng chỗ và dùng assert.rejects để kiểm tra hợp đồng lỗ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 regex.test cùng chuỗi lại đổi kết quả?

by Suong Nguyen
08/11/2026
0

Theo dõi lastIndex của regex có cờ g, giải thích lỗi lọc dữ liệu bị bỏ xen kẽ và viết validator không giữ con trỏ tìm kiếm.

Next Post
Minh hoạ style và layout trong React Native với màn hình mobile, spacing và typography

React Native Keyboard.dismiss: đóng bàn phím mà vẫn giữ bản nháp

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 Keyboard.dismiss: đóng bàn phím mà vẫn giữ bản nháp
  • Map.get trả undefined: khóa không tồn tại hay đã lưu giá trị undefined?
  • Handler.removeCallbacks: giữ đúng Runnable để hủy tác vụ chờ

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