2010-05-20 25 views
10

Vui lòng tham khảo mã bên dưới, khi tôi "nhận xét" một trong các dòng nhận xét, nó gây ra lỗi (trong IE) của "':' được mong đợi". Vì vậy, sau đó là kết luận của tôi đúng, rằng điều này không có khả năng cung cấp một tham chiếu đến một giá trị đối tượng, như là một khóa đối tượng trong một chuỗi chữ; đây có phải là vấn đề thông dịch/phân tích cú pháp nghiêm ngặt không? Đây có phải là một ứng cử viên cho một phần "khủng khiếp" (hoặc ít nhất là "xấu") của Javascript, trái ngược với "phần tốt" của Crockford?Hạn chế khóa chữ của đối tượng Javascript này có phải là do phân tích cú pháp không?

<script> 
var keys = {'ONE': 'one'}; 

//causes error: 
//var obj1 = {keys.ONE: 'value1'}; 
//var obj1 = {keys['ONE']: 'value1'}; 

//works 
var obj1 = {}; 
obj1[keys.ONE] = 'value1'; 

//also works 
var key_one = keys.ONE; 
var obj2 = {key_one: 'value1'}; 
</script> 
+1

BTW 'var key_one = keys.ONE; var obj2 = {key_one: 'value1'}; 'không hoạt động như bạn mong đợi. Thuộc tính 'obj2' sẽ là' key_one' và không phải là giá trị của 'key.ONE' do đó không phải' one'. – RoToRa

+1

Lưu ý rằng mặc dù ví dụ cuối cùng hoạt động, nó tạo một đối tượng với thuộc tính 'key_one', không phải thuộc tính' keys.One'. Biến 'key_one' không liên quan đến đối tượng chữ trong dòng tiếp theo. – Guffa

+0

nhận nó .... có thể gây nhầm lẫn .... nó hoặc là không cho phép tất cả các chuỗi "không được kiểm soát", hoặc không tham khảo các tham chiếu, bất kể chúng có thể là gì –

Trả lời

15

Giới hạn của cú pháp đối tượng theo nghĩa đen là tên phải là chữ. Vì các tên có thể được chỉ định như một định danh cũng như một chuỗi, nên không thể sử dụng một biến để thay thế.

này sẽ tạo ra một đối tượng với một tài sản n, không phải là một tài sản answer:

var n = 'answer'; 
var o = { n: 42 }; 
+0

Chữ số cũng là tên thuộc tính hợp lệ là tốt. Ngoài ra, trong ES5, tên có thể được chỉ định làm tên nhận dạng (nghĩa là, không chỉ là số nhận dạng, mà còn là các từ dành riêng). Xem http://stackoverflow.com/a/9568622/96656. –

6

Bạn không thể sử dụng các biến như phím khi xác định các đối tượng với {}

Do đó họ đang được hiểu là tên chuỗi và có thể bao gồm duy nhất của nhân vật sẵn cho tên biến

các

objectname[anythingThatReturnsValue]='value1'; là con đường để đi.

CŨNG

Bạn có thể tạo một chuỗi và phân tích nó

var s='{"'+keys.ONE+'": "value1"}'; 
var obj=JSON.parse(s); 
//or 
s='var obj2='+s; 
eval(s); 

Cả hai phương pháp trên là thông lệ xấu cho việc tạo các đối tượng trong Javascript và tôi không khuyên bạn nên cho họ.

+0

Bạn CÓ THỂ sử dụng biến như các phím khi định nghĩa các đối tượng bằng {}, hãy xem khối thứ hai "cũng hoạt động". –

+1

@George: Không, bạn không thể. Mã chạy, nhưng nó không sử dụng biến trong đối tượng chữ. – Guffa

+0

@George: Anh ấy có nghĩa là "lỗi cú pháp" và không có bất kỳ điều gì bạn có thể làm về nó :) –

2

Hãy suy nghĩ về nó: nếu nó là để làm việc theo cách bạn muốn nó sẽ hoàn toàn giới thiệu một sự mơ hồ ngôn ngữ.

Hai câu lệnh này tương đương với JavaScript, vì các phím bareword được "tự động". Vì vậy, nếu something có nghĩa là chuỗi chữ "cái gì đó", làm thế nào nó cũng có thể tham khảo biến "cái gì đó". Nó không thể. Vì vậy, nếu bạn muốn sử dụng các biến, chúng phải đi theo ký hiệu ngoặc vuông thay vì ký hiệu key : value.

1

Bạn có thể thử:

var obj = {}; 
var val = 'foo'; 

obj[val] = 'bar'; 

obj.foo >>> 'bar'; 
Các vấn đề liên quan