如何在Javascript中使用: 运算符

3
为什么下面的代码没有出现错误?
var bar = 1,
    foo = {};

foo: {
    bar: 2;
    baz: ++bar;
};

它返回2

众所周知,JavaScript有标签,它有助于管理循环和if语句。这段代码有用吗? 我看到AngularJS框架使用::运算符提供一次性绑定。也许你听说过其他使用该奇怪运算符的例子。


看到这个问题:在JavaScript中冒号是做什么的? - doldt
1
@doldt:这是一种看起来相似但完全不同的冒号用法。 - user2357112
foo: { bar: 2, baz: ++bar }; 这里应该使用逗号 , 而不是分号 ; - mohamedrias
@mohamedrias:不,代码是正确的。那不是一个对象字面量;它是一个带有标签的块语句,只是看起来很像一个对象字面量。 - user2357112
@user2357112,该链接中的答案解释了冒号的标签用例,这在这里实际生效。 - doldt
1个回答

6
这不是错误,因为foo: {...}中的foo是一个语句标签。它与您的foo变量无关,也与任何赋值无关。
同样地,{}定义了一个块,而不是对象,里面的barbaz也是语句标签。
这些语句:
2;

并且

++bar;

这些代码是完全有效的。第一个看起来有点奇怪,但它是有效的;在JavaScript中,任何表达式都可以用作语句,包括简单常量。(这很有用;这就是JavaScript如何滑入"use strict"指令的方式。)

结果为2,因为块取决于块中最后一个语句的值,即++bar;

除非某些内容正在使用这些语句标签,否则该代码等同于:

var bar = 1,
    foo = {};

2;
++bar;

这段代码有用吗?

就目前而言,我不认为有用。但请注意,如果您在foo块内部有一个循环,并且在循环后有一些内容,您可以使用有向中断跳过循环后的内容:

var bar = 1,
  foo = {};

foo: {
  bar: 2;
  baz: ++bar;
  for (var n = 0; n < 10; ++n) {
    snippet.log("n = " + n);
    if (Math.random() < 0.3) {
      break foo;
    }
  }
  snippet.log("Probably don't get here");
};
snippet.log("Done");
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

在那里,你不会看到Probably don't get here,除非Math.random()连续十次返回小于0.3的值。

你需要一个循环或者switch来做到这一点,break只在循环和switch中有效。而且这将是一件非常不寻常的事情...


4
++bar; 的值为2,然后包含它的代码块 { } 也返回这个值(即作为最后一条语句),所以它返回了 2 - Sam Hasler
1
@SamHasler:谢谢!我错过了问题的那一部分,直到我去查找它时才知道关于块的那个知识点。 :-) - T.J. Crowder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接