एरे और ऑब्जेक्ट्स में कॉमनिंग ट्रेल्स का हिस्सा हैं?


215

क्या जावास्क्रिप्ट में अल्पविराम मानक हैं, या क्रोम और फ़ायरफ़ॉक्स जैसे अधिकांश ब्राउज़र उन्हें बर्दाश्त करते हैं?

मैंने सोचा था कि वे मानक थे, लेकिन IE8 ने एक का सामना करने के बाद puked- बेशक IE ने कुछ का समर्थन नहीं किया शायद ही इसका मतलब है कि यह मानक नहीं है।

यहां इसका एक उदाहरण है जो मेरे आशय का है (पुस्तकों के अंतिम तत्व के बाद)

var viewModel = {
    books: ko.observableArray([
        { title: "..", display: function() { return ".."; } },
        { title: "..", display: function() { return ".."; } },
        { title: "..", display: function() { return ".."; } }, // <--right there
    ]),
    currentTemplate: ko.observable("bookTemplate1"),
    displayTemplate: function() { return viewModel.currentTemplate(); }
};

दूसरे दिन यह मिला। C # प्रोग्रामर होने के नाते मुझे उनकी अनुमति थी ...
CaffGeek

5
मैंने कुछ हफ्ते पहले इससे निपटा। आईई 7 में नए डिबगिंग टूल के बिना इसे खोजने की कोशिश करने की कल्पना करें ...
रयान मिलर

4
जब मैंने JS, Ruby, C # जैसी भाषाओं की खोज की तो मुझे खुशी हुई, इससे कॉपी पेस्ट टेस्ट डेटा को आसान बना दिया गया ... जब मुझे IE में इस बात का अहसास हुआ तो मुझे गुस्सा आ गया ...
एडम रैकिस

मुझे आश्चर्य है कि अगर कॉमा (कॉफ़ी की तरह) के बजाय महत्वपूर्ण व्हाट्सएप किसी भी वाक्यात्मक अस्पष्टता का कारण होगा?
एंडी

जवाबों:


209

चश्मा: ECMAScript 5 और ECMAScript 3


ECMAScript 5 विनिर्देश में धारा 11.1.5 :

ObjectLiteral :
    { }
    { PropertyNameAndValueList }
    { PropertyNameAndValueList , }

तो हाँ, यह विनिर्देश का हिस्सा है।

अपडेट: जाहिरा तौर पर यह ES5 में नया है। ईएस 3 (पृष्ठ 41) में, परिभाषा सिर्फ इस प्रकार थी:

ObjectLiteral :
    { }
    { PropertyNameAndValueList }

सरणियों शाब्दिक ( धारा 11.1.4 ) के लिए यह और भी दिलचस्प है ( अपडेट: यह पहले से ही ES3 में मौजूद है):

ArrayLiteral :
    [ Elisionopt ]
    [ ElementList ]
    [ ElementList , Elision_opt ]

(जहां Elision_optएलियन ऑप्ट है , जिसका अर्थ एलिसन वैकल्पिक है)

Elision की तरह परिभाषित किया गया है

Elision :
    ,
    Elision ,

तो, एक सरणी शाब्दिक की तरह

var arr = [1,2,,,,];

पूरी तरह से कानूनी है। यह दो तत्वों के साथ एक सरणी बनाता है, लेकिन सरणी लंबाई को निर्धारित करता है2 + 3 = 5

IE से बहुत ज्यादा उम्मीद न करें (IE9 से पहले) ...


1
जैसा कि मैंने EndoPhage से पूछा, क्या आपको पता है कि यह ES3 में भी मानक था? मैं इसके लिए कल्पना खोजने के लिए प्रतीत नहीं कर सकता
एडम रैकिस


1
जाहिर है, वस्तु शाब्दिक रूप में अनुगामी अल्पविराम ES3 युक्ति में नहीं था। लेकिन सरणियों के लिए परिभाषा समान है।
फेलिक्स क्लिंग

अच्छी तरह से यह सरणी तत्व थे जो मैं इसके साथ भाग गया था, इसलिए मुझे लगता है कि एमएस के लिए कोई बहाना नहीं है कोई फर्क नहीं पड़ता कि आप इसे कैसे काटते हैं। धन्यवाद फिर से
एडम रैकिस

माइक्रो $
टीटी

91

बस एक त्वरित अनुस्मारक / चेतावनी है कि यह उन क्षेत्रों में से एक है जिनमें जावास्क्रिप्ट / ECMAScript मानक और JSON मानक भिन्न हैं; ट्रेलिंग कॉमा जेएस में मान्य हैं , लेकिन JSON में मान्य नहीं हैं


1
लेकिन फिर, अगर सुपरसेट एक "चेंज ऑफ़ हार्ट" के लिए है, तो क्या आप (अभी भी) को प्यार किया जा सकता है "अगर आप बस एक बार समायोजित हो जाएं?"
लुकास बुनेगर

52

क्या भी मजेदार है, IE7 देता है

[1,].length  --> 2

जबकि फ़ायरफ़ॉक्स और क्रोम

[1,].length  --> 1

16
लेकिन [1,,].lengthदेता है 2नब्ज : ब्राउज़र कोई नहीं बनाते हैं।
डेविड तितरेंको

84
एकदम सही समझ में आता है, कल्पना कहती है कि (नोट: एकवचन) अनुगामी अल्पविराम किसी सरणी की लंबाई को नहीं जोड़ता है। क्रोम और फ़ायरफ़ॉक्स ने ES5 को सही ढंग से लागू किया है।
JaredMcAteer

