It doesn't deal with sparse arrays.
It does, in fact. It doesn't tell you how many members have genuine values, no, but that's not its purpose. It's simply a count of the members.
It doesn't deal with delete array[lastIndex]
Because the delete operator removes properties from objects, not arrays. Arrays are, again, really just objects which receive some special treatment. If you do an end run around that special treatment, then things will get weird.
It doesn't actually add any elements to the array when setting it to a number larger than the current length.
It's usefulness is basically limited to a specific kind of array (dense, zero-based positive index). As long as you can ensure that the arrays you're dealing with are only ever such, you're fine.
All arrays are zero-base positive index, as I've explained twice already. As I noted in previous replies, you may certainly use invalid array indices on an array, however, they'll be treated as regular object property names, not array indices which are special sauce. Again, an "index" of -2 or 1e12 is no different from using "foo". You're using property names at that point, not array indices, and none of the special treatment is in effect.
It is not, actually. Again, you're conflating regular object property access with the special array index access.
At this point, the only thing I can suggest is for you to read the ECMAScript specification, because you are confusing the limited special treatment array objects receive with generic object access.