IT story

배열과 객체의 후행 쉼표가 사양의 일부입니까?

hot-time 2020. 5. 6. 21:05
반응형

배열과 객체의 후행 쉼표가 사양의 일부입니까?


JavaScript에서 후행 쉼표가 표준입니까, 아니면 Chrome 및 Firefox와 같은 대부분의 브라우저가 허용합니까?

나는 그것들이 표준이라고 생각했지만 IE8은 하나를 만난 후 당황했습니다. 물론 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(); }
};

사양 : ECMAScript 5ECMAScript 3


ECMAScript 5 사양의 섹션 11.1.5 :

ObjectLiteral :
    { }
    { PropertyNameAndValueList }
    { PropertyNameAndValueList , }

예, 사양의 일부입니다.

업데이트 : 분명히 이것은 ES5의 새로운 기능입니다. ES3 (41 페이지)에서 정의는 다음과 같습니다.

ObjectLiteral :
    { }
    { PropertyNameAndValueList }

배열 리터럴 ( 11.1.4 절 )의 경우 훨씬 더 흥미 롭습니다 ( 업데이트 : ES3에 이미 존재 함).

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

( Elision_optElision opt있는 곳 Elision이 선택 사항임을 의미합니다)

Elision 로 정의

Elision :
    ,
    Elision ,

따라서 배열 리터럴은

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

완벽하게 합법적입니다. 이렇게하면 요소가 두 개인 배열이 만들어 지지만 배열 길이는로 설정됩니다 2 + 3 = 5.

IE (IE9 이전)에서 너무 많이 기대하지 마십시오 ...


이것이 JavaScript / ECMAScript 표준JSON 표준이 다른 영역 중 하나라는 것을 간단히 알리십시오 . 후행 쉼표은 유효 JS뿐만 유효하지 JSON있다.


더 재미있는 것, IE7은

[1,].length  --> 2

파이어 폭스와 크롬

[1,].length  --> 1

You can find the specification for javascript (aka ECMA Script) here. You can find the relevant definition for arrays on page 63 and as Felix noted, the object definition a couple of pages later on page 65.

While this specification says it is fine to have a trailing , I don't know if that would be true looking back a few versions. As you've noted IE8- will crap itself if you leave a trailing comma but Chrome and FF handle it fine.


On Chrome 52 :

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

I just don't like trailing commas. People usually use them in Open Source projects for avoiding to erase the line written by another commiter. See the same question in Python : https://stackoverflow.com/a/11597911/968988


Let's break this down.

Are trailing commas standard in JavaScript?

Yes. As of the ECMAScript 5 specification (also part of the Google and Airbnb style guide)

Do most browsers like Chrome and Firefox just tolerate them?

This is an ECMAScript 5 support question.

Transpilers like Babel will remove the additional trailing comma in the transpiled code which means you don’t have to worry about the trailing comma problem in legacy browsers.

So that means:

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

So chances are if you're using anything ES5 and up you don't need to worry about it.

I thought they were standard, but IE8 puked after encountering one—of course IE not supporting something hardly means it’s not standard.

Again, that's an ECMAScript 5 support question. IE8 doesn't support ECMAScript 5 (only IE9 and up)

I would highly recommend taking a look Airbnb's ES5 deprecated Documentation https://github.com/airbnb/javascript/blob/es5-deprecated/es5/README.md#commas

I would also recommend the Mozilla's Docs:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Trailing_commas

참고URL : https://stackoverflow.com/questions/7246618/are-trailing-commas-in-arrays-and-objects-part-of-the-spec

반응형