Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中使用标签是一种糟糕的做法吗?_Javascript_Loops_Label_Nested Loops_Break - Fatal编程技术网

在JavaScript中使用标签是一种糟糕的做法吗?

在JavaScript中使用标签是一种糟糕的做法吗?,javascript,loops,label,nested-loops,break,Javascript,Loops,Label,Nested Loops,Break,我刚刚了解到如何在JavaScript中使用标签s,例如: for (var i in team) { if(i === "something") { break doThis: //Goto the label } else { doThat(); } } doThis: //Label doIt(); 我直到现在才听说这件事,我在网上找不到太多关于它的信息,我开始认为这是有原因的 在我看来,这类似于其他语言中的GOTO语句,被认为是

我刚刚了解到如何在JavaScript中使用标签s,例如:

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

doThis: //Label
doIt();
我直到现在才听说这件事,我在网上找不到太多关于它的信息,我开始认为这是有原因的


在我看来,这类似于其他语言中的
GOTO
语句,被认为是不好的做法。我这样假设是否正确?

这些是环路断路器标识符。如果您有嵌套循环(循环中的循环),并且使用这些标识符,您可以有条件地指定何时以及从哪个循环中断。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
    }
外部:
for(设i=0;i<10;i++)
{ 
设k=5;
for(设j=0;j<10;j++)//内循环
如果(j>5)
break;//内部
其他的
continue outer;//它将转到外循环的下一个迭代
}
如果使用continue而不使用“outer”标签,它将转到内部循环的下一次迭代。这就是为什么需要Javascript中的标签。

2020编辑, 根据MDN:

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

我的回答是:

避免使用标签

标签在JavaScript中不太常用,因为它们使 更难阅读和理解的程序。尽量避免 使用标签,并根据具体情况选择调用函数或 抛出一个错误


带标签的中断可以中断任何代码块,而不仅仅是循环

<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";
}

测试:{ document.getElementById('test1').innerHTML=“测试1已通过”; document.getElementById('test2').innerHTML=“测试2通过”; document.getElementById('test3').innerHTML=“测试3通过”; 断裂试验; document.getElementById('test4').innerHTML=“测试4通过”; document.getElementById('test5').innerHTML=“测试5通过”; }
结果:

测试1通过

测试2通过


测试3通过

您使用的标签不正确:您需要将标签添加到循环构造中,即
doThis:for(…
也不使用
hasOwnProperty
绝对是不好的做法。请参阅:@IvoWetzel如果它是一个不继承的对象,那么不使用
hasOwnProperty
就可以了。
对象
原型上的任何内容都是不可枚举的。啊,那么你不能分解成不在循环中的代码吗?@Ryan:你不需要分解不在循环中的代码。我想您可能想使用类似于“GO to的东西。您可以使用
if
来设置条件。
如果您有嵌套的循环,它们会很有用。
:或者循环中的
switch
语句,它也使用
break
关键字进行控制。该文本来自MDN2015年5月,在修订历史中,“删除没有明确证据支持的建议。”“清除技术审查。我认为确实没有必要使用阻碍标签的大红旗。没有发现任何不同的说法。”2017年更新:“带标签的循环或块非常少见。通常可以使用函数调用来代替循环跳转。”我不明白“可以使用函数调用代替循环跳转”部分,如何使用函数调用来
继续
循环?ok@GalMargalit,how?eye:for(i=0;iBTW,let是一个ecmascript 6/ecmascript 2015关键字。@Danield nothing。@Danield在上述代码中,变量
k
初始化一个包含数值
5
的块作用域变量:在这种情况下,您只能
中断
,而不能
继续