There is not much "special" about array index access.
I never said there was much special about the handling of arrays. Where are you getting that from?
The handling of array indices and treatment of the length property is basically it. My point is, has ever been, that if you violate the limitations of that special handling, and there are limitations, then you're dealing with the array object as a regular object and not as an array (i.e. without the special handling). I do not see what's hard to understand about that.
Even then, you can have plain objects act like arrays in this regard as well.
var notAnArray = {};
notAnArray.__proto__ = Array.prototype;
Everything else is identical. In particular, obj[-1] and arr[-1] work the same way and are valid access methods for properties of both.
That is not doing what you think it is. All you've done there is add Array as your object's prototype. The object will get access to the Array methods, sure enough. It will not, however, receive any of the special array index/length handling.
For example, try the following:
var notAnArray = {};
notAnArray.__proto__ = Array.prototype;
console.log(notAnArray.length); // yields: 0
notAnArray.push('foo');
console.log(notAnArray.length); // yields: 1
notAnArray[9] = 'bar';
console.log(notAnArray.length); // yields: 1 (not 10)
var isAnArray = [];
console.log(isAnArray.length); // yields: 0
isAnArray.push('foo');
console.log(isAnArray.length); // yields: 1
isAnArray[9] = 'bar';
console.log(isAnArray.length); // yields: 10
Notice how adding the far member to both, thus attempting to making them sparse, did not update the length property of your object, while doing so with the array object did.
Additionally. You can take that example further to show that out-of-range indices do not trigger the special array handling. Like so:
var isAnArray = [];
console.log(isAnArray.length); // yields: 0
isAnArray.push('foo');
console.log(isAnArray.length); // yields: 1
isAnArray[1e12] = 'bar';
console.log(isAnArray.length); // yields: 1 (not 1e12+1)
/*
Both of the following show only 'foo' because 1e12 is an
invalid index and does not trigger the special array handling.
*/
isAnArray.forEach(m => console.log(m));
for (var m of isAnArray) console.log(m);
Does the 1e12 property exist on the object and have the value 'bar'? Yes, certainly. Is it considered part of the array by JavaScript? Absolutely not.
As I've said multiple times now, while you may certainly use invalid array indices with an array, if you do, then you're not dealing with the array object as an array but as a regular object (i.e. the special array handling is not applied).