Javascript.RU

Массивы

Javascript поддерживает два вида структуры "массив":

  1. Ассоциативный массив (хеш), где данные хранятся по произвольному ключу.
    Об этом читайте в разделе Объекты.
  2. Числовой массив Array, где данные хранятся по номерам.
    Он описан в этой статье.

Javascript - очень гибкий язык, поэтому технически в Array можно хранить произвольные ключи, как в Object - числовые. Но лучше использовать типы по назначению.

Для хранения данных по номеру предназначен тип Array.

var arr = new Array()
arr.test = 5
arr[1] = "blabla"
...

В типе Array есть специальные методы, ориентированные именно на работу с числовыми ключами.

Есть два эквивалентных способа создания массива:

var a = new Array()
var a = []

Или, сразу со значениями

var a = new Array("a", 1, true)
var a = ["a", 1, true]

Эти способы работают одинаково, кроме объявления вида new Array(10), когда у конструктора есть единственный аргумент-число.

Такое объявление создаст пустой массив (все элементы undefined) длиной 10. По возможности, не используйте new Array.

Отсчет элементов начинается с нуля:

alert(a[0])   // => "a"

Массив хранит данные по численным ключам, но внутри он использует точно такой же хэш (ту же структуру данных), как и обычный объект, поэтому можно сделать так:

var a = []
a[1] = 1
a[999999] = 2

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

У каждого массива есть свойство length, которое автоматом меняется при каждом обновлении массива. Длина массива - это не количество элементов, а максимальный целый ключ + 1:

alert(a.length) // всего 2 элемента, но выведет 1000000

Добавлять новый элемент можно эквивалентными вызовами

a[a.length] = "new element"
a.push("new element")

Перебор элементов обычно (когда индексы непрерывные) осуществляется простым циклом:

var arr = [ "array", "elements", "here" ]
for(var i=0; i<arr.length; i++) {
  ... сделать что-то с arr[i] ...
}

Если индексы - с разрывами, то перебор осуществляется так же, как в объектах:

var arr = []
arr[1] = 123
arr[9999] = 456

for(var i in arr) {
    if (!arr.hasOwnProperty(i)) continue;
   ... сделать что-то с arr[i] ...
}

В массиве есть всё необходимое, чтобы работать с ним как с очередью или со стеком, или и с тем и другим одновременно.

Методы push и pop добавляют или вынимают значение с конца массива

var arr = [3,5,7]
arr.push(9)
var last = arr.pop()    //= 9
var last = arr.pop()   // = 7
alert(arr.length)   // = 2

Методы shift/unshift делают то же самое, с начала массива.

var arr = [4,6,8]
arr.unshift(2) // arr = [2,4,6,8]
arr.unshift(0) // arr = [0,2,4,6,8]
var last = arr.shift() // last = 0, arr = [2,4,6,8]
arr.shift()  // arr = [4,6,8]

shift/unshift обычно приводят к перенумерации всего массива. shift сдвигает все элементы на единицу влево, а unshift - вправо. Поэтому на больших массивах эти методы работают медленнее, чем push/pop.

Массив

slice(begin[, end])

Возвращает подмассив с индексами begin…end.

splice(index, deleteCount[, element1,…, elementN])

Удалить deleteCount элементов, начиная с index, и вставить на их место element1…elementN

Есть и еще много методов:

  • join
  • reverse
  • ...

О них можно почитать на английском, например, в http://developer.mozilla.org/en/..Array


Автор: Гость (не зарегистрирован), дата: 15 октября, 2008 - 17:44
#permalink

Видел конструкцию типа:

a = new array(
{"attr1":"text1","attr2":"text2"}
{"attr1":"text3","attr2":"text4"}
);

Поясните, что это такое?


Автор: Илья Кантор, дата: 15 октября, 2008 - 19:58
#permalink

new Array() - это создание массива из аргументов.
Например, new Array(1,2,3) - массив из трех элементов: 1,2,3, такой же как и [1,2,3].

