ฉันจะทราบได้อย่างไรว่าวัตถุx
มีคุณสมบัติที่กำหนดไว้y
โดยไม่คำนึงถึงมูลค่าx.y
หรือไม่
ฉันกำลังใช้
if (typeof(x.y) !== 'undefined')
แต่ดูเหมือนว่าจะเป็น clunky เล็กน้อย มีวิธีที่ดีกว่า?
ฉันจะทราบได้อย่างไรว่าวัตถุx
มีคุณสมบัติที่กำหนดไว้y
โดยไม่คำนึงถึงมูลค่าx.y
หรือไม่
ฉันกำลังใช้
if (typeof(x.y) !== 'undefined')
แต่ดูเหมือนว่าจะเป็น clunky เล็กน้อย มีวิธีที่ดีกว่า?
คำตอบ:
หากคุณกำลังทดสอบคุณสมบัติที่อยู่บนวัตถุ (ไม่ใช่ส่วนหนึ่งของห่วงโซ่ต้นแบบ) คุณสามารถใช้.hasOwnProperty()
:
if (x.hasOwnProperty('y')) {
// ......
}
คุณสามารถใช้in
โอเปอเรเตอร์เพื่อทดสอบคุณสมบัติที่สืบทอดได้เช่นกัน
if ('y' in x) {
// ......
}
{}.hasOwnProperty.call(x, 'y')
-
หากคุณต้องการทราบว่าวัตถุมีคำตอบของคุณสมบัติ@ gnarf ทางกายภาพหรือไม่จะใช้งานได้หรือไม่hasOwnProperty
หากคุณต้องการทราบว่ามีสถานที่ให้บริการอยู่ทุกที่ไม่ว่าจะเป็นบนวัตถุหรือในโซ่ต้นแบบคุณสามารถใช้in
โอเปอเรเตอร์ได้
if ('prop' in obj) {
// ...
}
เช่น.:
var obj = {};
'toString' in obj == true; // inherited from Object.prototype
obj.hasOwnProperty('toString') == false; // doesn't contains it physically
Underscore.js หรือ Lodash
if (_.has(x, "y")) ...
:)
Object.prototype.hasOwnProperty.call(x, "y")
มันเป็นเพียงนามแฝงสำหรับ สำหรับอาร์เรย์ฉันคิดว่าคุณอาจต้องการArray.prototype.indexOf
, _.indexOf
หรือ_.contains
คุณสมบัติหนึ่งของรหัสต้นฉบับของฉัน
if ( typeof(x.y) != 'undefined' ) ...
ที่อาจมีประโยชน์ในบางสถานการณ์ก็คือปลอดภัยที่จะใช้ไม่ว่าจะx
มีอยู่จริงหรือไม่ ด้วยวิธีใดวิธีหนึ่งในคำตอบของคนแคระคุณควรทดสอบก่อนx
หากมีข้อสงสัยหากมีอยู่
ดังนั้นบางทีทั้งสามวิธีมีสถานที่ในกระเป๋าของเทคนิค
(x && x.hasOwnProperty('y'))
หรือ(x && 'y' in x)
ReferenceError
ไม่ใช่สตริง 'undefined'
เนื่องจากคำถามเกี่ยวกับ clunkiness ของการตรวจสอบคุณสมบัติและหนึ่ง usecase ปกติสำหรับการตรวจสอบของวัตถุตัวเลือกการโต้แย้งฟังก์ชั่นคิดว่าฉันพูดถึงวิธีสั้น ๆ ห้องสมุดฟรีของการทดสอบการมีอยู่ของคุณสมบัติหลาย ๆ คำเตือน: มันต้องใช้ ECMAScript 5 (แต่ IMO ทุกคนที่ยังใช้ IE8 สมควรได้รับเว็บที่เสียหาย)
function f(opts) {
if(!["req1","req2"].every(opts.hasOwnProperty, opts)) {
throw new Error("IllegalArgumentException");
}
alert("ok");
}
f({req1: 123}); // error
f({req1: 123, req2: 456}); // ok
ทำไมไม่ง่าย ๆ :
if (typeof myObject.myProperty == "undefined") alert("myProperty is not defined!");
หรือหากคุณคาดว่าจะเป็นประเภทเฉพาะ:
if (typeof myObject.myProperty != "string") alert("myProperty has wrong type or does not exist!");
x.hasOwnProperty('y')
?
Object.prototype.hasOwnProperty.call(x, 'y')
เพื่อให้ทรัพย์สินที่ชื่อ "hasOwnProperty" จะไม่ขัดแย้งกับกระบวนการตรวจสอบ;)