在javascript变量名中使用冒号(例如a:b:c)

Jon*_*hon 6 javascript

我刚刚注意到我可以在javascript中执行以下操作...

a:b:c:d = "happy days";
a:b:c = function(text){alert(text);};
Run Code Online (Sandbox Code Playgroud)

但我不能......

var a:b:c:d = "happy days"; 
// or
var myObj = {prop:a:b:c:d};
Run Code Online (Sandbox Code Playgroud)

在任何情况下我都不希望这种语法有效.当我成功使用'a:b = x'符号时,有没有人知道发生了什么?

jAn*_*ndy 14

ECMAscript中的冒号有三个原因

  • 将对象键与其值分开
  • 内联条件语句
  • 标签

你发现了后者.你基本上做的是创建一个名为的标签a,然后b,c最后你将一个值赋给一个全局变量d.所以之后

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

console.log(a); // reference error
console.log(d); // "happy days";
Run Code Online (Sandbox Code Playgroud)

最常见的用法是在switch我们这样做的声明中

switch( foo ) {
    case 0: break;
    case 1: break;
    // etc
}
Run Code Online (Sandbox Code Playgroud)

但您也可以直接使用该continue语句"定位"标签.这与goto许多其他语言非常接近,看起来像

foobar:
for(var i = 0; i < 10; i++) {
    for(var j = 0; j < 10; j++) {
        if( j === 2 )
            continue foobar;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我同意这些是标签,但我认为"case x:"是冒号的替代用法,因为标签似乎严格地用作break和continue语句的参考点,而不是switch语句.此外,如果要完成,冒号也用于内联switch语句(a?b:c;). (2认同)

Juk*_*ela 5

引用 ECMAScript 标准:“语句可以以标签为前缀。标记语句仅与标记breakcontinue语句结合使用。” 标签由标识符和冒号组成。所以a:b:c:d = "happy days";只是一个d = "happy days";以三个标签为前缀的赋值语句,它们没有任何效果。