जावास्क्रिप्ट: खाली सरणी, [] सशर्त संरचनाओं में सही का मूल्यांकन करता है। ऐसा क्यों है?


99

मुझे अपने कोड में बहुत सारे बगों का सामना करना पड़ रहा था क्योंकि मुझे इस अभिव्यक्ति की उम्मीद थी:

Boolean([]); असत्य का मूल्यांकन करना।

लेकिन यह मामला नहीं था क्योंकि यह सच करने के लिए मूल्यांकन किया गया था।

इसलिए, ऐसे कार्य जो संभवतः []इस तरह से लौटे :

// Where myCollection possibly returned [ obj1, obj2, obj3] or []
if(myCollection)
{
  // ...

}else
{
  // ...
}

अपेक्षित चीजें नहीं कीं।

क्या मैं यह मानने में चूक गया कि []एक खाली सरणी?

इसके अलावा, क्या यह व्यवहार सभी ब्राउज़रों में सुसंगत है? या वहाँ भी कोई गोटे हैं? मैंने इस तरीके से Goolgle Chrome में व्यवहार किया।


5
सरणियाँ वस्तुएँ हैं, वस्तुएँ सत्य हैं। बस array.length के लिए पूछें, यदि शून्य नहीं है, तो यह सत्य होगा। जब आप स्पष्ट रूप से बूलियन में परिवर्तित होते हैं, तो सरणी पहले एक खाली स्ट्रिंग में बदल जाती है, फिर खाली स्ट्रिंग झूठी में बदल जाती है।
डंडविस

1
आप उपयोग क्यों नहीं करते myCollection.length > 0?
स्टीव

1
@ सच - अगर myCollectionऐसा होता है nullया नहीं होता है तो काम नहीं करेगा undefined। आपको उपयोग करने की आवश्यकता है if(myCollection && myCollection.length > 0)
टेड हॉप

@ टेडहॉप - बिल्कुल ... मैं सिर्फ इशारा कर रहा था कि myCollection.length > 0एक बूलियन मूल्य प्रदान करता है जो कि ओपी ने पूछा कि वह क्या कर रहा है ... उसे अभी भी वहां से काम करने की जरूरत है।
स्टीव

जवाबों:


118

से http://www.sitepoint.com/javascript-truthy-falsy/

निम्नलिखित मूल्य हमेशा मिथ्या होते हैं:

  • असत्य
  • 0 (शून्य)
  • "" (खाली स्ट्रिंग)
  • शून्य
  • अपरिभाषित
  • NaN (एक विशेष संख्या मूल्य जिसका अर्थ संख्या-ए-नंबर नहीं है!)

अन्य सभी मूल्य सत्य हैं, जिनमें "0" (उद्धरण में शून्य), "झूठे" (उद्धरण में झूठ), खाली कार्य, खाली सरणियाँ और खाली वस्तुएं शामिल हैं।

ऐसा क्यों है, इस बारे में मुझे संदेह है क्योंकि जावास्क्रिप्ट सरणियाँ केवल एक विशेष प्रकार की वस्तु हैं। विशेष रूप से परीक्षण करने के लिए सरणियों के उपचार के लिए अतिरिक्त उपरि की आवश्यकता होगी Array.isArray()। इसके अलावा, यह संभवतः भ्रमित करने वाला होगा कि अगर इस संदर्भ में अन्य सरणी जैसी वस्तुओं से अलग-अलग व्यवहार किया जाता है, जबकि सभी सरणी जैसी वस्तुएं व्यवहार करती हैं, तो यह और भी महंगा होगा।


27
यदि आप उस अभिव्यक्ति का परीक्षण करते हैं जिसका [] == falseवह मूल्यांकन करता है true
m.rufca

3
@ m.rufca देखें stackoverflow.com/questions/5491605/...
Barmar

==आपके द्वारा पोस्ट किए गए लिंक में तुलनित्र का उपयोग करते हुए अप्रत्याशित स्थितियों को दिखाने वाली एक मुट्ठी तालिका है । मैंने सही या गलत मूल्यांकन की अपेक्षा करते समय सावधानी बरतने के लिए टिप्पणी की।
m.rufca

4
यह वास्तव में उस सवाल का जवाब नहीं देता है, जो क्यों था। खाली स्ट्रिंग सत्य क्यों है, जब एक खाली स्ट्रिंग मिथ्या है? एक जानबूझकर डिजाइन निर्णय के रूप में यह बहुत खराब लगता है।
एसा लिंडक्विस्ट

1
हो सकता है, क्योंकि उन लोगों को आदिम वस्तुओं की तरह काम करने की आवश्यकता होती है। लेकिन जावास्क्रिप्ट में आदिम सरणियाँ नहीं होती हैं।
बरमार

28

आपको .lengthउस एरे की जाँच करनी चाहिए कि क्या उसमें कोई तत्व है या नहीं।

if (myCollection) // always true
if (myCollection.length) // always true when array has elements
if (myCollection.length === 0) // same as is_empty(myCollection)

@marczellm स्टीव की टिप्पणी पुरानी है, उन्होंने DevIshOne को लापता स्थिति "जब एरे में तत्व होते हैं" के बारे में सूचित किया , जिसे इसलिए संपादित में सही किया गया था ।
मुचाहो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.