在javascript变量名中使用冒号(例如a:b:c)
我刚刚注意到我可以在javascript中执行以下操作在javascript变量名中使用冒号(例如a:b:c),javascript,Javascript,我刚刚注意到我可以在javascript中执行以下操作 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”符号时,有人知道发生了什么吗?ECMAscript中的冒号有三个原因 将对象关键帧与其值分离 内联条件语句
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”符号时,有人知道发生了什么吗?ECMAscript中的冒号有三个原因
- 将对象关键帧与其值分离
- 内联条件语句
- 标签
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
语句直接“瞄准”标签。在许多其他语言中,这与转到非常接近,看起来像
foobar:
for(var i = 0; i < 10; i++) {
for(var j = 0; j < 10; j++) {
if( j === 2 )
continue foobar;
}
}
foobar:
对于(变量i=0;i<10;i++){
对于(var j=0;j<10;j++){
如果(j==2)
继续foobar;
}
}
引用ECMAScript标准:“语句的前缀可以是一个标签。带标签的语句只能与带标签的break
和continue
语句一起使用。”标签由标识符和冒号组成。所以a:b:c:d=“快乐的日子”
只是一个分配语句d=“快乐的日子”代码>以三个标签作为前缀,这三个标签本身没有任何效果。就是说,这很奇怪。您甚至可以重新读取值,这是我真的没有想到的。a:b:c:d=“快乐时光”代码>将的“快乐日子”分配给d
。不要使用a:b:c:d
。初始化a:b:c:d
后,键入a:bbbb:cccccc:garble:d
旁注:这是完全合法的:窗口[“a:b:c:d”]=“快乐日子”代码>@lwburk-谢谢你。你的评论是我找到解决这个问题的方法所需要的推动力。见下文。我同意这些是标签,但我认为“case x:”是冒号的另一种用法,因为标签似乎严格用作break和continue语句的参考点,而不是switch语句。另外,如果你想完整,冒号也可以用在内联开关语句中(a?b:c;)。@skier88:是的,你说得对,忘了内联条件。对于开关/case
,我一直认为case几乎被视为一个标签,但我将对此进行研究。