यह कैसे जांचा जाए कि क्या ऑब्जेक्ट प्रॉपर्टी नाम के वैरिएबल के साथ मौजूद है?


680

मैं एक गुण संपत्ति के अस्तित्व के लिए जाँच कर रहा हूं, जिसमें एक चर संपत्ति का नाम है।

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
संभवतया उपयोगी: NCZOnline में पाब्लो कैबरेरा की एक टिप्पणी से : "मुझे लगता है कि यह ध्यान देने योग्य है कि यदि यह hasOwnPropertyविधि अधिलेखित है, तो आप इस पर भरोसा कर सकते हैं Object.prototype.hasOwnProperty.call(object, property)।"
HumanInDisguise

10
क्या stackoverflow.com/questions/4244896/… इस प्रश्न का एक डुप्लिकेट है? यह कैसा है? 'अस्तित्व की जाँच' और 'पहुँच मूल्य' अलग-अलग चीजें हैं? कृपया मुझे सही करें अगर मैं गलत हूँ ....
adnan2nd

यह कोई डुप्लिकेट नहीं है।
जेफ क्लेटन

जवाबों:


1307
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](अन्य उत्तरों से) बेहतर है क्योंकि यह काम करता है भले ही का मान myProp0 है
मैट आर

9
"ऑपरेटर" ऑपरेटर स्ट्रिंग्स के साथ काम नहीं करता है। उदाहरण के लिए 'क़क़्क़' में 'लंबाई' एक अपवाद उत्पन्न करेगी। इसलिए यदि आप एक सामान्य उद्देश्य की जाँच करना चाहते हैं तो आपको hasOwnProperty का उपयोग करना होगा।
याकूब

1
@ जैकब का क्या मतलब है जब आप कहते हैं कि "द" इन "ऑपरेटर स्ट्रिंग्स के साथ काम नहीं करता है"? "इन" ऑपरेटर के साथ बाईं अभिव्यक्ति में एक स्ट्रिंग या मान होना चाहिए जो एक स्ट्रिंग में परिवर्तित हो सकता है। हां, आप 'क़क़्क़ी' में 'लंबाई' नहीं लिख सकते हैं, लेकिन आप 'क़क़्क़'.ओसऑनप्रोपरेट्टी (' लंबाई ') या तो नहीं लिख सकते हैं
वचबर्न

2
@Wachburn: 'qqq'.hasOwnProperty('length')है true, आप ऐसा कर सकते हैं।
रॉकेट हज़मत

1
@ gaurav5430 मुझे विश्वास है कि मैं जो उल्लेख कर रहा हूं वह यह है कि अगर myProp0 है, तो यदि कथन ऐसा लगेगा, if (myObj[0])जिसमें यदि myObjकोई गुण है, तो एक्सप्रेस का मूल्यांकन होगा true। और myObj[0]वह संपत्ति नहीं हो सकती है जिसे आप ढूंढ रहे हैं।
मैट आर

51

आप 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 के मान का संदर्भ नहीं दे रहे हैं, बल्कि आप 'myProp' की एक नई स्ट्रिंग () की घोषणा कर रहे हैं और myObj में 'myProp' की ऐसी कोई संपत्ति नहीं है।
ट्राइंफस्ट

1
ट्रम्पस्ट: एमडीएन से ऊपर, "प्रोप - एक स्ट्रिंग या प्रतीक एक संपत्ति का नाम या सरणी सूचकांक (गैर-प्रतीकों को तार के लिए मजबूर किया जाएगा) का प्रतिनिधित्व करता है।"
बेन क्रेसी

यह सही है। यदि आप एक चर का उपयोग नहीं करना चाहते हैं, लेकिन अगर कोई विशिष्ट 'myProp' मौजूद है, तो आपको उद्धरण चिह्नों की आवश्यकता है।
कटिंका हेसेलिंक

@KatinkaHesselink: आपकी टिप्पणी भ्रामक है। सवाल यह था कि "यह कैसे जांचा जाए कि क्या ऑब्जेक्ट प्रॉपर्टी नाम के वैरिएबल के साथ मौजूद है?"
हर्बर्ट वान-व्लिएट

26

हर किसी की सहायता के लिए धन्यवाद और स्पष्ट बयान से छुटकारा पाने के लिए धक्का। चर कोष्ठक में होना आवश्यक है, डॉट नोटेशन में नहीं। यह काम करता है और साफ, उचित कोड है।

इनमें से प्रत्येक चर हैं: appChoice, underI, underObstr।

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

यह मेरे लिए एक समस्या की तरह लग रहा है। यदि tData.tonicdata[appChoice]ऐसा मान जिसके परिणामस्वरूप कोई गुण / अनुक्रमणिका मेल नहीं खाती है underI, तो इसका परिणाम होगा TypeError
यॉट

अपनी प्रारंभिक पोस्ट के साथ आपके इरादों के बावजूद, आपने वास्तव में एक अलग सवाल पूछा था जिसके लिए आपने यह उत्तर प्रदान किया था। आप एक संपत्ति के अस्तित्व की जांच करना चाहते थे, आप इसे कैसे एक्सेस करें, इसके बारे में कुछ भी उल्लेख नहीं करते हैं। जिससे यह उत्तर वास्तविक प्रश्न से असंबंधित हो जाता है।
फोरेज

19

खुद की संपत्ति के लिए:

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

नोट: Object.prototype.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

ऑपरेटर में खोज उपयोग में विरासत में मिली संपत्तियों को शामिल करने के लिए : (लेकिन आपको 'में' के दाईं ओर एक ऑब्जेक्ट रखना होगा, आदिम मान त्रुटि को फेंक देगा, जैसे 'घर' में 'लंबाई' त्रुटि फेंक देगी, लेकिन 'लंबाई' नए स्ट्रिंग में ('घर') नहीं होगा

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/Oeators/in

नोट: एक को टाइपोफ़ और [] संपत्ति एक्सेसर का उपयोग निम्नलिखित कोड के रूप में किया जा सकता है जो हमेशा काम नहीं करता है ...

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

एमडीएन वेब डॉक्स से संदर्भ - Object.prototype.hasOwnProperty ()


4
यदि आप जावास्क्रिप्ट को शामिल कर रहे हैं जो ओवरराइड की तरह कुछ बुराई कर सकता है, तो hasOwnPropertyइस तरह की कोई भी गार्ड आपके कोड को सुरक्षित या सुरक्षित नहीं बनाएगी।
meustrus

@meustrus मुझे पता है कि आप कहाँ से आ रहे हैं, लेकिन व्यावसायिक दृष्टिकोण से यह प्राप्त करना बहुत संभव है कि एक अनुभवहीन डेवलपर इस संपत्ति के नाम का उपयोग करेगा, जो जरूरी नहीं कि उनका मतलब जानबूझकर कुछ बुराई कर रहे हैं।
स्कीमास्क

4

आप ऑपरेटर के hasOwnProperty()रूप में भी उपयोग कर सकते हैं in


यह सब ^ क्यों मुझे जावास्क्रिप्ट से नफरत है
पानी

1
@pwaterz
ArchNoob

Haha, इसे प्यार करता हूँ :)
pwaterz
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.