2012-01-09 25 views
5

我剛纔注意到,我可以做在JavaScript以下...使用冒號在JavaScript變量的名稱(如:B:C)

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

我卻無法做到......

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

我不希望這種語法在任何情況下都能正常工作。有沒有人知道當我成功使用'a:b = x'符號時發生了什麼?

+0

這是奇特的,就是。你甚至可以再次讀取這個值,這是我真的沒想到的。 – 2012-01-09 01:01:08

+0

'd ==「快樂的日子」' – 2012-01-09 01:01:37

+1

'a:b:c:d =「快樂的日子」;''將'快樂的日子'分配給'd'。而不是'a:b:c:d' .. – 2012-01-09 01:02:20

回答

4

引用ECMAScript標準:「一份聲明中可以通過標籤前綴。標記語句僅與標記爲breakcontinue的語句結合使用。「標籤由標識符和冒號組成。所以a:b:c:d = "happy days";只是一個賦值語句d = "happy days";前綴有三個標籤,它們沒有任何影響。

14

ECMAScript中冒號是有三個原因

  • 從其值分離對象鍵
  • 直列條件語句
  • 標記

你discoverd後者。你基本上正在做的是創建一個名爲a,然後b,然後c的標籤,最後你要爲全局變量d分配一個值。所以經過

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

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

這種最常見的用法是switch聲明,我們不喜歡它

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

內,但你也可以直接「目標」與continue聲明的標籤。這非常接近goto在許多其他語言,看起來像

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

我同意這些是標籤,但我認爲「case x:」是冒號的替代用法,因爲標籤似乎嚴格地用作中斷和繼續語句的參考點,而不是開關語句。另外,如果你想完成,冒號也用於內聯開關語句(a?b:c;)。 – 2012-01-09 01:07:38

+0

@ skier88:是的,你是對的,忘記了內聯條件。對於'switch/case',我總是認爲一個案例幾乎被視爲一個標籤,但我會看看這個。 – jAndy 2012-01-09 01:11:55

相關問題