Аргументами в данном случае являются объекты. То есть, у тебя создается массив из двух объектов, каждый из которых задан как

{ свойство1: значение1, свойство2:значение2 }

Подробнее об объектах и задании объектов - см. Объекты Javascript в примерах.


Автор: Гость (не зарегистрирован), дата: 5 января, 2009 - 22:34
#permalink

А удалять массивы нужно и как вообще очистить существующий массив наиболее коректно?


Автор: Илья Кантор, дата: 31 октября, 2009 - 06:00
#permalink

Javascript автоматически очищает память, как и Java, в отличие от C/C++, поэтому вы можете присвоить переменной новый массив:

arr = [ ]

При этом старый объект-массив будет удален в процессе "сборки мусора".


Автор: zm8, дата: 24 марта, 2009 - 09:49
#permalink

Разрешите поинтересоваться, чем плох

var someArray = [];
/* бравые действия */
someArray = null;


Для последующей инициализации массива ещё раз объявляем его с ключевым словом var.
----------------------------------------
window.open(window.location);


Автор: betaev (не зарегистрирован), дата: 6 октября, 2009 - 16:28
#permalink

переменная удаляется только в том случае, когда перестаёт существовать замыкание в котором они объявлены, а оно перестаёт существовать, как выполнится соответствующая функция и исчезнут все ссылки на эту переменную вне замыкания.
повторное определение "var x" абсолютно ничего не даст, если в этом замыкании уже существует переменная "x".


Автор: Гость (не зарегистрирован), дата: 16 апреля, 2009 - 15:19
#permalink

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


Автор: Леонид Евстигнеев, дата: 27 мая, 2009 - 16:08
#permalink

Обычно это делается созданием массива каждый элемент которого тоже массив.


Автор: Леонид Евстигнеев, дата: 27 мая, 2009 - 16:12
#permalink

Насчёт создания массивов

var a = new Array(10)
var a = [10]

Это далеко не эквивалентные строчки.
Первая создаст массив с длинной в десять элементов.
А вторая массив с одним элементом содержащим значением 10.
Это факт при незнании может приводить к логической ошибке.


Автор: Гость (не зарегистрирован), дата: 3 июня, 2009 - 12:56
#permalink

Люди помогите : " Размер массива определяет количество ... в массиве "
Вместо точек какое слово ставиться , плз помогите


Автор: Леонид Евстигнеев, дата: 3 июня, 2009 - 14:02
#permalink

Элементов.


Автор: proxima (не зарегистрирован), дата: 9 декабря, 2009 - 12:25
#permalink

Парень, ты что - тест сдавал? Какой-то слишком очевидный вопрос! Или плохо читал статью, или лучше займись чем-то кроме программирования.


Автор: Гость (не зарегистрирован), дата: 14 июля, 2009 - 08:57
#permalink

насколько я понял из статьи, в JavaScript массив - это не отдельный тип данных, а просто разновидность объекта? То есть если объект создаётся как ar = {}, то его можно считать ассоциативным массивом, ключи которого есть свойства и методы объекта, а если ar = [] или ar = new Array(), то это объект-массив-список + плюс к нему добавляются методы для работы с массивом-списком. Это правильные выводы?


Автор: Илья Кантор, дата: 7 октября, 2009 - 12:16
#permalink

Да, выводы правильные. При этом, если вы сделали массив Array - не рекомендуется использовать его как ассоциативный Object.


Автор: Гость (не зарегистрирован), дата: 27 октября, 2009 - 17:04
#permalink

Есть массив с прерывистыми индексами идущими не по порядку:

arr[25]     = 1;
arr[8]       = 2;
arr[1099]  = 3;

Вопрос: как пройти по этому массиву в порядке создания и при этом не сбросить ключи? Т.е. мне нужно получить все знаения в том порядке в котором они созданы (1, 2, 3) при этом внутри цыкла я должен знать ключ.
Если делаю for (var i in arr) { ... } - почему то перед проходом массив сортируется по ключу и обход идёт в порядке: 2, 1, 3.
Была мысль попробовать while ( var v = unshift(arr) ) { ... } но тогда я не узнаю индексы.


