javascriptOwn properties and Object.hasOwn()وجود ویژگی شیء در جاوااسکریپت
وجود ویژگی در جاوااسکریپت را با Object.hasOwn بررسی کنید؛ تفاوت ویژگی ناموجود، مقدار undefined، عملگر in و حذف با delete را با مثال ببینید.
مفهوم به زبان ساده
فرض کنید شمارهٔ تماس کاربر اختیاری است. اینکه مقدار یک ویژگی undefined باشد، همیشه نشان نمیدهد آن ویژگی اصلاً روی شیء تعریف نشده است. میتوان ویژگی را عمداً با همان مقدار تعریف کرد. Object.hasOwn برای پرسش دقیقتری است: آیا این ویژگی متعلق به خود همین شیء است؟ مقدار ویژگی، حتی null یا undefined، پاسخ وجود آن را عوض نمیکند.
در نمونه، email مقدار undefined دارد؛ phone تعریف نشده است. ویژگی toString نیز معمولاً از مسیر وراثت شیء قابل دسترسی است، ولی ویژگی خود این شیء نیست. عملگر in در مسیر ویژگیهای بهارثرسیده هم جستوجو میکند؛ بنابراین پاسخ آن با hasOwn یکسان نیست. برای خواندن دادهٔ ورودی، این تفاوت میتواند در تعیین فیلدهای واقعاً ارسالشده مهم باشد.
delete در مثال، ویژگی email را از خود شیء حذف میکند؛ اختصاصدادن undefined به آن دقیقاً همین کار را انجام نمیدهد. پس از حذف، hasOwn نادرست میشود. برای تمرین، مقدار email را null بگذارید و پیش از اجرا نتیجه را حدس بزنید. وجود ویژگی بهتنهایی مجازبودن نوع یا مقدار آن را تضمین نمیکند؛ پس بررسی قرارداد داده پس از بررسی وجود همچنان لازم است. این مدخل فقط یک شیء معمولی را بررسی میکند.
کجا به کار میآید؟
- تفکیک فیلد ارسالنشده از فیلدی با مقدار خالی یا undefined
- پیمایش امنتر داده وقتی فقط ویژگیهای خود شیء مورد نظرند
از تعریف تا یک مثال واقعی
const user = { name: 'Mina', email: undefined };
console.log(Object.hasOwn(user, 'email'));
console.log(user.email === undefined);
console.log(Object.hasOwn(user, 'phone'));
console.log('toString' in user);
console.log(Object.hasOwn(user, 'toString'));
delete user.email;
console.log(Object.hasOwn(user, 'email'));
true true false true false false
این مثال چطور کار میکند؟
email روی شیء تعریف شده است، هرچند مقدار آن undefined است.
phone وجود ندارد؛ toString از مسیر وراثت پیدا میشود و ویژگی خود شیء نیست.
delete ویژگی email را حذف میکند و بررسی پایانی false میشود.
اشتباه رایج
مقایسهٔ obj.key با undefined، وجود یا مالکیت ویژگی را اثبات نمیکند. همچنین in میتواند برای ویژگی بهارثرسیده true بدهد.
این را به خاطر بسپارید
«وجود دارد»، «متعلق به خود شیء است» و «مقدار معتبر دارد» سه پرسش متفاوتاند.