วิธีการตรวจสอบว่าคุณสมบัติของวัตถุที่มีอยู่กับตัวแปรถือชื่อทรัพย์สินหรือไม่


681

ฉันกำลังตรวจสอบการมีอยู่ของคุณสมบัติวัตถุที่มีตัวแปรถือชื่อคุณสมบัติที่เป็นปัญหา

var myObj;
myObj.prop = "exists";
var myProp = "p"+"r"+"o"+"p";

if(myObj.myProp){
    alert("yes, i have that property");
};

นี่เป็นundefinedเพราะมันกำลังมองหาmyObj.myPropแต่ฉันต้องการที่จะตรวจสอบmyObj.prop


2
อาจเป็นประโยชน์: จากความคิดเห็นของ Pablo Cabrera ที่NCZOnline : "ฉันคิดว่ามันควรค่าที่จะทราบว่าหากhasOwnPropertyวิธีการเขียนทับคุณสามารถพึ่งพาObject.prototype.hasOwnProperty.call(object, property)ได้"
HumanInDisguise

10
เป็นstackoverflow.com/questions/4244896/...ซ้ำกับคำถามนี้ มันเป็นอย่างไร 'การตรวจสอบการมีอยู่' และ 'การเข้าถึงคุณค่า' นั้นต่างกันไหม โปรดแก้ไขฉันหากฉันผิด ....
adnan2nd 10'18

สิ่งนี้ไม่ซ้ำกัน
Jeff Clayton

คำตอบ:


1309
var myProp = 'prop';
if(myObj.hasOwnProperty(myProp)){
    alert("yes, i have that property");
}

หรือ

var myProp = 'prop';
if(myProp in myObj){
    alert("yes, i have that property");
}

หรือ

if('prop' in myObj){
    alert("yes, i have that property");
}

โปรดทราบว่าhasOwnPropertyไม่ได้ตรวจสอบคุณสมบัติได้รับมรดกในขณะที่inไม่ ตัวอย่างเช่น'constructor' in myObjเป็นจริง แต่myObj.hasOwnProperty('constructor')ไม่ใช่


23
hasOwnProperty()จะดีกว่าmyObj[myProp](จากคำตอบอื่น ๆ ) ตามที่ได้ผลแม้ว่าค่าmyPropเป็น 0
Matt R

9
ตัวดำเนินการ "ใน" ไม่ทำงานกับสตริง เช่น 'ความยาว' ใน 'qqq' จะสร้างข้อยกเว้น ดังนั้นหากคุณต้องการตรวจสอบวัตถุประสงค์ทั่วไปคุณต้องใช้ hasOwnProperty
Jacob

1
@Jacob คุณหมายความว่าอย่างไรเมื่อคุณพูดว่า "ตัวดำเนินการ" ใน "ไม่ทำงานกับสตริง" ด้วยตัวดำเนินการ "in" 'นิพจน์ด้านซ้ายจะต้องเป็นสตริงหรือค่าที่สามารถแปลงเป็นสตริงได้ ใช่คุณไม่สามารถเขียน 'ความยาว' ใน 'qqq' แต่คุณไม่สามารถเขียน 'qqq'.hasOwnProperty (' ความยาว ') ได้เช่นกัน
Wachburn

2
@Wachburn: 'qqq'.hasOwnProperty('length')คือtrueคุณสามารถทำได้
Rocket Hazmat

1
@ gaurav5430 ผมเชื่อว่าสิ่งที่ผมหมายถึงคือว่าถ้าmyPropเป็น 0 ถ้าคำสั่งจะมีลักษณะif (myObj[0])ซึ่งถ้าmyObjมีคุณสมบัติใด ๆ expresssion trueจะประเมิน และmyObj[0]อาจไม่ใช่ทรัพย์สินที่คุณกำลังมองหา
Matt R

52

คุณสามารถใช้hasOwnPropertyแต่อ้างอิงจากการอ้างอิงที่คุณต้องการราคาเมื่อใช้วิธีนี้:

if (myObj.hasOwnProperty('myProp')) {
    // do something
}

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty

อีกวิธีคือใช้ในโอเปอเรเตอร์ แต่คุณต้องมีเครื่องหมายคำพูดที่นี่ด้วย:

if ('myProp' in myObj) {
    // do something
}

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/in


6
นั่นไม่ใช่วิธีhasOwnProperty()การปฏิบัติ
ศีล

7
สิ่งนี้ไม่ถูกต้อง ด้วยการใส่เครื่องหมายคำพูดล้อมรอบชื่อ myProp คุณจะไม่อ้างอิงค่าของ myProp อีกต่อไป แต่คุณกำลังประกาศ String ใหม่ () ของ 'myProp' และไม่มีคุณสมบัติดังกล่าวของ 'myProp' ใน myObj
ชัยชนะ

1
TriumpST: จากการเชื่อมโยง MDN ด้านบน "prop - สตริงหรือสัญลักษณ์ที่แสดงชื่อทรัพย์สินหรือดัชนีอาร์เรย์ (ไม่ใช่สัญลักษณ์จะถูกบังคับให้ใช้กับสตริง)"
Ben Creasy