Автор: Vital (не зарегистрирован), дата: 30 октября, 2009 - 23:09
#permalink

подозреваю, что вы пользуетесь браузером Google Chrome версии 1 или 2, именно в них замечен подобный глюк, во всех остальных браузерах, включая Google Chrome 3, проход по массиву через for (.. in .. ) производится в том порядке, в котором элементы в этот массив помещены


Автор: Yazla, дата: 24 ноября, 2009 - 12:38
#permalink

Скажите пожалуйста, если использую массив для хранения обьектов, то перед удалением массива надо обнулить все ссылки внутри?
То есть так:

for (var i = 0; i<arr.length; i++)
     arr[i] = null
arr = [];

Или обнулять каждый елемент не обязательно?

Спасибо.


Автор: subzey, дата: 24 ноября, 2009 - 16:05
#permalink

Не нужно. Просто задайте arr новое значение. Сборщик мусора сделает все за Вас.

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

Кстати, оптимизируя память, обратите внимание на области данных (как по-русски назвать то, что на этом сайте именутеся {{scope}}?).
Пример:

var myHugeArray = Array(10000000000000000000000);

function deleteArray(){
var myHugeArray = null;
}

deleteArray();

Этот пример вовсе не удалит массив, а создаст новый элемент myHugeArray в области deleteArray, который успешно умрет когда функция отработает, т.е., сразу же.


Автор: Гость (не зарегистрирован), дата: 6 декабря, 2009 - 15:58
#permalink

подскажите пжл как мне задать двумерный массив(в виде матрицы) чтоб элементы задавались random...если можно то попроще))


Автор: subzey, дата: 7 декабря, 2009 - 17:58
#permalink

Создать массив массивов. Если еще актуально.


Автор: Гость (не зарегистрирован), дата: 14 декабря, 2009 - 19:05
#permalink

подскажите что я делаю не так....мне нужно ввести матрицу размера n на n случайным образом....

n=prompt("Введите н","");
Math.random(10);
var v=new Array(Math.random());
for(i=0;i');


Автор: Гость (не зарегистрирован), дата: 6 января, 2010 - 00:01
#permalink

Скажите, а что должно происходить в этом случае:

ar1=["tutu"];

function (){
let ar2 = [];
ar2["a1"]="aa";
ar2["a2"]="bb";
ar1=ar2;
return ar2;
}

что вернёт функция? Что после её отработки будет в ar1?


Автор: B@rmaley.e><e (не зарегистрирован), дата: 6 января, 2010 - 15:03
#permalink

Пожалуй, ничего. Этот код вызовет ошибку синтаксиса.


Автор: Гость (не зарегистрирован), дата: 28 января, 2010 - 20:44
#permalink

Скажите, как найти индекс элемента в массиве?


Автор: B@rmaley.e><e, дата: 28 января, 2010 - 20:58
#permalink

В новых браузерах есть метод indexOf (как у строки).
Для остальных нужно что-то вроде

if(!Array.prototype.indexOf)
	Array.prototype.indexOf = function(searchElement, fromIndex){
		for(var i = fromIndex||0, length = this.length; i<length; i++)
			if(this[i] === searchElement) return i;
		return -1
	};

Автор: Гость (не зарегистрирован), дата: 28 января, 2010 - 21:41
#permalink

Значит, IE6 уже не новый... Впрочем, это и так ясно. Спасибо.


Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
5 + 9 =
Введите результат. Например, для 1+3, введите 4.
 
Текущий раздел
Поиск по сайту
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Статьи и мероприятия

Будьте в курсе наших последних новостей!

Ответьте, пожалуйста..
О чем бы вы хотели услышать на конференции по javascript?

На какие темы послушать доклады? Конференция состоится в середине мая.


Последние обсуждения на форуме
Forum
Последние комментарии