2010-10-27 18 views
8

मैं यह जानकर उत्सुक था कि एक जेएस ऑब्जेक्ट (शब्दकोश के रूप में उपयोग किए जाने वाले) में एक दी गई संपत्ति है या नहीं।जावास्क्रिप्ट: शब्दकोश/ऑब्जेक्ट सदस्यता की जांच गति

और मैं परिणामों से परेशान था। अपने लिए देखें: http://jsperf.com/object-membership-check-speed/6

क्रोम में, in कीवर्ड विधि डॉट सिंटैक्स से 96% धीमी है। और फ़ायरफ़ॉक्स में, यह लगभग 80% धीमी है। आईई लगभग 50% धीमी

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

+0

फ़ायरफ़ॉक्स 4.0b6/विंडोज़ में मेरे लिए बहुत अंतर नहीं है: सरणी वाक्यविन्यास सबसे तेज़ है, डॉट सिंटैक्स 3% धीमा, 'इन' कीवर्ड 10% धीमा है। –

+0

हंसी के लिए, इसे IE8 में चलाने का प्रयास करें। आप "यह स्क्रिप्ट धीरे-धीरे चल रही है, बंद करने से थक जाएंगे। क्या आप इसे खत्म करना चाहते हैं?" संवाद। रिकॉर्ड के लिए, आईई 8 क्रोम से ~ 60 गुना धीमा चला गया। :) – Robusto

+0

रिकॉर्ड के लिए, वे सभी मान प्राप्त करते हैं, क्योंकि उन्हें यह निर्धारित करना होगा कि ऐसा मान मौजूद है (इसलिए कुछ * * वापस लौटाया गया है), और प्रत्येक तरीके को विशिष्ट सदस्य तक पहुंचना चाहिए। – Robusto

उत्तर

6

वे समान नहीं हैं। अगर एक संपत्ति है

  • obj.prop की जाँच करेगा नहीं falsy (नहीं null, undefined, 0, "", false)।

  • prop in obj जाँच करता है कि एक संपत्ति एक वस्तु में मौजूद है (यह प्रोटोटाइप श्रृंखला सहित)

  • और अंत में आप obj.hasOwnProperty('prop') जो की जाँच करता है, तो वस्तु prop है के रूप में यह अपनी संपत्ति है है (नहीं किया जा सकता एक निहित एक)।

उदाहरण

var obj = { prop: "" }; 
obj.prototype = { inhereted: true }; 
if (obj.prop);   // false 
if (prop in object);  // true 
if (inhereted in object); // true 
if (obj.hasOwnProperty('prop'));  // true 
if (obj.hasOwnProperty('inhereted')); // false 

मुझे लगता है कि प्रदर्शन के रूप में लंबे समय से एक समस्या नहीं होनी चाहिए जैसा कि आप चेक के लाखों लोगों की एक समय में नहीं कर रहे हैं। क्या तुम सच में सबसे तेज़ तरीका है, हालांकि चाहते हैं, आप उपयोग कर सकते हैं:

if (obj.prop != null) 

यदि संपत्ति null या undefined नहीं है कौन सा जाँच करता है। इस रूप में अन्य झूठी मान "" या 0 हस्तक्षेप नहीं कर सकते हैं, और आप अभी भी सुपर प्रदर्शन कर रहे हैं।

+0

मुझे लगता है कि वे वही नहीं हैं। लेकिन यह अभी भी आश्चर्यजनक है कि सबसे सरल (सिद्धांत में कम से कम) विधि सबसे धीमी है। बीटीडब्लू- मैंने बेंचमार्क में हैऑनप्रॉपर्टी विधि को यह देखने के लिए जोड़ा कि यह कैसा चल रहा है, और यह 'इन' की एक ही गति के बारे में है .. थोड़ा आश्चर्यजनक है क्योंकि इसमें एक संपत्ति 'हैऑनप्रोपर्टी' है, और उस फ़ंक्शन को कॉल करना शामिल है। जबकि 'इन' के रूप में सिर्फ एक भाषा निर्माण है। – adamJLev

संबंधित मुद्दे