2016-05-09 20 views
5

Trong JavaScript khi bạn xác định một mảng bằng cách sử dụng cú pháp theo nghĩa đen, các phần tử mảng có thể được bỏ qua bằng cách sử dụng dấu phẩy thêm:Các phần tử mảng ưu tú có bao giờ tạo ra một tài sản riêng không?

a = [1, 2, 3]; // 1, 2, 3 
b = [1, , 2, 3]; // 1, undefined, 2, 3 

tôi nhận thấy rằng khi truy cập vào các giá trị mà các giá trị bỏ qua không "tài sản riêng"

b.hasOwnProperty(1); //false 

Ngược lại, nếu bạn định nghĩa một mảng thiết một cách rõ ràng undefined, nó sẽ được thiết lập như là một "tài sản riêng":

c = [1, undefined, 2, 3]; 
c.hasOwnProperty(1); //true 

Hành vi của các phần tử mảng bị bỏ qua được xác định trong một spec? Nếu có, spec nào và ở đâu?

(tiền thưởng tùy chọn) Là trình duyệt chéo đáng tin cậy, chẳng hạn như bằng chứng là bảng tương thích?

+0

Đó là thông số kỹ thuật. http://es5.github.io/#x11.1.4 * "Các phần tử mảng có thể được elided ở đầu, giữa hoặc cuối của danh sách phần tử. Bất cứ khi nào một dấu phẩy trong danh sách phần tử không có trước bởi một AssignmentExpression (ví dụ, một dấu phẩy ở đầu hoặc sau dấu phẩy khác), phần tử mảng bị thiếu góp phần vào chiều dài của mảng và làm tăng chỉ mục của các phần tử tiếp theo. không đóng góp vào chiều dài của Mảng. "* –

+1

Hoặc trong thông số hiện tại: http://www.ecma-international.org/ecma-262/6.0/#sec-array-initializer – nils

+0

@squint, tôi thấy rằng báo giá cụ thể, nhưng nó không nói liệu việc triển khai được dự kiến ​​sẽ thực hiện nó như là một phần tử bị thiếu hay là một phần tử được đặt thành 'undefined'. Ít nhất là tôi hiểu nó. – zzzzBov

Trả lời

3

Hành vi cho cách các phần tử mảng bị bỏ qua được chỉ định trong thông số kỹ thuật?

Có.

Nếu vậy, Spec

Đặc tả ECMAScript. Ít nhất trong các bản sửa đổi 3, 5, 5.1 và 6.

và ở đâu?

Trong ngữ nghĩa của biểu thức theo nghĩa đen mảng, được đưa ra bởi Mảng Initializer phần (ES5, ES6). Nó cho biết

[…] phần tử mảng bị thiếu góp phần vào chiều dài của mảng và tăng chỉ mục của các phần tử tiếp theo [, nhưng chúng] không được xác định.

Khi đánh giá các biểu thức, chúng đơn giản bị bỏ qua - chúng được tính nhưng không tạo thuộc tính dữ liệu trên thể hiện mảng, trái với biểu thức gán tạo thành phần.

Trình duyệt có đáng tin cậy không?

Có, ngay cả những người khám phá Internet cũ cũng làm điều đó. Các quirks duy nhất là they count a trailing comma as an elision, mà nó không nên, và nhận được .length sai.

0

Các thành phần mảng ưu tú có bao giờ sản xuất thuộc tính riêng không?

Từ bình luận squint 's, mà nguồn gốc tài liệu trên Annotated ECMAScript 5.1,

phần tử mảng Elided được không được định nghĩa.

Lưu ý rằng điều này không có nghĩa là undefined. Vì vậy, không, yếu tố ưu tú không được xác định và do đó, hasOwnProperty() trả về false.

+0

Tôi không rõ ràng về cách điều này trả lời câu hỏi của tôi cả. 'hasOwnProperty' thực hiện một chuỗi thành chuỗi, đó là lý do tại sao tôi không bận tâm khi sử dụng' b.hasOwnProperty ('1') '. Lưu ý rằng '[undefined]' sẽ có một phần tử duy nhất là thuộc tính riêng. 'undefined' như một giá trị không có gì liên quan đến trạng thái của thuộc tính là thuộc tính riêng. – zzzzBov

+0

@zzzzBov Tôi cập nhật câu trả lời của mình để rõ ràng hơn trước khi bạn nhận xét:] Tôi đã bỏ một chút cho bất kỳ tài liệu nào nói rằng 'hasOwnProperty'" thực hiện một chuỗi thành chuỗi "nhưng không tìm thấy gì bảo vệ điều đó. Bạn có phiền khi cung cấp cho tôi một nguồn không? Các nguồn duy nhất tôi thấy rằng nhận xét về điều này một cách rõ ràng nói rằng tham số là một 'chuỗi'. Cảm ơn! – 8protons

+1

@ 8protons: [The spec] (http://es5.github.io/#x15.2.4.5) xác định nó để ép buộc tham số của nó thành một chuỗi như là bước đầu tiên của nó. –

Các vấn đề liên quan