สิ่งนี้ถูกต้อง หากคุณไม่ต้องการใช้ตัวแปร แต่เฉพาะถ้ามี 'myProp' อยู่คุณต้องมีเครื่องหมายอัญประกาศ
Katinka Hesselink

@KatinkaHesselink: ความคิดเห็นของคุณทำให้เข้าใจผิด คำถามคือ "วิธีการตรวจสอบว่าคุณสมบัติของวัตถุที่มีอยู่กับตัวแปรถือชื่อทรัพย์สินหรือไม่"
Herbert Van-Vliet

26

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

แต่ละตัวแปรเหล่านี้คือ appChoice, underI, underObstr

if(typeof tData.tonicdata[appChoice][underI][underObstr] !== "undefined"){
    //enter code here
}

ดูเหมือนว่าเป็นปัญหาสำหรับฉัน หากtData.tonicdata[appChoice]ผลลัพธ์เป็นค่าที่ไม่มีคุณสมบัติ / ดัชนีที่ตรงกับunderIสิ่งนี้จะส่งผลให้เกิดTypeErrorการโยน
Ynot

แม้คุณตั้งใจจะโพสต์ครั้งแรกของคุณ แต่คุณถามคำถามที่แตกต่างจากที่คุณให้คำตอบนี้ คุณต้องการตรวจสอบการมีอยู่ของทรัพย์สินคุณไม่ต้องพูดถึงวิธีการเข้าถึง ซึ่งทำให้คำตอบนี้ไม่เกี่ยวข้องกับคำถามจริง
อาหาร

19

สำหรับทรัพย์สินของตัวเอง:

var loan = { amount: 150 };
if(Object.prototype.hasOwnProperty.call(loan, "amount")) 
{ 
   //will execute
}

หมายเหตุ: การใช้Object.prototype.hasOwnPropertyนั้นดีกว่า loan.hasOwnProperty (.. ) ในกรณีที่กำหนดเอง hasOwnProperty ถูกกำหนดในห่วงโซ่ต้นแบบ (ซึ่งไม่ใช่กรณีที่นี่) เช่น

var foo = {
      hasOwnProperty: function() {
        return false;
      },
      bar: 'Here be dragons'
    };

// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty

ในการรวมคุณสมบัติที่สืบทอดมาในการค้นหาให้ใช้ตัวดำเนินการin : (แต่คุณต้องวางวัตถุที่ด้านขวาของ 'ใน' ค่าดั้งเดิมจะทำให้เกิดข้อผิดพลาดเช่น 'ความยาว' ใน 'บ้าน'จะทำให้เกิดข้อผิดพลาด แต่'ความยาว' ใน String ใหม่ ('home')จะไม่)

const yoshi = { skulk: true };
const hattori = { sneak: true };
const kuma = { creep: true };
if ("skulk" in yoshi) 
    console.log("Yoshi can skulk");

if (!("sneak" in yoshi)) 
    console.log("Yoshi cannot sneak");

if (!("creep" in yoshi)) 
    console.log("Yoshi cannot creep");

Object.setPrototypeOf(yoshi, hattori);

if ("sneak" in yoshi)
    console.log("Yoshi can now sneak");
if (!("creep" in hattori))
    console.log("Hattori cannot creep");

Object.setPrototypeOf(hattori, kuma);

if ("creep" in hattori)
    console.log("Hattori can now creep");
if ("creep" in yoshi)
    console.log("Yoshi can also creep");

// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/in

หมายเหตุ: อาจมีการล่อลวงให้ใช้ typeof และ [] accessor เป็นรหัสต่อไปนี้ซึ่งไม่ทำงานเสมอ ...

var loan = { amount: 150 };

loan.installment = undefined;

if("installment" in loan) // correct
{
    // will execute
}

if(typeof loan["installment"] !== "undefined") // incorrect
{
    // will not execute
}

13

วิธีที่ปลอดภัยกว่ามากในการตรวจสอบว่ามีคุณสมบัติอยู่บนวัตถุหรือไม่ก็คือการใช้วัตถุเปล่าหรือวัตถุต้นแบบในการโทร hasOwnProperty()

var foo = {
  hasOwnProperty: function() {
    return false;
  },
  bar: 'Here be dragons'
};

foo.hasOwnProperty('bar'); // always returns false

// Use another Object's hasOwnProperty and call it with 'this' set to foo
({}).hasOwnProperty.call(foo, 'bar'); // true

// It's also possible to use the hasOwnProperty property from the Object
// prototype for this purpose
Object.prototype.hasOwnProperty.call(foo, 'bar'); // true

การอ้างอิงจากMDN Web Docs - Object.prototype.hasOwnProperty ()


4
หากคุณกำลังรวม JavaScript ที่อาจทำสิ่งชั่วร้ายเช่นการแทนที่hasOwnPropertyไม่มีจำนวนผู้คุมเช่นนี้จะทำให้รหัสของคุณปลอดภัยหรือมั่นคง
meustrus

@ meustrus ฉันรู้ว่าคุณมาจากไหน แต่จากมุมมองทางธุรกิจเป็นไปได้สูงมากที่ผู้พัฒนาที่ไม่มีประสบการณ์จะใช้ชื่อคุณสมบัตินี้ซึ่งไม่ได้แปลว่าพวกเขากำลังทำสิ่งที่ชั่วร้าย
skmasq

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.