2011-11-18 27 views
17

Tôi dường như không có khả năng xác định một cái gì đó như:Javascript assoc mảng với int phím âm

var a = {-1: 'Apple', -2: 'Orange'} 

Safari của tôi phàn nàn về một syntax error near '-'. Parens không giúp được gì, tức là {(-1): ... - trong trường hợp đó Safari không thích dấu mở đầu.

Nếu tôi muốn các phím chỉ là ints, không phải là dây, cách thích hợp để xây dựng một mảng assoc là gì, nếu có?

+0

Có lý do thuyết phục nào không sử dụng chuỗi không? Đó là: 'var a = {" -1 ":" Apple "};'. –

+4

Bạn nhận ra rằng tất cả các phím là chuỗi phải không? 'var a = {1: 2}' sẽ chỉ chuyển đổi '1' thành' "1" ' – Raynos

+0

@Raynos, cảm ơn, không biết điều đó, và điều đó giải thích mọi thứ. – mojuba

Trả lời

20

Xem phần 11.1.5 của ECMAScript Language Specification: có bạn sẽ thấy rằng PropertyName có thể thực sự trở thành một NumericLiteral, nhưng phần 7.8.3 của đặc tả chỉ ra rằng NumericLiteral có thể không bắt đầu với dấu trừ. Những gì trông giống như "chữ" trong ví dụ của bạn là các biểu thức thực sự bao gồm toán tử đơn nhất - và Chữ số số.

Tuy nhiên, PropertyName có thể không phải là một biểu hiện: nó chỉ có thể là một tên định danh, một số chữ hoặc một chuỗi chữ đó cho thấy rằng bạn có thể viết

{'-1': 'Apple', '-2': 'Orange'} 

Nhờ GetFree cho việc tìm kiếm chính xác giải trình!

+1

Đó không phải là lý do. Phần bạn trích dẫn giải thích rằng các chữ số được chuyển đổi nội bộ thành chuỗi anyways do đó không có sự khác biệt giữa cả hai khi được sử dụng làm khóa.Lý do thực tế tại sao bạn không thể sử dụng số âm là bởi vì số âm là biểu thức (dấu trừ theo sau là chữ số) và bạn không thể sử dụng expresions làm khóa trong đối tượng theo nghĩa đen. – GetFree

+0

Bạn nói đúng. Mục 7.8.3 ngụ ý rằng các chữ số có thể không bắt đầu bằng dấu trừ và phần 11.1.5 ngụ ý các biểu thức có thể không phải là tên thuộc tính. Đây thực sự là lời giải thích đúng. Cảm ơn! –

17

Chỉ cần bọc chúng trong dấu ngoặc kép. Bạn vẫn có thể truy cập với số lượng:

var a = {"-1": 'Apple', "-2": 'Orange'} 
a[-1]; // Apple; 
+0

Điều đó hiển nhiên, tôi đã nói trong câu hỏi rằng tôi cần chúng là ints chứ không phải là chuỗi. Câu trả lời đúng là các khóa nội bộ luôn là chuỗi nên không có lý do gì để không trích dẫn chúng. – mojuba

+0

Chính xác thì "Tôi cần chúng là ints" nghĩa là gì? Bạn không thể cung cấp số âm vì khóa cần phải là giá trị bằng chữ và '-' là toán tử âm đơn nhất, làm cho nó trở thành một biểu thức. – Dennis

+0

Trong JavaScript, khi bạn mong đợi một cái gì đó là một số thay vì một chuỗi có thể có hậu quả, ví dụ: 'i + 1' cho kết quả khác nhau tùy thuộc vào loại' i'. Nhưng câu hỏi này đã được trả lời: trong các khóa JavaScript luôn được chuyển thành chuỗi. – mojuba

3

Trích dẫn tác phẩm cho tôi:

var a = {'-1': 'Apple', '-2': 'Orange'}; 
console.log(a[-1]); 
0

Không có cách nào để làm cho các phím số nguyên âm. Nếu bạn muốn thực hiện một khóa phủ định, bạn sẽ phải làm cho các chuỗi này giống như sau:

var a = {"-1": 'Apple', "-2": 'Orange'} 

Sau đó bạn có thể chuyển đổi qua lại bằng parseInt và toString trong mã khác nếu cần.