Цитирование ECMA Сценарий 5 Спецификация ,
Имя свойства P
(в виде значения String) является индексом массива тогда и только тогда, когда ToString(ToUint32(P))
равно P
и ToUint32(P)
не равна 2 -1.
Поскольку Hello
недействителен, в соответствии с вышеприведенным определением он не рассматривается как индекс массива, а как обычное свойство.
Цитирование MDN-х Relationship between length and numerical properties section,
При установке свойства в массиве JavaScript, когда свойство является допустимым индексом массива и что индекс находится вне текущих границ массива, двигатель обновит массив соответственно
Таким образом, только если свойство является допустимым индексом массива, свойство length
будет скорректировано.
В вашем случае вы только что создали новое свойство Hello
объекта массива.
Примечание: только числовые свойства будут использоваться во всех функций прототипа Array
«s, как forEach
, map
и т.д.
Например, массив показан на вопрос, когда используется с forEach
,
arr.forEach(function(currentItem, index) {
console.log(currentItem, index);
})
напечатает
Hello 0
There 1
123 2
456 3
{ show: [Function] } 4
даже если список ключей показывает Hello
.
console.log(Object.keys(arr));
// [ '0', '1', '2', '3', '4', 'Hello' ]
Это происходит потому, что Array
происходит от Object
,
console.log(arr instanceof Object);
// true
и Hello
является допустимым ключом объекта массива, но только не является допустимым индексом массива. Таким образом, когда вы обрабатываете массив как объект, в ключи будут включены Hello
, но конкретные функции массива будут включать только числовые свойства.
Массив должен иметь только цифровые клавиши. Любые нечисловые ключи не будут учитываться для длины. – elclanrs