7
जब 2 (बहुवचन) अनुगामी अल्पविराम होते हैं, केवल एक सरणी की लंबाई में जुड़ जाता है, इसलिए यह कहना अधिक सटीक लगता है कि अंतिम अनुगामी अल्पविराम को अनदेखा करने की तुलना में एकल अनुगामी अल्पविराम को अनदेखा किया जाता है।
iconoclast

4

आप जावास्क्रिप्ट के लिए विनिर्देश (उर्फ ईसीएमए स्क्रिप्ट) यहां पा सकते हैं । आप पृष्ठ 63 पर सरणियों के लिए प्रासंगिक परिभाषा पा सकते हैं और जैसा कि फेलिक्स ने नोट किया है, वस्तु पृष्ठ के एक जोड़े को बाद में पृष्ठ 65 पर परिभाषित करती है।

हालांकि इस विनिर्देश का कहना है कि ,मुझे पता नहीं है कि यह सच है कि कुछ संस्करणों को वापस देखना सही होगा। जैसा कि आपने IE8 का उल्लेख किया है - यदि आप पीछे चल रहे अल्पविराम को छोड़ देते हैं, तो क्रोम और FF इसे ठीक से संभाल लेंगे।


आपके सिर के ऊपर, यह ES3 मानक का हिस्सा था? मैं ES3 कल्पना खोजने के लिए प्रतीत नहीं कर सकते
एडम Rackis 10

1
@ एडम मैं इसे खोजने की कोशिश कर रहा हूं ... रिलीज की तारीखों (ES3 को 1999 में प्रकाशित किया गया था, ES4 को छोड़ दिया गया था और ES5 केवल 2009 में प्रकाशित हुआ था), यह समझ में आता है कि यह ES3 मानक में था। या यह सिर्फ इतना हो सकता है कि एमएस ने एक और बात पर ध्यान दिया।
एंडोफेगे

ऐसा लगता है कि एमएस ने फेलिक्स के जवाब को देखते हुए एक और बात की। आपके लिए फिर से धन्यवाद
एडम रैकिस

2

चलिए इसे तोड़ते हैं।

क्या जावास्क्रिप्ट में अल्पविराम मानक हैं?

हाँ। ECMAScript 5 विनिर्देश के अनुसार (Google और Airbnb शैली गाइड का भी हिस्सा)

क्या क्रोम और फ़ायरफ़ॉक्स जैसे अधिकांश ब्राउज़र उन्हें बर्दाश्त करते हैं?

यह एक ECMAScript 5 समर्थन प्रश्न है।

बाबेल जैसे ट्रांसपैरर्स ट्रांसप्लड कोड में अतिरिक्त ट्रेलिंग कॉमा को हटा देंगे, जिसका अर्थ है कि आपको लीगेसी ब्राउज़र में कॉलिंग समस्या के बारे में चिंता करने की आवश्यकता नहीं है।

तो इसका मतलब:

var heroes = [
  'Batman',
  'Superman',
];
// heroes.length === 2 (not 3)

तो संभावना है कि यदि आप ईएस 5 का उपयोग कर रहे हैं और आपको इसके बारे में चिंता करने की आवश्यकता नहीं है।

मैंने सोचा था कि वे मानक थे, लेकिन IE8 ने एक का सामना करने के बाद puked- बेशक IE ने कुछ का समर्थन नहीं किया शायद ही इसका मतलब है कि यह मानक नहीं है।

फिर, यह एक ECMAScript 5 समर्थन प्रश्न है। IE8 ECMAScript 5 (केवल IE9 और ऊपर) का समर्थन नहीं करता है

मैं अत्यधिक एक नज़र Airbnb के ES5 पदावनत दस्तावेज लेने की सलाह दूंगा https://github.com/airbnb/javascript/blob/es5-deprecated/es5/README.md#comm

मैं मोज़िला के डॉक्स की भी सिफारिश करूंगा:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Trailing_commas


1

Chrome 52 पर:

[1,].length --> 1
[1,2,].length --> 2
[].length --> 0 
[,].length --> 1    <<<<=== OUHHHHH !!!!

मैं सिर्फ अल्पविरामों को पसंद नहीं करता। लोग आमतौर पर किसी अन्य कमेंट द्वारा लिखी गई लाइन को मिटाने से बचने के लिए ओपन सोर्स प्रोजेक्ट्स में उनका उपयोग करते हैं। अजगर में भी यही सवाल देखें: https://stackoverflow.com/a/11597911/968988


13
OUHHHHH ’क्यों? 1 नहीं तो आपको और क्या उम्मीद थी? आप स्पष्ट रूप से उस अल्पविराम से पहले 'एक तत्व' रखते हैं, जैसे [1], (जो लंबाई: 1 है)।
फिग डे

OUHHHHH ’क्यों? क्योंकि मैं RFC को पढ़े बिना किसी कोड से किसी भी चीज की उम्मीद नहीं करता। और हां, यह ठीक वैसे ही काम करता है [1,]: अल्पविराम से पहले स्पष्ट रूप से कुछ है। लेकिन [,]कॉमा के पहले और बाद में भी उतना ही है। इसलिए क्योंकि मैं [,]अकेला नहीं समझता , मुझे नहीं लगता कि इसका उपयोग [1,]करना अच्छा विचार है।
निकोलस ज़ोज़ोल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.