用于循环选择选项的javascript选项
最近我偷了一些javascript来选择select元素中的一个选项:用于循环选择选项的javascript选项,javascript,Javascript,最近我偷了一些javascript来选择select元素中的一个选项: var el=document.getElementById('mySelect'); var opts=el.options; for (var opt, j = 0; opt = opts[j]; j++) { if (opt.value == 'Apple') { el.selectedIndex = j; break; }
var el=document.getElementById('mySelect');
var opts=el.options;
for (var opt, j = 0; opt = opts[j]; j++) {
if (opt.value == 'Apple') {
el.selectedIndex = j;
break;
}
}
它工作得很好,但当我看着它时,我意识到它与我本该写的不同:
var el=document.getElementById('mySelect');
for (var j = 0; j < el.options.length; j++) {
if (el.options[j].value == 'Apple') {
el.selectedIndex = j;
break;
}
}
var el=document.getElementById('mySelect');
对于(var j=0;j
在查看第一个代码时,如果找不到“Apple”,什么会停止循环?哪一个更好?长话短说:
在for循环中,执行一次var opt
,然后执行后续的opt=data[i]
这很重要,因为:
var opt,数据=[1,2];//定义一次
console.log(opt=data[0])//1
console.log(opt=data[1])//2
console.log(opt=data[2])//未定义
在for循环中,执行一次var opt
,然后执行后续的opt=data[i]
这很重要,因为:
var opt,数据=[1,2];//定义一次
console.log(opt=data[0])//1
console.log(opt=data[1])//2
log(opt=data[2])//undefined
在这两种情况下,第二个表达式确定循环是继续还是停止。在你的
for (var j = 0; j < el.options.length; j++) {}
不同之处在于,它们声明了一个变量opt
,并在第二个表达式中将其设置为(也是递增的)数组索引。在某些情况下,j
超出了数组的边界,并且opts[j]
是未定义的。由于JS中的等式表达式是正确站点的值,因此该表达式也是未定义的,即falsy,循环停止
至于哪个更好?两者都有效。但是,当您不得不挠头思考其中一个问题时,您希望在多大程度上依赖于更难阅读的代码?在这两种情况下,第二个表达式决定循环应该继续还是停止。在你的
for (var j = 0; j < el.options.length; j++) {}
不同之处在于,它们声明了一个变量opt
,并在第二个表达式中将其设置为(也是递增的)数组索引。在某些情况下,j
超出了数组的边界,并且opts[j]
是未定义的。由于JS中的等式表达式是正确站点的值,因此该表达式也是未定义的,即falsy,循环停止
至于哪个更好?两者都有效。但是,当你不得不挠头思考其中一个问题时,你希望在多大程度上依赖于更难阅读的代码?测试是opt=opts[j]
的返回值,即opt。当j达到opts.length时,该值将未定义,这是错误的,因此循环停止。你对“更好”的标准是什么?有很多选择,为了确定“更好”,你需要说明应该如何评估它们(更快、更容易维护、更短等等)。我想当opts用完时,停止它的是opt=opts[j]是错误的,对我来说似乎有点可爱。也许有人可以给它一个理由。测试是opt=opts[j]
的返回值,它是opt。当j达到opts.length时,该值将未定义,这是错误的,因此循环停止。你对“更好”的标准是什么?有很多选择,为了确定“更好”,你需要说明应该如何评估它们(更快、更容易维护、更短等等)。我想当opts用完时,停止它的是opt=opts[j]是错误的,对我来说似乎有点可爱。也许有人可以给它一个理由。这并没有回答“如果‘苹果’没有找到,什么会停止循环?”这个问题,我认为应该这样做。这并没有回答“如果‘苹果’没有找到,什么会停止循环?”这个问题,我认为应该这样做。