จุลภาคต่อท้ายในอาร์เรย์และวัตถุเป็นส่วนหนึ่งของข้อมูลจำเพาะหรือไม่


215

เครื่องหมายจุลภาคต่อท้ายเป็นมาตรฐานใน JavaScript หรือเบราว์เซอร์ส่วนใหญ่เช่น Chrome และ Firefox เป็นเพียงแค่ยอมรับหรือไม่

ฉันคิดว่าพวกเขาเป็นมาตรฐาน แต่ 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 # ทำให้ฉัน
ชิน

5
ฉันจัดการกับเรื่องนี้ไม่กี่สัปดาห์ที่ผ่านมา ลองนึกภาพพยายามหาสิ่งนี้ใน IE7 โดยไม่มีเครื่องมือการดีบักที่ใหม่กว่า ...
Ryan Miller

4
มันทำให้ฉันมีความสุขเมื่อฉันค้นพบภาษาเช่น JS, Ruby, C # ทำให้สิ่งนี้ - ทำให้การคัดลอกข้อมูลการทดสอบทำได้ง่าย ... มันทำให้ฉันโกรธเมื่อฉันรู้ว่า IE ดูดสิ่งนี้แม้ ...
Adam Rackis

ฉันสงสัยว่าช่องว่างที่สำคัญแทนที่จะเป็นเครื่องหมายจุลภาค (เช่น CoffeeScript) จะทำให้เกิดความกำกวมทางไวยากรณ์หรือไม่
Andy

คำตอบ:


209

ข้อมูลจำเพาะ: ECMAScript 5และECMAScript 3


ส่วนที่ 11.1.5ในข้อกำหนด ECMAScript 5:

ObjectLiteral :
    { }
    { PropertyNameAndValueList }
    { PropertyNameAndValueList , }

ใช่มันเป็นส่วนหนึ่งของสเปค

อัปเดต:เห็นได้ชัดว่านี่เป็นของใหม่ใน ES5 ใน ES3 (หน้า 41) คำจำกัดความเป็นเพียง:

ObjectLiteral :
    { }
    { PropertyNameAndValueList }

สำหรับตัวอักษรอาร์เรย์ ( ส่วน 11.1.4 ) มันน่าสนใจยิ่งขึ้น ( อัปเดต:มีอยู่แล้วใน ES3):

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

( Elision_optตัวเลือก Elision หมายถึงตัวเลือก Elision)

Elision ถูกกำหนดให้เป็น

Elision :
    ,
    Elision ,

ดังนั้นอาร์เรย์เหมือนตัวอักษร

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

ถูกกฎหมายอย่างสมบูรณ์แบบ นี้จะสร้างอาร์เรย์ที่มีสององค์ประกอบ 2 + 3 = 5แต่กำหนดระยะเวลาในอาร์เรย์

อย่าคาดหวังมากเกินไปจาก IE (ก่อน IE9) ...


1
เมื่อฉันถาม EndoPhage คุณรู้หรือไม่ว่านี่เป็นมาตรฐานใน ES3 ด้วยหรือไม่ ฉันไม่สามารถหาข้อมูลจำเพาะได้
Adam Rackis


1
เห็นได้ชัดว่าจุลภาคต่อท้ายในตัวอักษรวัตถุไม่ได้อยู่ในสเป็ค ES3 แต่คำจำกัดความสำหรับอาร์เรย์เหมือนกัน
เฟลิกซ์คลิง

มันเป็นองค์ประกอบอาเรย์ที่ฉันวิ่งเข้าไปด้วยดังนั้นฉันเดาว่าไม่มีข้อแก้ตัวสำหรับ MS ไม่ว่าคุณจะตัดมันยังไง ขอขอบคุณอีกครั้ง
Adam Rackis

อัปยศกับนักสำรวจอินเทอร์เน็ต Micro $ oft
pylover

91

เพียงเตือน / เตือนภัยอย่างรวดเร็วว่านี่เป็นหนึ่งในพื้นที่ที่มาตรฐานJavaScript / ECMAScriptและมาตรฐาน JSONแตกต่างกัน เครื่องหมายจุลภาคต่อท้ายถูกต้องใน JS แต่ไม่ถูกต้องใน JSON


1
แต่แล้วอีกครั้งถ้า superset อยู่ใน "Change Of Heart", "คุณ (ยังคง) จะได้รับความรัก" ถ้าคุณเพียงแค่ปรับครั้งเดียว?
Lukas Bünger

52

อะไรที่สนุกกว่านี้ IE7 ก็ให้

[1,].length  --> 2

ในขณะที่ Firefox และ Chrome

[1,].length  --> 1

16
แต่จะช่วยให้[1,,].length Sense : เบราว์เซอร์ไม่ทำอะไรเลย 2
David Titarenco

84
ทำให้ความรู้สึกสมบูรณ์แบบ spec บอกว่าเครื่องหมายจุลภาคต่อท้าย (หมายเหตุ: เอกพจน์) ไม่ได้เพิ่มความยาวของอาร์เรย์ Chrome และ Firefox ได้ติดตั้ง ES5 อย่างถูกต้อง
JaredMcAteer

