क्यों करता है {। । । .0} का मूल्यांकन {}?


80

मुझे बस {....0}मित्र का कोड मिला । कंसोल रिटर्न {}(खाली वस्तु) में इसका मूल्यांकन करना ।

ऐसा क्यों है? जावास्क्रिप्ट में 4 डॉट्स का क्या अर्थ है?


11
6 घंटे में लगभग 2500 बार देखा गया? ऐसा प्रतीत होता है कि आपका मित्र किसी भिन्न संदर्भ में प्रसार ऑपरेटर का उपयोग कर रहा है।
जेरेमी हैरिस

यह एक "कैसे इस अभिव्यक्ति को पार्स किया गया है" प्रश्न से अधिक है। इसे JS कंसोल में टाइप करें और आप देखेंगे कि 4th डॉट अलग रंग का है ... शून्य जैसा ही रंग।
सलमान ए


@JeremyHarris का जादू HNQ
Pac0

जवाबों:


90

चार बिंदुओं का वास्तव में कोई अर्थ नहीं है। ...है प्रसार ऑपरेटर , और .0के लिए कम है 0.0

किसी वस्तु में 0 (या किसी संख्या) को फैलाने से एक खाली वस्तु प्राप्त होती है, इसलिए {}


9
Spreading 0 (or any number) yields an empty objectजरूरी नहीं कि यदि आप किसी वस्तु के अलावा किसी अन्य स्थान पर कोई संख्या फैलाते हैं, तो वह एक त्रुटि फेंक देगा जैसे [… 0] एक त्रुटि फेंकता है।
हितेश कुमार

2
@HiteshKumar एक सरणी के अंदर गैर-पुनरावृत्त वस्तुओं को फैलाने से वास्तव में एक त्रुटि होगी, लेकिन इसका इस सवाल से कोई लेना-देना नहीं है। मैं वस्तु-प्रसार का उल्लेख कर रहा हूं। :)
निकक्सडा

2
NikxDa मुझे लगता है कि @HiteshKumar ने एक महत्वपूर्ण बिंदु बनाया। उन मामलों के बारे में अधिक स्पष्ट होना बेहतर है जहां आपके कथन सत्य हैं। Spreading 0 (or any number) in object literal yields an empty objectअधिक उपयोगी जानकारी
मिस्‍टर

1
@ मेरा जवाब मैंने अपडेट कर दिया है। मुझे नहीं लगता कि इसकी आवश्यकता है, लेकिन यह स्पष्टीकरण के लिए अच्छा हो सकता है। अद्यतन के लिए धन्यवाद!
NikxDa

1
@NikxDa धन्यवाद। मैं ऐसे बयानों के बारे में अधिक 'पूर्ण' होना पसंद करता हूं, जब आपके पास उन्हें संदर्भ से काटने की क्षमता होती है, कहीं और पेस्ट करना होता है और वे अभी भी सभी जानकारी रखते हैं और शिक्षाप्रद और सूचनात्मक होते हैं।
धुंध

56

एक वस्तु शाब्दिक में तीन बिंदु एक फैली हुई संपत्ति हैं , जैसे:

  const a = { b: 1, c: 1 };
  const d = { ...a, e: 1 }; // { b: 1, c: 1, e: 1 }

एक 0 के साथ अंतिम बिंदु एक संख्या शाब्दिक .0है जैसा कि है 0.0। इसलिए यह:

 { ...(0.0) }

संख्या ऑब्जेक्ट के सभी गुणों को ऑब्जेक्ट में फैलता है, हालांकि संख्याओं के पास कोई (स्वयं) गुण नहीं हैं जो आपको एक खाली ऑब्जेक्ट वापस मिलता है।


आप मुझे सोचने के लिए प्रेरित करते हैं - मैं किसी भी चर को फैला सकता हूं, और खुद की चाबियाँ नई वस्तु में फैल जाएगी? यह के लिए काम करता Function (function x() {}), (x.k = 'v'), ({...x})// {k: 'v'}है, लेकिन के लिए काम नहीं करता हैNumber (x = 10), (x.k = 'v'), ({...x}) // {}
धुंध

