Một payload có key nhưng giá trị undefined khác với một object không có key đó. Một key được kế thừa cũng khác key được khai báo ngay trên object. Nếu chỉ viết if (input[key]), cả ba câu hỏi dễ bị trộn vào một phép kiểm tra truthiness.
Bài này đánh giá ba cách kiểm tra sự hiện diện theo cùng tiêu chí: phạm vi tìm kiếm, dữ liệu biên, độ rõ khi review và yêu cầu runtime. Các snippet được chạy bằng Node.js 24.18.1; tài liệu MDN được đọc ngày 02/11/2026. Đây là kiểm tra hành vi, không phải benchmark tốc độ hay đánh giá toàn bộ cơ chế bảo vệ payload.
Chạy cùng một fixture trước
Lưu đoạn dưới thành presence.cjs, chạy node presence.cjs:
const assert = require('node:assert/strict');
const defaults = { theme: 'light' };
const input = Object.create(defaults);
input.limit = 0;
input.note = undefined;
assert.equal('theme' in input, true);
assert.equal(Object.hasOwn(input, 'theme'), false);
assert.equal(Object.hasOwn(input, 'limit'), true);
assert.equal(Object.hasOwn(input, 'note'), true);
assert.equal(Object.hasOwn(input, 'missing'), false);
assert.equal(Boolean(input.limit), false);
assert.equal(input.note, input.missing);
console.log('presence cases passed');
Kết quả đã kiểm tra là tất cả assertion đều qua. Đọc hai giá trị cuối cùng đều nhận undefined, nhưng chỉ note là thuộc tính riêng. Giá trị 0 cũng có mặt dù chuyển sang Boolean cho false. Vì vậy, hãy viết rõ yêu cầu kiểm tra key hay yêu cầu kiểm tra giá trị.
Cùng tiêu chí, kết quả khác nhau
Về phạm vi, in tìm cả thuộc tính riêng và chuỗi prototype. Nó phù hợp khi bạn chủ ý hỏi một object có thể cung cấp thuộc tính ấy qua kế thừa hay không. Object.hasOwn chỉ hỏi thuộc tính riêng, nên dễ đọc khi phân tích các trường được gửi trong một object dữ liệu.
hasOwnProperty cũng có phạm vi thuộc tính riêng. Khác biệt thực dụng nằm ở cách gọi: input.hasOwnProperty(...) phụ thuộc method lấy từ chính object đầu vào. Dữ liệu có thể dùng tên key đó, hoặc object không có prototype nên không có method để gọi.
Về hệ sinh thái và chi phí vận hành, cả ba đều là cơ chế JavaScript sẵn có, không cần package. Tuy nhiên, runtime cũ có thể chưa hỗ trợ Object.hasOwn; kiểm tra runtime thực tế của dự án. Với trường hợp cần tương thích, cách gọi Object.prototype.hasOwnProperty.call(input, key) thể hiện cùng mục đích nhưng dài hơn. Không suy từ độ ngắn cú pháp rằng nó nhanh hơn trong workload của bạn.
Thử object không có prototype và method bị che
Chạy snippet độc lập sau bằng cùng Node:
const assert = require('node:assert/strict');
const dictionary = Object.create(null);
dictionary.answer = null;
assert.equal(Object.hasOwn(dictionary, 'answer'), true);
assert.equal(dictionary.hasOwnProperty, undefined);
const payload = { hasOwnProperty: false, answer: 42 };
assert.equal(Object.hasOwn(payload, 'answer'), true);
assert.equal(Object.prototype.hasOwnProperty.call(payload, 'answer'), true);
assert.throws(() => payload.hasOwnProperty('answer'), TypeError);
console.log('dictionary and shadow cases passed');
Các assertion đã chạy qua. Trường hợp này cho thấy lợi ích về quyền kiểm soát cách gọi của hàm static, thay vì dựa vào method lấy từ object đang kiểm tra. Nó không tự kiểm tra answer là số hữu hạn, đúng schema hay được phép cập nhật.
Tách kiểm tra cấu trúc khỏi validation
Ví dụ một form cập nhật giới hạn: trường vắng có thể nghĩa là giữ giá trị hiện tại, còn trường bằng 0 có thể là yêu cầu hợp lệ. Kiểm tra own key trước, rồi mới kiểm tra kiểu và miền giá trị theo nghiệp vụ. Với dữ liệu null hoặc kiểu nguyên thủy không thuộc hợp đồng, hãy xử lý ở bước nhận đầu vào; đừng dựa vào hành vi ép kiểu của từng toán tử để định nghĩa schema.
in không phải phép tìm một giá trị trong mảng. Câu hỏi “có index này không” khác “có phần tử bằng giá trị này không”. Tương tự, không cần thay mọi chỗ dùng in bằng hasOwn: một đoạn code xử lý object có kế thừa chủ ý có thể đang cần chính phạm vi của in.
Khi review, đọc câu hỏi trước rồi chọn phép kiểm tra. Nếu yêu cầu là “payload tự khai báo trường này”, Object.hasOwn nói rõ mục đích. Nếu yêu cầu bao gồm prototype, giữ in và ghi nhận lý do; chưa có số đo nào trong bài để xếp hạng hiệu năng giữa hai cách.