7
เมื่อมีเครื่องหมายจุลภาคต่อท้าย 2 (พหูพจน์) เพียงหนึ่งเพิ่มความยาวของอาร์เรย์ดังนั้นจึงดูเหมือนแม่นยำมากขึ้นที่จะพูดว่าเครื่องหมายจุลภาคต่อท้ายสุดท้ายจะถูกละเว้นกว่าที่จะพูดว่าจุลภาคต่อท้ายเดียวจะถูกละเว้น
iconoclast

4

คุณสามารถค้นหาข้อกำหนดสำหรับจาวาสคริปต์ (aka ECMA Script) ที่นี่ คุณสามารถค้นหาคำจำกัดความที่เกี่ยวข้องสำหรับอาร์เรย์ในหน้า 63 และตามที่เฟลิกซ์ระบุไว้การกำหนดวัตถุสองสามหน้าในภายหลังในหน้า 65

ในขณะที่สเปคนี้บอกว่ามันเป็นเรื่องดีที่จะมีส่วนท้าย,ฉันไม่รู้ว่ามันจะเป็นจริงหรือไม่ที่จะมองย้อนกลับไปสองสามเวอร์ชั่น ดังที่คุณได้จดบันทึก IE8- จะทำให้ตัวเองแย่ลงถ้าคุณปล่อยเครื่องหมายจุลภาคต่อท้าย แต่ Chrome และ FF จัดการได้ดี


ส่วนบนของหัวคุณเป็นส่วนหนึ่งของมาตรฐาน ES3 หรือไม่? ฉันดูเหมือนจะไม่พบข้อมูลจำเพาะ ES3
Adam Rackis

1
@ อดัมฉันพยายามค้นหา ... วันที่รีลีส (ES3 ถูกตีพิมพ์ในปี 1999 ES4 ถูกยกเลิกและ ES5 ได้รับการตีพิมพ์ในปี 2009 เท่านั้น) มันจะสมเหตุสมผลว่าเป็นมาตรฐาน ES3 หรืออาจเป็นได้ว่า MS ทำให้เสียอีกสิ่งหนึ่ง
Endophage

ดูเหมือนว่า MS หมดสติไปแล้วอีกหนึ่งอย่างเพราะคำตอบของเฟลิกซ์ ขอบคุณอีกครั้งสำหรับคุณ
Adam Rackis

2

มาทำลายมันกันเถอะ

จุลภาคต่อท้ายเป็นมาตรฐานใน JavaScript หรือไม่

ใช่. จากข้อกำหนดของ ECMAScript 5 (รวมถึงส่วนหนึ่งของคู่มือสไตล์ Google และ Airbnb)

เบราว์เซอร์ส่วนใหญ่เช่น Chrome และ Firefox ยอมทนหรือไม่

นี่คือคำถามสนับสนุน ECMAScript 5

Transpilers เช่น Babel จะลบเครื่องหมายจุลภาคต่อท้ายเพิ่มเติมในรหัส transpiled ซึ่งหมายความว่าคุณไม่ต้องกังวลเกี่ยวกับปัญหาเครื่องหมายจุลภาคต่อท้ายในเบราว์เซอร์ดั้งเดิม

ดังนั้นหมายความว่า:

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

โอกาสที่จะเกิดขึ้นถ้าคุณใช้อะไร ES5 ขึ้นไปคุณไม่จำเป็นต้องกังวล

ฉันคิดว่าพวกเขาเป็นมาตรฐาน แต่ IE8 puked หลังจากพบหนึ่ง - แน่นอนว่า IE ไม่สนับสนุนสิ่งที่แทบจะไม่หมายความว่ามันไม่ได้มาตรฐาน

นั่นเป็นคำถามสนับสนุน ECMAScript 5 IE8 ไม่รองรับ ECMAScript 5 (เฉพาะ IE9 ขึ้นไป)

ฉันอยากจะแนะนำให้ดูเอกสาร ES5 ที่คัดค้านของ Airbnb https://github.com/airbnb/javascript/blob/es5-deprecated/es5/README.md#commas

ฉันจะแนะนำ Docs ของ Mozilla:
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 !!!!

ฉันไม่ชอบคอมม่าต่อท้าย คนมักจะใช้พวกเขาในโครงการโอเพนซอร์สเพื่อหลีกเลี่ยงการลบบรรทัดที่เขียนโดยผู้ใช้อื่น ดูคำถามเดียวกันใน Python: https://stackoverflow.com/a/11597911/968988


13
ทำไมต้อง 'OUHHHHH' คุณคาดหวังอะไรอีกถ้าไม่มี 1 คุณชัดเจน 'มีองค์ประกอบ' ก่อนเครื่องหมายจุลภาคนั้นเช่น [1,] (ซึ่งมีความยาว: 1)
Fygo

ทำไมต้อง 'OUHHHHH' เพราะฉันไม่ได้คาดหวังอะไรจากรหัสที่ฉันไม่เข้าใจถ้าไม่อ่าน RFC และใช่มันทำงานเหมือน[1,]: มีบางอย่างชัดเจนก่อนเครื่องหมายจุลภาค แต่ใน[,]มีเป็นมากก่อนและหลังเครื่องหมายจุลภาค ดังนั้นเพราะฉันไม่เข้าใจ[,]คนเดียวฉันไม่คิดว่าการใช้[1,]เป็นความคิดที่ดี
Nicolas Zozol
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.