2011-08-30 88 views
196

JavaScript中的拖尾逗號標準,還是像Chrome和Firefox這樣的大多數瀏覽器只能容忍它們?數組和對象中的尾隨逗號是規範的一部分嗎?

我以爲他們是標準的,但遇到一個 - 當然IE不支持的東西幾乎意味着它不是標準後IE8吐。

這裏是我的意思(書數組的最後一個元素之後)的一個例子:

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(); } 
}; 
+0

發現這個另一天。作爲一名C#程序員,我很習慣他們被允許... – CaffGeek

+4

幾周前我處理了這個問題。試想在IE7中找不到任何更新的調試工具... –

+4

當我發現JS,Ruby,C#等語言支持這一功能時,它使我感到高興 - 使複製粘貼測試數據變得簡單......當我即使在這個實現IE吮吸... –

回答

194

規格:ECMAScript 5ECMAScript 3


中的ECMAScript 5規範Section 11.1.5

ObjectLiteral : 
    { } 
    { PropertyNameAndValueList } 
    { PropertyNameAndValueList , } 

所以,是的,是T的一部分他的規格。

更新:顯然,這是新的ES5。在ES3(第41頁),定義只是:

ObjectLiteral : 
    { } 
    { PropertyNameAndValueList } 

對於數組常量(Section 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的標準?我似乎無法找到它的規格 –

+2

它在這裏:http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%203rd%20edition,%20December%201999 .pdf –

+1

顯然,對象文字中的尾隨逗號不在ES3規範中。但是數組的定義是一樣的。 –

3

你可以找到的JavaScript(又名ECMA腳本)here規範。你可以找到陣列的相關定義,第63頁和菲利克斯注意到,對象定義一對夫婦的第65頁。

雖然本說明書說,這是罰款,有一個尾隨,我不知道以後的頁面這是真的回顧幾個版本。正如你已經注意到的IE8 - 如果你留下一個尾隨的逗號,會自殺,但鉻和FF處理罰款。

+0

關閉你的頭腦,這是ES3標準的一部分嗎?我似乎無法找到ES3規格 –

+1

@Adam我一直在試圖找到它......考慮到發佈日期(ES3於1999年發佈,ES4被放棄,ES5僅在2009年發佈),它會使感覺它是在ES3標準中。或者,這可能是因爲MS搞砸了一件事。 – Endophage

+0

看起來,MS給Felix的答案搞砸了一件事。再次感謝您的支持 –

48

什麼是更有趣,IE7提供了

[1,].length --> 2 

而Firefox和Chrome

[1,].length --> 1 
+16

但是'[1 ,,]。length'給出了'2'。 **感**:瀏覽器沒有。 –

+81

具有完美意義,規範說,一個(注:單數)尾隨逗號不會添加到數組的長度。 Chrome和Firefox已經正確實施了ES5。 – JaredMcAteer

+3

真是一個驚喜! –

81

在此提醒/警告,這是其中JavaScript/ECMAScript standardJSON standard不同的領域之一;尾隨逗號是有效在JS中,但在JSON中無效

+8

該死的你子集!你會被愛過,,, – dakab

+0

但是,如果超級是爲了一個「改變心臟」,「你可以(仍然)被愛」,如果你只是一次調整? –

0

在Chrome 52:

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

我只是不喜歡尾隨逗號。人們通常在開放源碼項目中使用它們來避免擦除另一個提交者寫入的行。在Python中查看相同的問題:https://stackoverflow.com/a/11597911/968988

+10

爲什麼'OUHHHHH'?如果不是1,你還有什麼期望?在逗號前面顯然有'元素',就像[1,](長度爲1)。 – Fygo

0

讓我們來分解它。

JavaScript中的尾隨逗號標準嗎?

是的。至於ECMAScript 5規範(也是Google和Airbnb風格指南的一部分)

像Chrome和Firefox這樣的大多數瀏覽器只是容忍它們嗎?

這是一個ECMAScript 5支持問題。

像Babel這樣的轉譯器會刪除轉譯代碼中的附加逗號,這意味着您不必擔心傳統瀏覽器中的後綴逗號問題。

因此,這意味着:

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

因此機會是,如果你使用的是什麼ES5和高達你不必擔心。

我認爲他們是標準的,但IE8嘔吐遇到一個當然IE不支持的東西幾乎意味着它不是標準。

同樣,這是一個ECMAScript 5支持問題。 IE8不支持的ECMAScript 5(僅IE9及以上)

我會強烈建議考慮看看Airbnb的ES5過時文檔 https://github.com/airbnb/javascript/blob/es5-deprecated/es5/README.md#commas

我也想建議Mozilla的文檔:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Trailing_commas

相關問題