Заполняет ли JavaScript пустые элементы массива? - PullRequest
9 голосов
/ 11 января 2010

Я кодирую много годовых данных в JavaScript, и я подумывал добавить их в массивы, используя год в качестве индекса массива и поместить данные в массив. Однако Firebug, похоже, указывает на то, что JavaScript справляется с этим, заполняя две тысячи нечетных записей в массиве значением «undefined». Я боюсь, что из-за сотен таких массивов в активной памяти издержки сотен тысяч бесполезных элементов массива могут начать замедлять работу программы. Будет ли это?

Ответы [ 4 ]

11 голосов
/ 11 января 2010

Когда вы устанавливаете значение числового индекса выше, чем текущий length вашего массива, это влияет на свойство length.

Вкратце, вы должны использовать Object:

var data = {};
data[year] = "some data";

// or
var data = {
  2009: "2009 data",
  2010: "2010 data"
};

Теперь я отвечаю на вопрос: « Заполняет ли JavaScript пустые элементы массива? »

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

Методы Array.prototype работают при условии, что у объекта массива будут индексы, начинающиеся с нуля.

Предыдущие индексы на самом деле не существуют в объекте Array, вы можете проверить это:

var array = [];
array[10] = undefined;

array.hasOwnProperty(10); // true
array.hasOwnProperty(9);  // false

В заключение, массивы должны содержать последовательные индексы, начиная с нуля, если ваши свойства не соответствуют этим требованиям, вы должны просто использовать объект.

4 голосов
/ 11 января 2010

Да, скорее всего. Вы должны рассмотреть возможность использования объекта JavaScript вместо:

var years = {2009: 'Good', 2010: 'Better'};
0 голосов
/ 11 января 2010

С другой стороны, иногда разреженный массив проще в использовании, чем пользовательский объект, и в массивах есть такие удобные методы.

В приложении календаря я начинаю с объектов для каждого используемого года, но каждый год состоит из двенадцати членов (массив месяцев), и каждый «месяц» представляет собой разреженный массив значимых дат, длина которых зависит от самой высокой даты тот месяц, который имеет какие-либо данные.

0 голосов
/ 11 января 2010

Что ж, если вы выполните итерацию по многим тысячам неопределенных, это повлияет на общую скорость программы, хотя не уверен, что вы заметите это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...