क्यों जावास्क्रिप्ट में ",,," == ऐरे (4) है?


119

अपने दुभाषिया / कंसोल को बूट करें और तुलना का प्रयास करें

> ",,," == Array(4)
True

क्यों? पहले तो मैंने सोचा कि शायद आप ",,," चार वर्णों के एक सरणी के रूप में '\ _' को समाप्त करने वाले स्लाइस के रूप में सोच सकते हैं, ऐसा क्यों हो सकता है, लेकिन

> "..." == Array(4)

"गलत" लौटाता है। तो क्यों? मुझे पता है कि यह जावास्क्रिप्ट में डक टाइपिंग का कुछ मूर्खतापूर्ण सा है, लेकिन उत्सुक है कि इस व्यवहार को क्या रेखांकित करता है। जेडब्ल्यू शॉ की उत्कृष्ट प्रस्तुति से यह देखकर यहाँ btw


14
सी के अलावा कुछ भाषाएं प्रोग्रामर को दिखाई देने वाले तरीके से शून्य-समाप्ति का उपयोग करती हैं।
जॉय

7
अगर मैं पूछूं कि इस खोज का क्या कारण है?
SomeKittens

1
@SomeKittens Zed Shaw ने मेरे द्वारा मेरे प्रश्न (जावास्क्रिप्ट की आलोचना के रूप में) से जुड़े वीडियो में इसका स्पष्ट उल्लेख किया है। चीयर्स!
ZenLikeThat

5
यह भी (बहुत अच्छी तरह से जाना जाता है) "वाट" बात में बताया गया है @SomeKittens, रूबी और जावास्क्रिप्ट में कुछ विचित्रता दिखा destroyallsoftware.com/talks/wat
Cronco

5
यह कई अच्छे कारणों में से एक है जिसके ===बजाय हमेशा उपयोग करें ==
जुआर

जवाबों:


178

क्योंकि दाहिना हाथ ऑपरेंड स्ट्रिंग में बदल जाता है और स्ट्रिंग प्रतिनिधित्व होता Array(4)है ,,,:

> Array(4).toString()
  ",,,"

यदि आप सरणी कंस्ट्रक्टर फ़ंक्शन का उपयोग करते हैं और एक नंबर पास करते हैं, तो यह सरणी की लंबाई को उस संख्या पर सेट करता है। तो आप कह सकते हैं कि आपके पास चार खाली इंडेक्स (समान [,,,]) और सरणियों का डिफ़ॉल्ट स्ट्रिंग प्रतिनिधित्व इसके तत्वों की अल्पविराम से अलग सूची है:

> ['a','b','c'].toString()
  "a,b,c"

तुलनात्मक कार्यों को विनिर्देश के भाग 11.9.3 में कैसे वर्णित किया गया है । वहां आप देखेंगे ( x == y):

8. यदि टाइप ( x ) या तो स्ट्रिंग या संख्या है और टाइप ( y ) ऑब्जेक्ट है,
तो तुलना x == ToPrimitive ( y ) के परिणाम वापस करें ।

(सरणियाँ जावास्क्रिप्ट में ऑब्जेक्ट हैं)

और यदि आप इस ToPrimitiveपद्धति का पालन करते हैं, तो आप अंततः पाएंगे कि यह कॉल करता है toString


2
ठीक है, अब यह सब मेरे लिए समझ में आता है। धन्यवाद।
ZenLikeThat

6
जो, बदले में, क्योंकि सरणियाँ कठोर होती हैं जैसे कि वे उपयोग कर रहे थे Array.join(",")
डस्कवफ-एक्टिव-

आपको जावास्क्रिप्ट में प्रोग्राम करने के लिए खूनी रोगी होना होगा
Matcheek


31

प्रयोग करके देखें =====जावास्क्रिप्ट में उपयोग करते समय , यह चर कास्ट करने का प्रयास करेगा, इस प्रकार इस तरह के मुद्दों की ओर अग्रसर होगा। कंसोल Array(4)स्ट्रिंग प्रतिनिधित्व (यानी Array(4).toString) के लिए कास्टिंग है , जो है ",,,"। अल्पविराम के कारण यह है कि .toString()फ़ंक्शन उन्हें एक सरणी में अलग आइटम में जोड़ता है।

नीचे स्निपेट देखें:

document.write( Array(4).toString() );


18

ऐसा इसलिए है क्योंकि Array(4)4 रिक्त मानों की एक सरणी को आरम्भ करता है, एक ==अंतर्निहित रूपांतरित करता है, इसलिए:

 ",,," == Array(4)

 ",,," == Array(4).toString()

 ",,," == ["", "", "", ""] // note 3 commas for 4 values

 ",,," == ["", "", "", ""].toString()

सभी समान हैं।

==मानों की तुलना करने से पहले निहित प्रकार रूपांतरण करता है, जिसके परिणामस्वरूप अप्रत्याशित परिणाम हो सकते हैं। ===प्रकार और मान की जांच करने के लिए उपयोग करें ।


5

तुलना करने के लिए एक स्ट्रिंग के लिए एक सरणी की तुलना तुलना करने से पहले एक स्ट्रिंग के लिए सरणी को जोड़ता है। एक स्ट्रिंग के लिए एक खाली 4-तत्व सरणी को सम्मिलित करना, सटीक स्ट्रिंग की पैदावार देता है।


4

मैंने पहले सोचा कि यह "प्रोटोटाइप" के साथ कुछ था ... लेकिन थोड़ी जांच के बाद मैं एक दुखद निष्कर्ष पर पहुंच गया ...

जाहिरा तौर पर यह एक आंतरिक और अधिक अस्पष्ट js बात है जिसमें बहुत तर्क नहीं हैं ...

कोशिश करो

Array(4)==Array(4)

और प्रकारों पर कोई ज़बरदस्ती भी नहीं ...

Array(4)===Array(4)

और आपको FALSE मिलेगा

आप जानते हैं null==null, null===nullयहां तक कि और undefined==undefinedऔर undefined===undefinedरिटर्न सही है ... इसलिए ... यह थोड़ा अस्पष्ट है ...

Array(4)==[,,,] सच भी होना चाहिए


ZEE, एरे (4) == [,,] अभ्यस्त होना चाहिए। यदि हम वस्तु की तुलना आदिम से करते हैं, तो वह वस्तु आदिम में बदल जाएगी। यही कारण है कि यह toString () कहता है।
देवाशीष

अरेंज (x) कंस्ट्रक्टर का पता होना चाहिए ... वैसे भी, एक सिस्टम में (न जाने किस तरह का सिस्टम हो), <आइडेंटिटी_एक्स> === <आइडेंटिटी_एक्स> सॉल्ड हमेशा सही रहें!
ZEE
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.