简体   繁体   中英

Unexpected behavior of Array.prototype.splice

While implementing an internal EventEmitter for a project I was working on, I came across a strange quirk when using Array.prototype.splice inside a for... in loop. The function does not successfully remove the indeces from the array within the loop:

 var array = [1, 2, 3, 4, 5], index; for (index in array) { if (index === 2) { array.splice(index, 1); } console.log(array[index]); } console.log(array); 

Running on Google Chrome version 43, this outputs

1
2
3
4
5
[1, 2, 3, 4, 5]

when I'm expecting something like

1
2
4
5
undefined†
[1, 2, 4, 5]

Is this by design or a bug? I cannot find any documented reference to this behavior.

Possibly, if length is not calculated during each iteration of for... in implementation

Great question. :)

In Javascript, Arrays are Objects, which means that Array indices are Object keys. And in Javascript, Object keys are strings.

So your condition index === 2 is always going to be false, because the number 2 is not the same as the string '2'.

One solution would be to continue to use the identity operator (recommended by most) and compare index to the string value '2'

index === '2' 

Or, alternatively, you can use the equality operator which will typecast the comparison (although this will likely get you into trouble at some point)...

index == 2 

but works just fine in your case.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM