Các dấu phẩy có trong mảng và đối tượng là một phần của thông số không?


215

Là dấu phẩy chuẩn trong JavaScript hoặc hầu hết các trình duyệt như Chrome và Firefox chỉ chấp nhận chúng?

Tôi nghĩ rằng chúng là tiêu chuẩn, nhưng IE8 đã nổi giận sau khi gặp phải một điều tất nhiên là IE không hỗ trợ một cái gì đó khó có nghĩa là nó không chuẩn.

Đây là một ví dụ về ý tôi muốn nói (sau phần tử cuối cùng của mảng sách):

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

Tìm thấy cái này vào ngày khác. Trở thành lập trình viên C # Tôi đã quá quen với việc họ được phép ...
CaffGeek

5
Tôi đã giải quyết điều này một vài tuần trước. Hãy tưởng tượng bạn đang cố gắng tìm kiếm cái này trong IE7 mà không cần bất kỳ công cụ gỡ lỗi mới nào ...
Ryan Miller

4
Nó làm tôi vui khi tôi phát hiện ra các ngôn ngữ như JS, Ruby, C # hỗ trợ điều này giúp cho việc sao chép dữ liệu kiểm tra sao chép dễ dàng ... nó làm tôi tức giận khi tôi nhận ra IE hút ngay cả điều này ...
Adam Rackis

Tôi tự hỏi nếu khoảng trắng đáng kể thay vì dấu phẩy (giống như CoffeeScript) sẽ gây ra bất kỳ sự mơ hồ cú pháp nào?
Andy

Câu trả lời:


209

Thông số kỹ thuật: ECMAScript 5ECMAScript 3


Mục 11.1.5 trong đặc tả ECMAScript 5:

ObjectLiteral :
    { }
    { PropertyNameAndValueList }
    { PropertyNameAndValueList , }

Vì vậy, có, nó là một phần của đặc điểm kỹ thuật.

Cập nhật: Rõ ràng đây là tính năng mới trong ES5. Trong ES3 (trang 41), định nghĩa chỉ là:

ObjectLiteral :
    { }
    { PropertyNameAndValueList }

Đối với mảng bằng chữ ( Mục 11.1.4 ), điều đó thậm chí còn thú vị hơn ( Cập nhật: điều này đã tồn tại trong ES3):

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

(trong đó lựa chọnElision_opt Elision , có nghĩa là Elision là tùy chọn)

Elision được định nghĩa là

Elision :
    ,
    Elision ,

Vì vậy, một mảng theo nghĩa đen

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

là hoàn toàn hợp pháp. Điều này tạo ra một mảng có hai phần tử nhưng đặt độ dài của mảng thành 2 + 3 = 5.

Đừng mong đợi quá nhiều từ IE (trước IE9) ...


1
Như tôi đã hỏi EndoPhage, bạn có biết đây có phải là tiêu chuẩn trong ES3 không? Tôi dường như không thể tìm thấy thông số kỹ thuật cho nó
Adam Rackis

2
Nó ở đây: ecma
Felix Kling

1
Rõ ràng, dấu phẩy trong chữ nghĩa đối tượng không có trong thông số ES3. Nhưng định nghĩa cho mảng là như nhau.
Felix Kling

Chà, đó là các yếu tố mảng mà tôi gặp phải, vì vậy tôi đoán không có lý do gì cho MS cho dù bạn cắt nó như thế nào. Cảm ơn một lần nữa
Adam Rackis

Xấu hổ về Micro $ oft Internet explorer
pylover

91

Chỉ cần nhắc nhở / cảnh báo nhanh rằng đây là một trong những lĩnh vực tiêu chuẩn JavaScript / ECMAScripttiêu chuẩn JSON khác nhau; dấu phẩy dấu là hợp lệ trong JS nhưng không hợp lệ trong JSON.


1
Nhưng một lần nữa, nếu superset dành cho "Change Of Heart", "Bạn có thể (vẫn) được yêu" nếu bạn chỉ một lần điều chỉnh?
Lukas Bünger

52

Điều thú vị hơn nữa, IE7 mang lại

[1,].length  --> 2

trong khi Firefox và Chrome

[1,].length  --> 1

16
Nhưng [1,,].lengthcho 2. Sense : trình duyệt không có.
David Titarenco

84
Làm cho cảm giác hoàn hảo, thông số kỹ thuật nói rằng dấu phẩy (ghi chú: số ít) không thêm vào chiều dài của một mảng. Chrome và Firefox đã triển khai ES5 một cách chính xác.
JaredMcAteer

7
Khi có 2 dấu phẩy (số nhiều), chỉ có một dấu phẩy thêm vào độ dài của mảng, vì vậy có vẻ chính xác hơn để nói rằng dấu phẩy dấu cuối cùng bị bỏ qua hơn là dấu phẩy dấu phẩy đơn bị bỏ qua.
iconoclast

4

Bạn có thể tìm thấy đặc tả cho javascript (còn gọi là ECMA Script) tại đây . Bạn có thể tìm thấy định nghĩa có liên quan cho các mảng trên trang 63 và như Felix đã lưu ý, đối tượng định nghĩa một vài trang sau trên trang 65.

Mặc dù thông số kỹ thuật này nói rằng thật tốt khi có một dấu vết, ,tôi không biết liệu điều đó có đúng không khi nhìn lại một vài phiên bản. Như bạn đã lưu ý IE8- sẽ tự hoạt động nếu bạn để lại dấu phẩy nhưng Chrome và FF xử lý tốt.


Nằm trên đỉnh đầu của bạn, đây có phải là một phần của tiêu chuẩn ES3 không? Tôi dường như không thể tìm thấy thông số ES3
Adam Rackis

1
@Adam Tôi đã cố gắng tìm nó ... Cho đến ngày phát hành (ES3 được xuất bản năm 1999, ES4 đã bị bỏ rơi và ES5 chỉ được xuất bản vào năm 2009), điều đó có nghĩa là nó nằm trong tiêu chuẩn ES3. Hoặc có thể là MS đã làm hỏng thêm một điều nữa.
Endophage

Có vẻ như MS đã làm hỏng thêm một điều nữa cho câu trả lời của Felix. Cảm ơn một lần nữa cho bạn
Adam Rackis

2

Hãy phá vỡ điều này.

Là dấu phẩy chuẩn trong JavaScript?

Đúng. Theo đặc tả ECMAScript 5 (cũng là một phần của hướng dẫn kiểu Google và Airbnb)

Có phải hầu hết các trình duyệt như Chrome và Firefox chỉ chấp nhận chúng?

Đây là một câu hỏi hỗ trợ ECMAScript 5.

Các bộ chuyển đổi như Babel sẽ xóa dấu phẩy bổ sung trong mã được dịch mã, điều đó có nghĩa là bạn không phải lo lắng về vấn đề dấu phẩy trong các trình duyệt cũ.

Vậy điều đó có nghĩa là:

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

Vì vậy, cơ hội là nếu bạn đang sử dụng bất cứ thứ gì ES5 trở lên, bạn không cần phải lo lắng về điều đó.

Tôi nghĩ rằng chúng là tiêu chuẩn, nhưng IE8 đã nổi giận sau khi gặp phải một điều tất nhiên là IE không hỗ trợ một cái gì đó khó có nghĩa là nó không chuẩn.

Một lần nữa, đó là một câu hỏi hỗ trợ ECMAScript 5. IE8 không hỗ trợ ECMAScript 5 (chỉ IE9 trở lên)

Tôi đặc biệt khuyên bạn nên xem Tài liệu không dùng ES5 của Airbnb https://github.com/airbnb/javascript/blob/es5-deprecated/es5/README.md#commas

Tôi cũng muốn giới thiệu Tài liệu của Mozilla:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Trailing_commas


1

Trên Chrome 52:

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

Tôi chỉ không thích dấu phẩy. Mọi người thường sử dụng chúng trong các dự án Nguồn mở để tránh xóa dòng được viết bởi một người khác. Xem câu hỏi tương tự trong Python: https://stackoverflow.com/a/11597911/968988


13
Tại sao 'NGOÀI'? Những gì bạn đã mong đợi ở đó nếu không 1? Bạn rõ ràng 'có một phần tử' trước dấu phẩy đó, giống như [1,] (đó là độ dài: 1).
Fygo

Tại sao 'NGOÀI'? bởi vì tôi không mong đợi bất cứ điều gì từ một mã mà tôi không hiểu nếu không đọc RFC. Và vâng, nó hoạt động giống như [1,]: rõ ràng có một cái gì đó trước dấu phẩy. Nhưng trong [,]đó có nhiều như trước và sau dấu phẩy. Vì vậy, vì tôi không hiểu [,]một mình, tôi không nghĩ sử dụng [1,]là ý tưởng tốt.
Nicolas Zozol
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.