Bạn có thể giải thích cách biểu thức JavaScript:Biểu thức JavaScript [1 [{}]] phân tích cú pháp chính xác như thế nào?
[1 [{}]]
phân tích/đánh giá? Trong Firefox, Chrome, Konqueror và tê giác, dường như tạo một mảng với một phần tử đơn lẻ, undefined
. Tuy nhiên, tôi không hiểu tại sao.
Trong Firefox:
[1 [{}]].toSource()
sản xuất
[(void 0)]
Thay thế 1 với giá trị JavaScript khác dường như mang lại kết quả tương tự.
Cập nhật: Tôi nghĩ tôi đã hiểu ngay bây giờ. codeka, Adrian và CMS làm rõ mọi thứ. Theo như tiêu chuẩn, tôi đã cố gắng đi qua ECMAScript 5.
1 [{}]
là một người truy cập thuộc tính, do đó, nó được đề cập trong §11.2.1.baseReference
là kết quả của việc đánh giá1
, vì vậy vẫn còn1
.baseValue = GetValue(baseReference) == 1
.- Tại
GetValue
(§8.7.1),Type(1)
không phải làReference
(một tên giải quyết ràng buộc), do đó trở 1. propertyNameReference
là kết quả của việc đánh giá{}
, vì vậy một đối tượng rỗng.propertyNameValue = GetValue(propertyNameReference) == {}
- Tại
CheckObjectCoercible(baseValue)
(§9.10), chúng tôi trở lại (Số là đối tượng có thể cưỡng chế). propertyNameString = ToString(propertyNameValue)
- Tại
ToString
(§9.8), trở vềToString(ToPrimitive({}, hint String))
- Tại
ToPrimitive
(§9.1), trả lại kết quả của đối tượng[[DefaultValue]]
, đi quaPreferredType
(string). - Tại
[[DefaultValue]]
(§8.12.8), hãy để toString là kết quả của[[Get]]
với đối sốtoString
. - Điều này được xác định tại §15.2.4.2 để trả về
"[object " + [[Class]] + "]"
, trong đó[[Class]]
là "Đối tượng" cho mẫu đối tượng mặc định. - Vì có một số gọi là
toString
, chúng tôi gọi nó là đối sốthis
là{}
. - Trả về giá trị loại
Reference
, có giá trị cơ bản làBaseValue
(1) và tên được tham chiếu làpropertyNameString
("[object Object]"
).
Sau đó chúng tôi đi tới bộ khởi tạo mảng (§11.1.4) và xây dựng một mảng phần tử đơn lẻ với kết quả.
Tôi không chắc chắn lý do tại sao điều này sẽ có giá trị JavaScript ... để bạn có được kết quả không thể đoán trước của động cơ * cố gắng * để xử lý nó. ..tình trạng bình thường đối với tôi. –
@Nick, tôi cũng hoài nghi rằng đó là JS hợp lệ, và tôi sẵn sàng chấp nhận khả năng đó là hành vi không xác định đơn giản. Tuy nhiên, thực tế là tất cả 4 động cơ (có cài đặt riêng biệt) phân tích nó theo cùng một cách là ít nhất là thú vị. –
@Matthew - câu trả lời của Adrian là một lời giải thích khá tốt về hành vi trong 4 trình duyệt đó, tôi vẫn không nghĩ rằng '[object]' là một accessor hợp lệ mặc dù ... vì vậy nó vẫn sẽ tùy thuộc vào từng công cụ sẽ xử lý trường hợp này. Đây là một trường hợp cạnh mặc dù, và tôi không thể tìm thấy bất cứ điều gì trong spec 3.1 nói rằng nó phải được xử lý chính xác như thế nào. –