【问题标题】:Is using labels in JavaScript bad practice?在 JavaScript 中使用标签是不好的做法吗?
【发布时间】:2020-11-14 23:19:47
【问题描述】:

我刚刚发现了在JavaScript中使用label,比如:

for (var i in team) {
    if(i === "something") {
        break doThis: //Goto the label
    } else {
        doThat();
    }
}

doThis: //Label
doIt();

直到现在我还没有听说过这件事,我在网上找不到太多关于它的信息,我开始认为这是有原因的。

在我看来,这类似于其他语言中的 GOTO 语句,并且会被视为不好的做法。我这样假设是对的吗?

【问题讨论】:

  • 您对标签的使用不正确:您需要将标签添加到循环构造中,即doThis: for(...
  • 也 不使用 hasOwnProperty 绝对是不好的做法。见:bonsaiden.github.com/JavaScript-Garden/#hasownproperty
  • @IvoWetzel 如果它是一个不继承的对象,那么不使用hasOwnProperty 也可以。 Object 原型上没有任何东西是可枚举的。

标签: javascript loops label nested-loops break


【解决方案1】:

JavaScript 中的标签主要用于 break,或者在嵌套循环中继续使用,以便能够中断外部循环,或者从内部循环内部的代码继续外部循环:

    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
    }

如果您在没有“外部”标签的情况下使用 continue,它将进入内部循环的下一次迭代。这就是为什么需要在 Javascript 中使用标签的原因。

【讨论】:

【解决方案2】:

这些是循环断路器标识符。如果您有嵌套循环(循环内的循环)并且使用这些标识符,它们会很有用,您可以有条件地指定何时以及从哪个循环中断。

【讨论】:

  • 啊,那你能不能不分解成不在循环内的代码?
  • @Ryan:您不需要跳出不在循环内的代码。我想您想使用GO TO 之类的东西。您可以改用if 来设置条件。
  • They are useful if you have nested loops: 或循环内的switch 语句,它也使用break 关键字进行控制。
【解决方案3】:

2020 年编辑, 根据 MDN:

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

我 2015 年的回答:

避免使用标签

标签在 JavaScript 中不是很常用,因为它们使 程序更难阅读和理解。尽量避免 使用标签,根据情况,更喜欢调用函数或 抛出错误。

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

【讨论】:

  • 该文本是 2015 年 5 月来自 MDN 的 removed,修订历史记录中有 these comments:“删除没有明确证据支持的建议。” “清除技术审查。我认为确实不需要阻止标签的大红色横幅。没有发现任何不同的说法。”
  • 2017 年更新:“带标签的循环或块非常少见。通常可以使用函数调用来代替循环跳转。”
  • 我没有得到“可以使用函数调用而不是循环跳转”部分,如何使用对continue 循环的函数调用?
  • 好的@GalMargalit,怎么样?眼睛: for (i=0; i
【解决方案4】:

标记的中断可以打破任何代码块,而不仅仅是循环

<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 通过

【讨论】:

  • 在这种情况下你只能break 而不能continue
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-01
  • 2011-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-17
相关资源
最近更新 更多