在JavaScript中使用标签是一种不好的做法吗?

59
我刚刚了解到在JavaScript中使用标签,例如:
for (var i in team) {
    if(i === "something") {
        break doThis: //Goto the label
    } else {
        doThat();
    }
}

doThis: //Label
doIt();

我直到现在才听说这个,但在网上找不到太多关于它的信息,我开始觉得这是有原因的。
在我看来,这似乎类似于其他语言中的“GOTO”语句,可能被认为是一种不良实践。我猜我这样假设没错吧?

10
你使用标签的方式不正确:你需要将标签添加到循环结构中,例如 doThis: for(... - Christoph
5
不使用hasOwnProperty绝对是不良实践。参见:http://bonsaiden.github.com/JavaScript-Garden/#hasownproperty - Ivo Wetzel
2
@IvoWetzel 如果它是一个不继承的对象,不使用hasOwnProperty也没问题。Object原型上的任何内容都不可枚举。 - ZachB
5个回答

61

JavaScript中的标签主要与嵌套循环中的break或continue一起使用,以便能够从内部循环中断外部循环,或者从内部循环中继续执行外部循环的代码:

    outer:
    for (let i = 0; i < 10; i++)
    { 
       let k = 5;
       for (let j = 0; j < 10; j++) // inner loop
          if (j > 5) 
               break; // inner 
          else
               continue outer;  // it will go to next iteration of outer loop
    }

如果您在没有指定'outer'标签的情况下使用continue,它将继续执行内部循环的下一次迭代。这就是为什么JavaScript中需要标签的原因。


1
顺便提一下,let是ECMAScript 6 / ECMAScript 2015的关键字。 - Gal Margalit
@Danield 什么都没有。 - Walf
7
在上面的代码中,变量 k 初始化一个块作用域变量,其持有数值 5。:P - mhatch

32

这些是循环打破标识符。如果您有嵌套循环(循环内的循环),使用这些标识符,您可以有条件地指定何时和哪个循环退出。


啊,那你不能跳出不在循环内的代码吗? - Ryan
2
@Ryan:您无需跳出不在循环内的代码。我想您想使用类似GO TO 的东西。您可以使用 if 条件语句来设置条件。 - Sarfraz
如果您有嵌套循环或在循环内使用“switch”语句,并且使用“break”关键字进行控制,则它们非常有用。 - Armen Michaeli

15

2020编辑,根据MDN:

带标签的循环或块非常不常见。通常,可以使用函数调用代替循环跳转。

我2015年的回答:

避免使用标签

在JavaScript中,标签不是很常用,因为它们使程序更难阅读和理解。在尽可能的情况下,避免使用标签,并根据情况优先考虑调用函数或引发错误。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/label


27
这段文字是从MDN中在2015年5月被删除的,有关此次修改的历史记录可以在这里找到。修改历史记录中的评论是:"删除了没有明确证据支持的建议","技术审核已通过。我认为没有必要添加那个阻止使用标签的大红色横幅,也没有找到任何说明相反的内容。" - TachyonVortex
1
2017年更新:“标记循环或块非常不常见。通常情况下,可以使用函数调用代替循环跳转。” - Gal Margalit
2
我不理解“函数调用可以代替循环跳转”的部分,如何使用函数调用来continue一个循环? - doubleOrt
好的@GalMargalit,怎么做?眼睛: 对于(i=0;i<m;i++){ 准备眼睛(); 对于(j=0;j<n;j++){ 做某事(j); 如果(j==13)继续眼睛; /跳到下一个眼睛/ } 处理眼睛(); //当j==13时应该被跳过 } - pashute

7

标记的break语句可以跳出任何代码块,不仅限于循环。

<p id="test1"></p>
<p id="test2"></p>
<p id="test3"></p>
<p id="test4"></p>
<p id="test5"></p>

test: {                            
    document.getElementById('test1').innerHTML = "test 1 passed";
    document.getElementById('test2').innerHTML = "test 2 passed";
    document.getElementById('test3').innerHTML = "test 3 passed";
    break test;
    document.getElementById('test4').innerHTML = "test 4 passed";
    document.getElementById('test5').innerHTML = "test 5 passed";
}

结果:

测试1通过

测试2通过

测试3通过


3
在这种情况下,您只能“中断”而不能“继续”。 - Xsmael

0

有一个解决方法可以使用while循环代替内部for循环以获得更好的可读性。


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