क्या ऑब्जेक्ट गुणों की जाँच के लिए जावास्क्रिप्ट में "इन" ऑपरेटर नहीं है?


183

क्या किसी प्रकार की संपत्ति किसी वस्तु में मौजूद नहीं है, यह जांचने के लिए जावास्क्रिप्ट में "ऑपरेटर" नहीं है? मुझे इसके बारे में Google या स्टैक ओवरफ़्लो के बारे में कुछ भी नहीं मिला। यहाँ कोड का एक छोटा सा स्निपेट मैं काम कर रहा हूँ जहाँ मुझे इस तरह की कार्यक्षमता की आवश्यकता है:

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 = ...अपने कार्य में चाहते हो सकता है।
कोबी

जवाबों:


338

यह गलत लगता है कि मैं एक / कुछ बयान सेट करने के लिए सिर्फ दूसरे हिस्से का उपयोग कर सकता हूं ...

बस अपनी स्थिति को नकारें, और आपको elseतर्क अंदर मिलेगा if:

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

11
यह शैली JSHint को "कन्फ्यूज़िंग ( ! somekey in someobj )
यूज़

3
कृपया ध्यान दें कि में संपत्ति के नाम के लिए खोज कहीं भी प्रोटोटाइप श्रृंखला में। अधिक जानकारी के लिए मेरा जवाब देखें।
कुछ

25
मैं समझता हूं कि यह वर्तमान में सबसे अच्छा समाधान है, लेकिन क्या कोई और सहमत है कि यह थोड़े बदसूरत है?
जोनाह

3
यदि यह बदसूरत है, तो बस इसे एक फंक्शन में लपेटें और इसे एक सुंदर नाम दें eatherlet keyExists = (key, obj) => key in obj
कामाफेदर

मैं पूरी तरह सहमत हूँ। वास्तव में मेरे नामकरण कौशल में भी सुधार किया जा सकता है could। let hasProperty"दिखता है" बेहतर
कामाफेदर

37

जैसा कि पहले से ही जोर्डो ने कहा, बस इसे नकार दें:

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

नोट: उपरोक्त परीक्षा अगर ट्यूटरटाइम्स के पास आईडी में निर्दिष्ट नाम के साथ एक संपत्ति है, तो प्रोटोटाइप श्रृंखला में कहीं भी । उदाहरण के लिए "valueOf" in tutorTimesदेता है सच है क्योंकि यह में परिभाषित किया गया है Object.prototype

यदि आप परीक्षण करना चाहते हैं कि क्या कोई संपत्ति वर्तमान वस्तु में मौजूद नहीं है, तो hasOwnProperty का उपयोग करें:

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

या यदि आपके पास एक कुंजी है जो hasOwnPropery है तो आप इसका उपयोग कर सकते हैं:

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

क्या यह उद्धरण और उपयोग में कुंजी को लपेटने के लिए सुरक्षित है if(!tutorTimes.hasOwnProperty('id')) ...?
माजिद फौलादपुर

@MajidFouladpour idएक वैरिएबल है जिसका कोई भी मूल्य हो सकता है, 'id'दो अक्षर i और d के साथ एक स्ट्रिंग है , इसलिए hasOwnProperty(id)जाँचता है कि क्या वैरिएबल आईडी में निर्दिष्ट संपत्ति मौजूद है, और hasOwnProperty('id')जाँचता है कि आईडी नाम की कोई प्रॉपर्टी है या नहीं।
कुछ

17

व्यक्तिगत रूप से मुझे लगता है

if (id in tutorTimes === false) { ... }

से पढ़ने में आसान है

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

लेकिन दोनों काम करेंगे।


14

दो त्वरित संभावनाएं:

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

या

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

5
'undefined' === typeof xxxइसके बजाय उपयोग करें । undefinedएक आरक्षित शब्द नहीं है और वास्तव में एक वैश्विक चर है जिसे अधिलेखित किया जा सकता है (कीड़े को खोजने के लिए कठिन हो सकता है)
hugomg

9
@hippietrail काम नहीं करता ... "" के बाद परिजनों की आवश्यकता है! और आसपास'foo' in myObj)
फिल कूपर

4
myObj['foo']एक संपत्ति के रूप में मौजूद हो सकता है और बस undefined(कथन के साथ myObj.foo = undefined) सेट किया जा सकता है । यदि आप वास्तव में यह देखना चाहते हैं कि क्या संपत्ति स्वयं मौजूद नहीं है, तो आपको !('foo' in myObj)अंकन की आवश्यकता है।
रिचर्ड कॉनामैकर

हमारे बीच सचेत प्रदर्शन के लिए, जाँच myObj.foo === undefinedबहुत तेज़ है (संभावित रूप से खतरनाक): jsperf.com/not-in-vs-is-undefined
etpinard

@hugomg मुझे नहीं लगता कि उपयोग न करने के लिए यह एक बहुत अच्छा तर्क है === undefined। अगर लोग प्रोग्रामिंग भाषा का दुरुपयोग करते हैं, उदाहरण के लिए, undefinedजावास्क्रिप्ट में ओवरराइटिंग, तो बहुत सी चीजें टूट सकती हैं । यह भी देखें: stackoverflow.com/questions/8783510/…
Zero3
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.