ฉันจะทราบได้อย่างไรว่าวัตถุ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" จะไม่ขัดแย้งกับกระบวนการตรวจสอบ;)