2010-09-21 64 views
1

,如果我有一个数组myArray这我循环通过:JavaScript数组索引测试

for(var i=0;i<myArray.length;i++) { 
    if(myArray[i] == myArray[i+1]) 
     //do something 
} 

显然,myArray[i+1]将无法​​在最后一次迭代。缺少测试,如果i == (myArray.length - 1),是否有一个干净的方法,不要在这个if语句失败,只是它的计算结果为false(如果myArray[i+1]超出界限)?

+0

哦,我知道我可能会更好过保持变量指向前值,并在每次迭代中只是测试,如果当前值等于存储先前的值。但我仍然想知道如何做到这一点,如问题所示。 – bba 2010-09-21 14:35:40

+3

*“显然,myArray [i + 1]在最后一次迭代中将失败。”*嗯,是和否,取决于你的意思是“失败”。它不会抛出异常,但几乎肯定不是你想要的。它会将'myArray [i]'与'undefined'进行比较。无论如何,最好先停止,如KennyTM的答案所示。 – 2010-09-21 14:36:50

回答

4

为什么不只是迭代到第(N-2)项呢?

for(var i=0;i<myArray.length-1;i++) { 
    ... 

,如果你必须遍历到最后,只有这样,才能在工作一般是明确检查,如果该指数是有效的。无论是

for (var i = 0; i < myArray.length; ++ i) 
    if (i+1 != myArray.length) { 
    ... 

for (var i = 0; i < myArray.length; ++ i) 
    if (!(i+1 in myArray)) { 
    ... 

但是,如果你能确保在阵列中的所有项目不能undefinednull,那么你原来的代码已经工作,因为索引出的绑定将返回undefined ,并且undefined == x将是错误的,除非x也是undefinednull

+0

我现在觉得很蠢。肯定会工作。仍然有一个优雅的方式在JavaScript中有一个越界数组指针评估为false而不是抛出一个错误? – bba 2010-09-21 14:36:56

+0

...因为实际上我的逻辑设置的方式(我不是说它不能被重构),我仍然需要到最后一个迭代(N-1)项。 – bba 2010-09-21 14:38:48

+0

实际上'myArray [i + 1]'不会因错误而失败。它会简单地返回'undefined',与'myArray [i]'相比,它会返回'false'(当然除非myArray [i]'也是'undefined'),一切都会好的。 – RoToRa 2010-09-21 14:40:48