วิธีการตรวจสอบว่าวัตถุมีคุณสมบัติที่กำหนดใน JavaScript


311

ฉันจะทราบได้อย่างไรว่าวัตถุxมีคุณสมบัติที่กำหนดไว้yโดยไม่คำนึงถึงมูลค่าx.yหรือไม่

ฉันกำลังใช้

if (typeof(x.y) !== 'undefined')

แต่ดูเหมือนว่าจะเป็น clunky เล็กน้อย มีวิธีที่ดีกว่า?

คำตอบ:


584

วัตถุมีคุณสมบัติ:

หากคุณกำลังทดสอบคุณสมบัติที่อยู่บนวัตถุ (ไม่ใช่ส่วนหนึ่งของห่วงโซ่ต้นแบบ) คุณสามารถใช้.hasOwnProperty():

if (x.hasOwnProperty('y')) { 
  // ......
}

วัตถุหรือต้นแบบมีคุณสมบัติ:

คุณสามารถใช้inโอเปอเรเตอร์เพื่อทดสอบคุณสมบัติที่สืบทอดได้เช่นกัน

if ('y' in x) {
  // ......
}

23
หรือดียิ่งขึ้น - Object.prototype.hasOwnProperty.call(x, 'y')เพื่อให้ทรัพย์สินที่ชื่อ "hasOwnProperty" จะไม่ขัดแย้งกับกระบวนการตรวจสอบ;)
kangax

4
หรือแม้กระทั่งสั้น {}.hasOwnProperty.call(x, 'y')-
axmrnv


78

หากคุณต้องการทราบว่าวัตถุมีคำตอบของคุณสมบัติ@ 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

18

Underscore.js หรือ Lodash

if (_.has(x, "y")) ...

:)


Nope Object.prototype.hasOwnProperty.call(x, "y")มันเป็นเพียงนามแฝงสำหรับ สำหรับอาร์เรย์ฉันคิดว่าคุณอาจต้องการArray.prototype.indexOf, _.indexOfหรือ_.contains
nackjicholson

13

คุณสามารถตัดมันออกมาแบบนี้:

if ( x.y !== undefined ) ...

15
ที่จะล้มเหลวด้วยx = {y:undefined}
James

20
ทุกคนจำเป็นต้องแยกแยะระหว่าง "ไม่ได้กำหนด" และ "กำหนดให้ไม่ได้กำหนดหรือไม่
jpsimons

16
@darkporter ฉันทำบางครั้ง;)
mmm

6

คุณสมบัติหนึ่งของรหัสต้นฉบับของฉัน

if ( typeof(x.y) != 'undefined' ) ...

ที่อาจมีประโยชน์ในบางสถานการณ์ก็คือปลอดภัยที่จะใช้ไม่ว่าจะxมีอยู่จริงหรือไม่ ด้วยวิธีใดวิธีหนึ่งในคำตอบของคนแคระคุณควรทดสอบก่อนxหากมีข้อสงสัยหากมีอยู่

ดังนั้นบางทีทั้งสามวิธีมีสถานที่ในกระเป๋าของเทคนิค


คุณสามารถใช้(x && x.hasOwnProperty('y'))หรือ(x && 'y' in x)
แคระ

ฉันเห็นด้วยว่าการทดสอบสำหรับ x ควรเป็นกรณีแยกต่างหากสำหรับตัวของมันเอง ยังให้การรายงานข้อผิดพลาดที่ดีขึ้น
b01

ที่ล้มเหลวสำหรับฉัน ถ้า x ไม่ได้นิยามดังนั้น typeof (xy) จะส่งกลับค่าReferenceErrorไม่ใช่สตริง 'undefined'
Craig

1

เนื่องจากคำถามเกี่ยวกับ 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

-2

ทำไมไม่ง่าย ๆ :

if (typeof myObject.myProperty == "undefined") alert("myProperty is not defined!");

หรือหากคุณคาดว่าจะเป็นประเภทเฉพาะ:

if (typeof myObject.myProperty != "string") alert("myProperty has wrong type or does not exist!");

1
เพราะมันอ่านไม่ดีและไม่พิมพ์เข้มงวด ฉันต้องถามคุณ: ทำไมไม่ง่าย ๆx.hasOwnProperty('y')?
Fabian Picone
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.