शीघ्र जवाब
अगर जावास्क्रिप्ट ऑब्जेक्ट या सरणी में कोई विशेष कुंजी मौजूद है, तो मैं कैसे जांच करूं? यदि कोई कुंजी मौजूद नहीं है और मैं इसे एक्सेस करने की कोशिश करता हूं, तो क्या यह गलत होगा? या एक त्रुटि फेंक?
(साहचर्य) सरणी शैली या ऑब्जेक्ट शैली का उपयोग करके एक लापता संपत्ति तक सीधे पहुंचना अपरिभाषित स्थिरांक लौटाएगा ।
ऑपरेटर में धीमी और विश्वसनीय और hasOwnProperty विधि
जैसा कि लोगों ने पहले ही यहां उल्लेख किया है, आपके पास एक "अपरिभाषित" स्थिरांक के साथ जुड़ी संपत्ति के साथ एक वस्तु हो सकती है।
var bizzareObj = {valid_key: undefined};
उस मामले में, आप का उपयोग करना होगा hasOwnProperty या में ऑपरेटर अगर कुंजी वास्तव में वहाँ है पता करने के लिए। लेकिन, लेकिन किस कीमत पर?
इसलिए, मैं आपको बताता हूं ...
में ऑपरेटर और hasOwnProperty "तरीकों" का उपयोग जावास्क्रिप्ट में संपत्ति डिस्क्रिप्टर तंत्र (जावा भाषा में जावा प्रतिबिंब के समान) कर रहे हैं।
http://www.ecma-international.org/ecma-262/5.1/#sec-8.10
प्रॉपर्टी डिस्क्रिप्टिव प्रकार का उपयोग नामित संपत्ति विशेषताओं के हेरफेर और संशोधन को समझाने के लिए किया जाता है। प्रॉपर्टी डिसिप्लिनर प्रकार के मान रिकॉर्ड किए गए फ़ील्ड से बने रिकॉर्ड होते हैं जहां प्रत्येक फ़ील्ड का नाम एक विशेषता नाम होता है और इसका मान 8.6.1 में निर्दिष्ट के अनुसार एक संबंधित विशेषता मान होता है। इसके अलावा, कोई भी क्षेत्र मौजूद या अनुपस्थित हो सकता है।
दूसरी ओर, ऑब्जेक्ट विधि या कुंजी को कॉल करना जावास्क्रिप्ट [[प्राप्त करें]] तंत्र का उपयोग करेगा। यह बहुत तेजी से रास्ता है!
बेंचमार्क
http://jsperf.com/checking-if-a-key-exists-in-a-javascript-array
।
ऑपरेटर
में
उपयोग करना
var result = "Impression" in array;
नतीजा था
12,931,832 ±0.21% ops/sec 92% slower
HasOwnProperty का उपयोग करना
var result = array.hasOwnProperty("Impression")
नतीजा था
16,021,758 ±0.45% ops/sec 91% slower
तत्वों तक सीधे पहुंचना (कोष्ठक शैली)
var result = array["Impression"] === undefined
नतीजा था
168,270,439 ±0.13 ops/sec 0.02% slower
सीधे तत्वों तक पहुँच (वस्तु शैली)
var result = array.Impression === undefined;
नतीजा था
168,303,172 ±0.20% fastest
संपादित करें: किसी संपत्ति को undefined
मूल्य देने का क्या कारण है ?
यह प्रश्न मेरे लिए पहेली है। जावास्क्रिप्ट में, इस तरह की समस्याओं से बचने के लिए अनुपस्थित वस्तुओं के लिए कम से कम दो संदर्भ हैं: null
और undefined
।
null
वह आदिम मूल्य है जो किसी वस्तु के मूल्य के जानबूझकर अनुपस्थिति का प्रतिनिधित्व करता है, या कम शब्दों में, मूल्य की पुष्टि की कमी। दूसरी ओर, undefined
अज्ञात मूल्य (परिभाषित नहीं) है। यदि कोई ऐसी संपत्ति है जिसे बाद में उचित मूल्य के साथ उपयोग किया जाएगा, तो null
इसके बजाय उपयोग के संदर्भ पर विचार करें undefined
क्योंकि प्रारंभिक क्षण में संपत्ति के मूल्य का अभाव होने की पुष्टि की जाती है।
की तुलना करें:
var a = {1: null};
console.log(a[1] === undefined); // output: false. I know the value at position 1 of a[] is absent and this was by design, i.e.: the value is defined.
console.log(a[0] === undefined); // output: true. I cannot say anything about a[0] value. In this case, the key 0 was not in a[].
सलाह देना
undefined
मूल्यों वाली वस्तुओं से बचें । जब भी संभव हो सीधे जाँच करें और null
संपत्ति मूल्यों को इनिशियलाइज़ करने के लिए उपयोग करें। अन्यथा, धीमे in
ऑपरेटर या hasOwnProperty()
विधि का उपयोग करें ।
संपादित करें: 12/04/2018 - कहीं भी जारी न करें
जैसा कि लोगों ने टिप्पणी की है, जावास्क्रिप्ट इंजन के आधुनिक संस्करणों (फ़ायरफ़ॉक्स अपवाद के साथ) ने पहुंच गुणों के लिए दृष्टिकोण बदल दिया है। वर्तमान कार्यान्वयन इस विशेष मामले के लिए पिछले एक की तुलना में धीमा है, लेकिन पहुंच कुंजी और ऑब्जेक्ट के बीच अंतर उपेक्षित है।