Массив Javascript с номером в качестве имени свойства

#javascript #arrays

#javascript #массивы

Вопрос:

 var myArray = new Array(); 
myArray['112'] = 0;
myArray.length
 

Почему length в приведенном выше примере 113? Не следует ли '112' добавить свойство объекта для массива и создать что-то похожее на myArray = {"112":0} ?

Кроме того, почему длина 113, а не 1? Поскольку myArray на самом деле содержит только 1 значение

Комментарии:

1. тьфу … Это удивительно. Каждый день изучайте что-то новое.

2. Поскольку длина всегда устанавливается равной наибольшему целому положительному имени свойства плюс единица. Массив имеет только одно перечислимое свойство, но его длина равна 113 (см. ECMA-262 15.4).

Ответ №1:

Массив length на единицу больше, чем самый высокий индекс, поэтому вы получаете 113 .

Комментарии:

1. Ну, чтобы было понятно, интерфейс не разреженный. Это может быть внутренне, в зависимости от сохраненных значений.

2. @MatthewFlaschen: Да, извините, я только что перешел к редактированию ninja, но, похоже, кто-то уже заметил: P

3. Массивы имеют последовательно пронумерованные индексы только в том случае, если вы задаете им последовательно пронумерованные индексы. Пример OP — это случай, когда они не являются последовательными. Массив имеет только одно перечислимое свойство с именем ‘112’. Длина автоматически устанавливается на наибольшее положительное целое число имя свойства плюс один (поэтому устанавливается значение ‘113’).

4. @RobG: Я понимаю. Почему console.log() выводится куча undefined ? Я вижу Object.keys() , что отображается единственное перечислимое свойство. Что бы я изменил в своем ответе, если он неверен?

5. Удалите «последовательно» из первого предложения и фразу «и являются разреженными» (sparse — это концепция индексов, которые не являются последовательными, поэтому это может быть свойством экземпляра, а не массивов в целом). Полностью удалите второе предложение, выделение определенного индекса не приводит к созданию всех нижних индексов как свойств (как for..in итерация покажет). Попытка получить доступ к отсутствующим свойствам возвращает undefined , hasOwnProperty вернет false (хотя в некоторых браузерах попытка получить доступ к отсутствующим индексам приводит к их добавлению в качестве свойств, но они все еще не определены).

Ответ №2:

Нет. '112' Строка и чистое числовое 112 значение вычисляются одинаково, когда JS выполняет поиск по массиву, поэтому вы получаете слот в массиве, а не свойство.

Проще всего представить индексы массива JS как свойства, которые являются числами, даже в строковой форме. Это более хамелеонно, чем вы думаете на первый взгляд.

Но если вы добавите свойство с некоторым нечисловым именем, например myArray['foo'] , оно будет работать так, как вы ожидаете, и длина не изменится.

Комментарии:

1. «Слот в массиве» — это свойство. Все имена свойств массива являются строками, даже если в присваивании используется число (оно преобразуется в строку). Массивы — это просто объекты со специальным свойством длины. Длина всегда на единицу больше, чем наибольшее положительное целое имя свойства.

2. У вас все наоборот. Как бы безумно это ни звучало, все индексы массива на самом деле являются строковыми свойствами, в отличие от числовых индексов, согласно спецификациям ECMAScript.


Ответ №3:

Рассмотрим этот простой пример:

 var aa = [];
aa[3] = 'three';
alert( aa.length // 4
    'n'   aa[2]    // undefined 
    'n'   aa.hasOwnProperty('2') // false
);
 

Число 3 используется для присвоения имени свойства, но оно преобразуется в строку и используется как стандартное имя свойства (т. Е. Строка «3»).

Добавление свойства с именем «3» создало одно свойство и установило длину в 4, поскольку длина всегда устанавливается на единицу больше, чем наибольшее неотрицательное целое имя свойства.

Никакое другое свойство не создается, массив является «разреженным», то есть в нем нет последовательно именованных (пронумерованных) элементов. A for..in цикл также можно использовать, чтобы увидеть, что существует только одно свойство.

Комментарии:

1.Так var aa=[] aa[0] = 'zero'; aa[1] = 'one'; преобразуется var aa = {'0':'zero', '1' : 'one'} интерпретатором?

2. Более или менее, но помните, что массивы наследуются от Array.prototype и имеют специальное свойство length , поэтому они немного сложнее, чем обычные объекты. Но внизу они просто объекты. О, и числовые имена свойств, преобразуемые в строки, являются частью того, как работают объекты, которые также применимы к массивам, это не относится конкретно к массивам.

Ответ №4:

Вы получили массив 0..112 элементов — общей длиной 113 элементов.