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
Minh họa kiến trúc backend API gọn gàng cho sản phẩm nhỏ

Object.hasOwn và in: chọn theo thuộc tính riêng hay cả prototype

Suong Nguyen by Suong Nguyen
02/11/2026
in Đánh giá
0
585
SHARES
3.2k
VIEWS
Summarize with ChatGPTShare to Facebook

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.

Nguồn tham khảo

  • MDN: Object.hasOwn
  • MDN: toán tử in
  • MDN: hasOwnProperty và các trường hợp method không tồn tại

Tags: Đánh giáJavaScriptObject
SummarizeShare234
Suong Nguyen

Suong Nguyen

Related Stories

Minh họa kiến trúc backend API gọn gàng cho sản phẩm nhỏ

Array.find và filter: chọn theo một hay nhiều kết quả

by Suong Nguyen
01/11/2026
0

So sánh kiểu kết quả, xử lý không tìm thấy và số lần gọi predicate để chọn find hoặc filter đúng nhu cầu.

Minh họa kiến trúc backend API gọn gàng cho sản phẩm nhỏ

String.length và Buffer.byteLength: chọn phép đo cho UTF‑8

by Suong Nguyen
31/10/2026
0

So sánh độ dài chuỗi và số byte UTF‑8 bằng ví dụ tiếng Việt, emoji và JSON để chọn đúng đơn vị giới hạn.

Minh họa kiến trúc backend API gọn gàng cho sản phẩm nhỏ

Date.now hay performance.now: chọn đồng hồ để ghi thời điểm và đo thời lượng

by Suong Nguyen
30/10/2026
0

So sánh mốc thời gian, tính đơn điệu và phạm vi sử dụng để tránh dùng timestamp như một phép đo thời lượng đáng tin cậy.

Minh họa kiến trúc backend API gọn gàng cho sản phẩm nhỏ

Object.groupBy hay Map.groupBy: chọn theo kiểu khóa của nhóm

by Suong Nguyen
29/10/2026
0

So sánh hai API groupBy qua khóa string, khóa object và dữ liệu dùng chung để chọn đúng đầu ra cho ứng dụng.

Next Post
Minh họa pipeline CI/CD từ commit đến deploy cho team nhỏ

GitHub Actions timeout-minutes: đặt giới hạn cho cả job và từng step

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 onLayout: đo vùng card thay vì lấy chiều rộng cửa sổ
  • Object.freeze chỉ đóng băng nông: giải thích bằng assertion
  • Android getString: dùng placeholder có thứ tự để dịch nguyên câu

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