2012-01-09 36 views
5

Tôi vừa nhận thấy rằng tôi có thể làm như sau trong javascript ...Sử dụng dấu hai chấm trong javascript tên biến (ví dụ a:. B: c)

a:b:c:d = "happy days"; 
a:b:c = function(text){alert(text);}; 

Tôi không thể tuy nhiên làm ...

var a:b:c:d = "happy days"; 
// or 
var myObj = {prop:a:b:c:d}; 

Tôi không mong đợi cú pháp này hoạt động trong bất kỳ trường hợp nào. Có ai có bất kỳ ý tưởng gì đang xảy ra khi tôi sử dụng thành công ký hiệu 'a: b = x'?

+0

Điều đó đặc biệt, nghĩa là. Bạn thậm chí có thể đọc lại giá trị mà tôi thực sự không ngờ tới. –

+0

'd ==" ngày hạnh phúc "' –

+1

'a: b: c: d =" ngày hạnh phúc ";' chỉ định ''ngày hạnh phúc'' thành' d'. không phải là 'a: b: c: d' .. –

Trả lời

4

Trích dẫn tiêu chuẩn ECMAScript: “Một Bản Tuyên Bố có thể được bắt đầu bằng một nhãn. Các câu lệnh được gắn nhãn chỉ được sử dụng cùng với các tuyên bố có nhãn là breakcontinue. ”Nhãn bao gồm số nhận dạng và dấu hai chấm. Vì vậy, a:b:c:d = "happy days"; chỉ là câu lệnh gán d = "happy days"; được bắt đầu bằng ba nhãn, không có hiệu lực như vậy.

14

Một thư đại tràng trong ECMAScript là có vì ba lý do

  • tách phím đối tượng từ các giá trị của nó tuyên bố
  • inline có điều kiện
  • ghi nhãn

bạn discoverd sau này. Những gì bạn đang làm cơ bản là tạo một nhãn gọi là a, sau đó b, sau đó c và cuối cùng bạn chỉ định giá trị cho biến toàn cầu d. Vì vậy, sau

a:b:c:d = "happy days"; 

console.log(a); // reference error 
console.log(d); // "happy days"; 

sử dụng phổ biến nhất cho điều này là trong một tuyên bố switch nơi chúng tôi làm điều đó như

switch(foo) { 
    case 0: break; 
    case 1: break; 
    // etc 
} 

Nhưng bạn cũng có thể trực tiếp "mục tiêu" một nhãn với báo cáo kết quả continue. Mà đến rất gần với goto trong nhiều ngôn ngữ khác và trông giống như

foobar: 
for(var i = 0; i < 10; i++) { 
    for(var j = 0; j < 10; j++) { 
     if(j === 2) 
      continue foobar; 
    } 
} 
+2

Tôi đồng ý rằng đây là các nhãn, nhưng tôi nghĩ "trường hợp x:" là cách sử dụng thay thế của dấu hai chấm, vì các nhãn dường như phục vụ đúng như các điểm tham chiếu cho các câu lệnh ngắt và tiếp tục, không chuyển đổi câu lệnh. Ngoài ra, nếu bạn muốn hoàn thành, dấu hai chấm cũng được sử dụng trong các câu lệnh chuyển đổi nội tuyến (a? B: c;). –

+0

@ skier88: vâng, bạn đã đúng, quên các điều kiện nội tuyến. Đối với 'switch/case', tôi luôn nghĩ rằng một trường hợp được coi là một nhãn hiệu khá nhiều, nhưng tôi sẽ xem xét điều đó. – jAndy

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