มีโอเปอเรเตอร์“ ไม่ได้อยู่ใน” ใน JavaScript เพื่อตรวจสอบคุณสมบัติของวัตถุหรือไม่?


183

มีตัวดำเนินการ "ไม่อยู่" ใน JavaScript เพื่อตรวจสอบว่าคุณสมบัติไม่มีอยู่ในวัตถุหรือไม่? ฉันไม่พบอะไรเกี่ยวกับสิ่งนี้รอบ ๆ Google หรือ Stack Overflow นี่คือตัวอย่างของรหัสขนาดเล็กที่ฉันกำลังทำงานในที่ที่ฉันต้องการฟังก์ชั่นประเภทนี้:

var tutorTimes = {};

$(checked).each(function(idx){
  id = $(this).attr('class');

  if(id in tutorTimes){}
  else{
    //Rest of my logic will go here
  }
});

อย่างที่คุณเห็นฉันจะใส่ทุกอย่างลงในelseคำสั่ง ดูเหมือนว่าฉันผิดที่จะตั้งค่าคำสั่งif- elseเพื่อใช้elseส่วนนั้น


4
ฉันคิดว่าคุณอาจต้องการvar id = ...ฟังก์ชั่นของคุณ
Cobby

คำตอบ:


338

ดูเหมือนว่าฉันจะตั้งค่าคำสั่ง if / else เพียงเพื่อใช้ส่วนอื่น ...

เพียงคัดค้านสภาพของคุณและคุณจะได้รับelseตรรกะภายในif:

if (!(id in tutorTimes)) { ... }

11
สไตล์นี้ยังแก้ไขคำเตือน "การใช้"! "ที่สับสนของ JSHint คุณจะได้รับถ้าคุณทำ( ! somekey in someobj )
mikemaccana

3
โปรดทราบว่าในการค้นหาชื่อทรัพย์สินที่ใดก็ได้ในห่วงโซ่ต้นแบบ ดูคำตอบของฉันสำหรับรายละเอียดเพิ่มเติม
บาง

25
ฉันเข้าใจว่านี่เป็นทางออกที่ดีที่สุดในขณะนี้ แต่มีคนอื่นเห็นด้วยว่านี่ช่างน่าเกลียดใช่ไหม?
Jonah

3
ถ้ามันน่าเกลียดเพียงแค่ห่อมันในฟังก์ชั่นและตั้งชื่อให้สวยงาม🙃let keyExists = (key, obj) => key in obj
Kamafeather

ฉันเห็นด้วยอย่างยิ่ง แน่นอนว่าทักษะการตั้งชื่อของฉันก็สามารถปรับปรุงได้เช่นกัน😁 let hasProperty"ดู" ดีกว่า
Kamafeather

37

อย่างที่พูดไว้แล้วโดยJordãoเพียงคัดค้าน:

if (!(id in tutorTimes)) { ... }

หมายเหตุ: การทดสอบด้านบนว่า tutorTimes มีคุณสมบัติพร้อมชื่อที่ระบุใน id ไม่ว่าที่ใดในห่วงโซ่ต้นแบบ ตัวอย่างเช่น"valueOf" in tutorTimesผลตอบแทนที่แท้จริงเพราะมันถูกกำหนดไว้ในObject.prototype

หากคุณต้องการทดสอบว่าไม่มีคุณสมบัติในวัตถุปัจจุบันหรือไม่ให้ใช้ hasOwnProperty:

if (!tutorTimes.hasOwnProperty(id)) { ... }

หรือถ้าคุณอาจมีรหัสที่เป็นของตัวเองคุณสามารถใช้สิ่งนี้:

if (!Object.prototype.hasOwnProperty.call(tutorTimes,id)) { ... }

มันเป็นเรื่องใด ๆที่ปลอดภัยในการห่อสำคัญในคำพูดและการใช้งานif(!tutorTimes.hasOwnProperty('id')) ...?
Majid Fouladpour

@MajidFouladpour idเป็นตัวแปรที่อาจมีค่าใด ๆ'id'เป็นสตริงที่มีตัวอักษรสองตัวiและdดังนั้นhasOwnProperty(id)ตรวจสอบว่าคุณสมบัติที่ระบุในidตัวแปรมีอยู่และhasOwnProperty('id')ตรวจสอบว่ามีคุณสมบัติชื่อ id
บาง


14

ความเป็นไปได้สองทางที่รวดเร็ว:

if(!('foo' in myObj)) { ... }

หรือ

if(myObj['foo'] === undefined) { ... }

5
ใช้'undefined' === typeof xxxแทน undefinedไม่ได้เป็นคำสงวนและเป็นจริงตัวแปรทั่วโลกที่สามารถเขียนทับ (นำไปสู่การยากที่จะหาข้อบกพร่อง)
hugomg

9
@hippietrail ไม่ทำงาน ... ต้องใช้ parens หลังจาก "!" และรอบ ๆ'foo' in myObj)
Phil Cooper

4
myObj['foo']อาจมีอยู่เป็นคุณสมบัติและเพียงตั้งค่าเป็นundefined(เช่นด้วยคำสั่งmyObj.foo = undefined) ถ้าคุณต้องการที่จะดูว่าคุณสมบัติตัวเองไม่ได้อยู่คุณจำเป็นต้องมี!('foo' in myObj)สัญกรณ์
Richard Connamacher

สำหรับผลการดำเนินงานที่ใส่ใจในหมู่พวกเราตรวจสอบmyObj.foo === undefinedเป็นได้เร็วขึ้นมาก (แม้ว่าอาจเป็นอันตราย): jsperf.com/not-in-vs-is-undefined
etpinard

@hugomg === undefinedฉันไม่คิดว่าเป็นข้อโต้แย้งที่ดีมากสำหรับไม่ได้ใช้ มีหลายสิ่งที่อาจผิดพลาดได้หากผู้คนละเมิดภาษาโปรแกรมโดยการทำสิ่งต่าง ๆ เช่นเขียนทับundefinedใน JavaScript นอกจากนี้โปรดดู: stackoverflow.com/questions/8783510/…
Zero3
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.