3
@ मिस्ट क्योंकि नंबर (और अन्य प्राइमेटिव) वस्तुओं में "बॉक्सिंग" प्राप्त करते हैं जब आप उनके साथ वस्तुओं के रूप में काम करते हैं, और "अनबॉक्स" के बाद सीधे। इसलिए x.kखो जाएगा।
जोनास विल्म

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

1
धन्यवाद! मैं देखता हूं कि नंबर पर मेरी कुंजी काम क्यों नहीं कर सकी। याय बॉक्सिंग!
मिस्ट

3
नंबर किसी भी जरूरत नहीं है खुद गणनीय गुण। लेकिन उनके पास गुण हैं।
पैट्रिक रॉबर्ट्स

6

एक साधारण शब्दों {...}में जावास्क्रिप्ट में प्रसार ऑपरेटर एक वस्तु / सरणी को दूसरे के साथ बढ़ाता है।

इसलिए, जब babelifier एक दूसरे के साथ विस्तार करने की कोशिश करता है, तो उसे यह पहचानना होगा कि वह किसी सरणी या ऑब्जेक्ट को विस्तारित करने का प्रयास कर रहा है या नहीं।

के मामले में array, यह तत्वों पर निर्भर करता है।

के मामले में object, यह कुंजियों पर निर्भर करता है।

इस परिदृश्य में, Babelyfier numberऑब्जेक्ट की जाँच करके कुंजियों को निकालने का प्रयास कर रहा है own property callजो कि गायब है numberइसलिए यह खाली ऑब्जेक्ट लौटाता है।


0

स्प्रेड ऑपरेटर {...}पुनरावृत्तियों को विस्तारित करने की अनुमति देता है। इसका मतलब है कि उन डेटा प्रकारों को key-valueजोड़े के रूप में परिभाषित किया जा सकता है। के रूप में Objectहम कुंजी-मूल्य जोड़ी को वस्तु संपत्ति कहते हैं और यह मूल्य है जबकि arraysहम संदर्भ में कुंजी और तत्व के रूप में सरणी में मान सकते हैं।

let obj = { a: 4, b: 1};
let obj2 = { ...obj, c: 2, d: 4}; // {a: 4, b: 1, c: 2, d: 4}

let arr1 = ['1', '2'];
let obj3 = { ...arr1, ...['3']}; // {0: "3", 1: "2"}

सरणी के संदर्भ में, चूंकि यह सूचकांक को कुंजी के रूप में लेता है, इसलिए यहां तत्व '1' को arr1'3' के साथ बदल दिया जाता है क्योंकि दोनों में अलग-अलग सरणी में एक ही सूचकांक होता है।

स्ट्रिंग्स के साथ भी प्रसार ऑपरेटर गैर-खाली ऑब्जेक्ट देता है। चूंकि स्ट्रिंग चरित्र की एक सरणी है, इसलिए यह स्ट्रिंग को एक सरणी के रूप में मानता है।

let obj4 = {...'hi',...'hello'}   // {0: "h", 1: "e", 2: "l", 3: "l", 4: "o"}
let obj5 = {...'y',...'x'}   // {0: "x" }

लेकिन अन्य आदिम डेटा प्रकारों के साथ यह खाली वस्तु लौटाता है

नंबरों के साथ

let obj6 = { ...0.0, ...55} // {}

बूलियन के साथ

let obj7 = { ...true, ...false} // {}

निष्कर्ष में उन डेटा प्रकारों को जो कुंजी-संचालक जोड़े के रूप में व्यवहार किया जा सकता है जब प्रसार ऑपरेटर के साथ उपयोग किया जाता {...}है गैर-खाली ऑब्जेक्ट वापस आता है अन्यथा यह खाली वस्तु देता है{}

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.