टेम्पलेट स्ट्रिंग ऑब्जेक्ट प्रॉपर्टी के नाम के रूप में


80

जावास्क्रिप्ट एक टेम्पलेट स्ट्रिंग को ऑब्जेक्ट प्रॉपर्टी कुंजी के रूप में अनुमति क्यों नहीं देता है? उदाहरण के लिए, जब मैं इनपुट करता हूं:

foo = {`bar`: 'baz'}

NodeJS REPL में, यह SyntaxErrorएक लंबे स्टैक ट्रेस के साथ "अनपेक्षित टेम्पलेट स्ट्रिंग" के साथ फेंकता है । संपत्ति मूल्य ठीक हैं, हालांकि, जो अप्रत्याशित नहीं है। ब्राउज़र में इसी तरह की त्रुटियां होती हैं, उदाहरण के लिए, फायरबग SyntaxError"अमान्य संपत्ति आईडी" के साथ फेंकता है ।

टेम्पलेट स्ट्रिंग्स को "गणना की गई संपत्ति के नाम" में अनुमति दी जाती है। उदाहरण के लिए, यह सिंटैक्स का समर्थन करने वाले सभी ब्राउज़रों में पूरी तरह से ठीक संकलित करता है:

var foo = {
    [`bar` + 1]: `baz`
};

और वस्तु बनाता है {"bar1": "baz"}

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


2
ऐसा नहीं है कि कारण, गणना की गई संपत्ति के नाम पेश किए जाते हैं। हां, आपको इसके चारों ओर ब्रेसिज़ की आवश्यकता होती है, लेकिन विभिन्न परिदृश्यों को संबोधित करने वाले एक सामान्य समाधान के रूप में यह वाक्यात्मक रूप से बेहतर लगता है।
प्रवीण पुगलिया

मैं सिर्फ अपने जवाब पर पुनर्विचार कर रहा हूं, और मुझे यकीन नहीं है कि यह सही था। अब मैं ES6 डॉक्स के माध्यम से खुदाई कर रहा हूं ....
मैक्स

टेम्प्लेट स्ट्रिंग्स को शाब्दिक ऑब्जेक्ट कुंजियों के रूप में अनुमति क्यों नहीं दी जाती है? वे कर रहे हैं, तुम सिर्फ वाक्यविन्यास गलत है ...?
मैथलेटिक्स

जवाबों:


70

टेम्प्लेट स्ट्रिंग्स को शाब्दिक ऑब्जेक्ट कुंजियों के रूप में अनुमति क्यों नहीं दी जाती है?

टेम्प्लेट स्ट्रिंग भाव हैं, शाब्दिक नहीं 1 । आप संपत्ति के नामों के लिए केवल स्ट्रिंग शाब्दिक (और पहचानकर्ता) का उपयोग कर सकते हैं, बाकी सब के लिए - जो स्थिर होने के लिए नहीं जाना जाता है - आपको एक गणना की गई संपत्ति के नाम की आवश्यकता है।

क्या यह प्रदर्शन कारणों से है?

नहीं, यह संभावना नहीं है। यह पार्सिंग को आसान बनाने के लिए है, और गतिशील रूप से गणना वाले लोगों से निरंतर (सांख्यिकीय रूप से ज्ञात) संपत्ति के नामों को अलग करना आसान बनाता है।

और ज्यादातर, यह एक ऐसी विशेषता है जिसकी किसी को आवश्यकता नहीं है। यह कुछ भी सरल या छोटा नहीं करता है, और आप इसके साथ जो हासिल करेंगे वह पहले से ही संभव है।

क्या भविष्य में कुछ समय के लिए वाक्य रचना की अनुमति होगी?

नहीं।

1: यहां तक ​​कि जब उन्हें "टेम्पलेट शाब्दिक" कहा जाता है, तो तकनीकी रूप से वे शाब्दिक नहीं होते हैं । और: टेम्पलेट्स को स्ट्रिंग्स होने की भी आवश्यकता नहीं है, वे किसी भी चीज़ का मूल्यांकन कर सकते हैं।


2
`var obj = {` $ {dyanmicKey} के बारे में क्या: `: val}`?
b4d4r

78
@ b4d4r: नहीं - आपको गणना किए गए गुणों का उपयोग करने की आवश्यकता है। या तो var obj = {[`${dyanmicKey}`]: val}या बस var obj = {[dyanmicKey]: val}
बरगी

यार, हालांकि क्यों नहीं। वे नहीं चाहते कि लोग वहां पर भावों को
रखें

@Bergi निम्नलिखित में से कोई एक कैसे ठीक होगा:profile.preferences.networks[${network.name}]
basickarl

1
@ सफ़लपिल्लई एक निर्विवाद पहचानकर्ता नाम के अंदर नहीं है, लेकिन {"#key": "value"}पूरी तरह से ठीक है।
बर्गी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.