यह कैसे निर्धारित किया जाए कि किसी ऑब्जेक्ट की जावास्क्रिप्ट में दी गई संपत्ति है या नहीं


311

मैं यह कैसे निर्धारित कर सकता हूं कि किसी वस्तु xकी परिभाषित संपत्ति है या नहीं y, मूल्य की परवाह किए बिना x.y?

मैं वर्तमान में उपयोग कर रहा हूं

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

लेकिन यह थोड़ा भद्दा लगता है। क्या कोई बेहतर तरीका है?

जवाबों:


584

ऑब्जेक्ट में गुण है:

यदि आप उन गुणों के लिए परीक्षण कर रहे हैं जो स्वयं ऑब्जेक्ट पर हैं (इसकी प्रोटोटाइप श्रृंखला का एक हिस्सा नहीं) तो आप उपयोग कर सकते हैं .hasOwnProperty():

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

ऑब्जेक्ट या उसके प्रोटोटाइप में एक गुण होता है:

आप inऑपरेटर को उन संपत्तियों के परीक्षण के लिए उपयोग कर सकते हैं जो विरासत में मिली हैं।

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

23
या इससे भी बेहतर - Object.prototype.hasOwnProperty.call(x, 'y')तो, "हैसोवनप्रॉपर्टी" नाम की संपत्ति निरीक्षण प्रक्रिया के साथ संघर्ष नहीं करेगी;)
kangax 14

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

अंडरस्कोर.जेएस या लॉडश

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

:)


नहीं। यह सिर्फ एक उपनाम है Object.prototype.hasOwnProperty.call(x, "y")। सरणियों के लिए मुझे लगता है कि आप चाहते हो सकता है Array.prototype.indexOf, _.indexOfया_.contains
nackjicholson

13

आप इसे कुछ इस तरह से ट्रिम कर सकते हैं:

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

15
यह साथ विफल होगाx = {y:undefined}
जेम्स

20
क्या किसी को "परिभाषित नहीं" और "अपरिभाषित परिभाषित" के बीच अंतर करने की आवश्यकता है?
jpsimons

16
@ डॉकटर मैं कभी-कभी करता हूं;)
mmm

6

मेरे मूल कोड की एक विशेषता

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

यह कुछ स्थितियों में उपयोगी हो सकता है कि यह xमौजूद है या नहीं इसका उपयोग करना सुरक्षित है । गर्नफ के जवाब में किसी भी तरीके के साथ, किसी को पहले यह पता होना चाहिए xकि क्या मौजूद है या नहीं।

तो शायद सभी तीन तरीकों में से एक चाल के बैग में एक जगह है।


आप हमेशा इस्तेमाल (x && x.hasOwnProperty('y'))कर सकते हैं या(x && 'y' in x)
gnff

मैं मानता हूं, x के लिए परीक्षण अपने आप में एक अलग मामला होना चाहिए। साथ ही बेहतर एरर रिपोर्टिंग देता है।
14:01

जो मेरे लिए असफल रहा। यदि x अपरिभाषित है तो टाइपोफ़ (xy) ReferenceErrorस्ट्रिंग 'अपरिभाषित' के बजाय देता है
क्रेग

1

चूंकि प्रश्न संपत्ति की जाँच की अव्यवस्था के बारे में था, और इसके लिए एक नियमित रूप से उपयोग किया जाता था जो कि फ़ंक्शन तर्क विकल्प ऑब्जेक्ट्स के सत्यापन के रूप में था, मैंने सोचा कि मैं कई गुणों के अस्तित्व के परीक्षण के एक पुस्तकालय-मुक्त लघु मार्ग का उल्लेख करूंगा। डिस्क्लेमर: इसके लिए ECMAScript 5 की आवश्यकता होती है (लेकिन IM8 का उपयोग करके कोई भी 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')?
फेबियन पॉनिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.