2010-08-31 4 views
15

tôi bumbed thành một trong những khoảnh khắc khi tôi chỉ mất tập trung và bắt đầu tự hỏi về một câu hỏi ngớ ngẩn:Loại "khóa" trong JavaScript là gì?

var a = { 
    b: "value" 
} 

là gì typeof 'b' và tôi không có nghĩa là typeof "giá trị", nhưng Khóa thực tế được gắn nhãn là b?

nền: tôi bắt đầu tự hỏi về vấn đề này khi tôi đã phải tạo ra một chìa khóa mà là một chuỗi:

var a = { 
    "b": "value" 
} 

vì tại một điểm sau đó nó được tham chiếu như:

a["b"] 

Và sau đó eneded lên tự hỏi câu hỏi ban đầu.

Trả lời

18

Về nghĩa đen đối tượng, b là một tài sản. Thuộc tính là các chuỗi trong JavaScript, mặc dù khi xác định tên thuộc tính bên trong một đối tượng theo nghĩa đen bạn có thể bỏ qua các dấu phân tách chuỗi.

Khi vòng lặp thông qua tên thuộc tính bằng cách sử dụng for...in, tên thuộc tính là một chuỗi:

for (key in a) { 
    alert(typeof key); 
    //-> "string" 
} 
+0

Bây giờ tôi đã bắt đầu tự hỏi nếu 'chìa khóa' là một chuỗi chỉ khi bạn lặp các phím trong một? - nhưng tôi đoán điều đó phụ thuộc vào việc triển khai công cụ javascript. – tunylund

+0

@tunylund: Không có phím nào luôn là một chuỗi. Tôi đã đưa ra một số ví dụ trong câu trả lời của tôi dưới đây :) –

+1

@tunylund: Như @ Daniel nói, chìa khóa luôn luôn là một chuỗi. Vì không có trường hợp sử dụng thực để kiểm tra loại khóa của đối tượng (không phải giá trị của khóa), và không có cách nào để thực hiện nó ngoài liệt kê các khóa bằng vòng lặp như thế này, nó không phải là điều bạn nên lo lắng :) –

2

b là một chuỗi, nó chỉ là một cú pháp tốc ký, vì vậy bạn viết

var a = { 
    b: "value" 
} 

thay vì

var a = { 
    "b": "value" 
} 
2

Hãy ghi nhớ rằng đối tượng JavaScript là bảng băm và các phím chỉ là chuỗi. Bạn có thể bỏ qua các dấu ngoặc kép xung quanh tên thuộc tính trong quá trình khai báo, nhưng nếu bạn sử dụng các từ dành riêng cho tên thuộc tính hoặc bất kỳ tên nào khác là mã định danh không hợp lệ, chẳng hạn như bắt đầu bằng chữ số hoặc chứa dấu cách, bạn sẽ phải bao quanh thuộc tính tên trong dấu ngoặc kép:

var a = { 
    "1b":  "value", 
    "b and c": "value", 
    "+12345": "value" 
}; 

Cũng lưu ý rằng bạn có thể tham khảo các thuộc tính của đối tượng sử dụng ký hiệu dấu chấm hoặc ký hiệu chỉ số bất kể báo giá được sử dụng khi nào được khai báo. Tuy nhiên, nếu bạn sử dụng tên thuộc tính đó sẽ là định danh hợp lệ, chẳng hạn như những người thân trong ví dụ trên, bạn buộc phải sử dụng các ký hiệu subscript:

a.1b    // invalid (dot notation) 
a["b and c"]; // valid (subscript notation) 
+0

Những mã định danh không hợp lệ đó có hoạt động trên tất cả các trình duyệt (chính) không? Bạn không mạo hiểm ném một ngoại lệ trong một số công cụ JavaScript? –

+1

@ Ký hiệu: ký hiệu chỉ số được xác định bởi đặc tả ECMA-262 và bất kỳ chuỗi nào hợp lệ. –

+0

@Marcel: Có, chúng sẽ hoạt động trên tất cả các trình duyệt. Các đối tượng là các bảng băm và chấp nhận bất kỳ chuỗi nào làm khóa (tên thuộc tính). Douglas Crockford mô tả chủ đề ở đây (phần Đối tượng): http://www.crockford.com/javascript/survey.html –

8

tên tài sản sẽ được tự động ép buộc vào một sợi dây. Bạn có thể tự mình thử bằng cách sử dụng chữ số như một tên thuộc tính.

var object = { 
    .12e3: 'wut' 
}; 
object[.12e3]; // 'wut' 
object['.12e3']; // undefined 
object['120']; // 'wut' 

// Let’s try another numeric literal: 
object = { 
    12e34: 'heh' 
}; 
object[12e34]; // 'heh' 
object['12e34']; // undefined 
object[1.2e35]; // 'heh' 
object['1.2e35']; // undefined 
object[1.2e+35]; // 'heh' 
object['1.2e+35']; // 'heh' 

Vì lý do này, tôi khuyên bạn chỉ nên sử dụng các chuỗi ký tự cho tên thuộc tính.

Từ Unquoted property names/object keys in JavaScript, tôi viết lên về đề tài này:

Quotes chỉ có thể được bỏ qua nếu tên tài sản là nghĩa đen một số hoặc a valid identifier name.

[…]

Ký hiệu khung có thể được sử dụng an toàn cho tất cả các tên thuộc tính.

[...]

ký hiệu Dot thể chỉ được sử dụng khi tên thuộc tính là một cái tên định danh hợp lệ.

Tôi cũng đã tạo một công cụ cho bạn biết nếu bất kỳ tên thuộc tính cụ thể nào có thể được sử dụng mà không có dấu ngoặc kép và/hoặc có ký hiệu dấu chấm. Hãy thử nó tại mothereff.in/js-properties.

Screenshot

0

var a = {$ : 'hello', 2123 : 'number'}; 
 
for(var key in a) { 
 
    console.log(typeof key) 
 
}

Keys trong javascript đối tượng có thể được chuỗi và biểu tượng. biểu tượng là một kiểu dữ liệu nguyên thủy trong javascript.