2010-06-22 12 views
7

मैं एक JavaScript फ़ंक्शन जहां किसी में कुछ भी पारित कर सकते हैं है से अधिक पुनरावृति करने के लिए सुरक्षित है, और मैंचेक चाहे वह JavaScript वैरिएबल

for x in obj 

सिंटैक्स का उपयोग अपने कुंजी में से प्रत्येक पर पुनरावृति। हालांकि, अगर वे एक आदिम (स्ट्रिंग या संख्या) पास करते हैं तो यह एक त्रुटि में परिणाम देता है; सही व्यवहार फ़ंक्शन के लिए उसी तरह कार्य करने के लिए होता है क्योंकि यह किसी ऑब्जेक्ट पर बिना किसी कुंजी के होता है।

मैं इस पर जाने के लिए try..catch ब्लॉक कर सकता हूं, लेकिन क्या कोई अन्य (अधिक संक्षिप्त) तरीका है?

उत्तर

7
x && typeof(x) === 'object' 

यह वस्तुओं और सरणी के लिए सच है (हालांकि आप आमतौर पर for..in के साथ सरणी पर फिर से नहीं चलना चाहते हैं)।

संपादित करें: प्रति सीएमएस को ठीक करें।

+3

अच्छा परीक्षण, केवल एक चीज जो मैं जोड़ सकता हूं वह यह है कि 'टाइपोफ' एक यूनरी ऑपरेटर है और एक समारोह नहीं है, इसलिए माता-पिता सिर्फ 'x' के आसपास अभिव्यक्ति कर रहे हैं और फिर ऑपरेटर को लागू कर रहे हैं। साथ ही, जब मैं पैडेंटिक और मूर्खतापूर्ण हूं, क्योंकि 'टाइपोफ' हमेशा एक स्ट्रिंग देता है, तो '==' ऑपरेटर एक पेटसेकंड तेज होगा। यह सब कहना है, यह पूरी तरह से ठीक है ... –

+1

एकमात्र समस्या 'शून्य' हो सकती है, एक आदिम है और 'टाइपोफ' दुर्भाग्य से पूरी तरह से गलत है: 'टाइपऑफ नल ==' ऑब्जेक्ट'' – CMS

+2

एलेक्स: क्यों = = ''==' से अधिक तेज हो? ईसीएमएस्क्रिप्ट स्पेक के मुताबिक, इस मामले में दोनों तुलनाओं के लिए बिल्कुल वही कदम किए जाएंगे। –

2

तरीके आपको लगता है कि यह निष्कर्ष निकाल सकता है की एक संख्या है, यहाँ एक अच्छा एक है:

function isIterable(obj) { 
    if (obj && obj.hasOwnProperty) { 
    return true; 
    } 
    return false; 
} 

आप उनमें से एक नंबर ले सकता है।

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