在JavaScript中使用标签是一种糟糕的做法吗?
我刚刚了解到如何在JavaScript中使用标签s,例如:在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语句,被认为是
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
的块作用域变量:在这种情况下,您只能中断,而不能继续