Массивы
Javascript поддерживает два вида структуры "массив":
- Ассоциативный массив (хеш), где данные хранятся по произвольному ключу.
Об этом читайте в разделе Объекты.
- Числовой массив
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
Есть и еще много методов:
О них можно почитать на английском, например, в http://developer.mozilla.org/en/..Array
|
Видел конструкцию типа:
a = new array(
{"attr1":"text1","attr2":"text2"}
{"attr1":"text3","attr2":"text4"}
);
Поясните, что это такое?
new Array()- это создание массива из аргументов.Например,
new Array(1,2,3)- массив из трех элементов: 1,2,3, такой же как и[1,2,3].Аргументами в данном случае являются объекты. То есть, у тебя создается массив из двух объектов, каждый из которых задан как
{ свойство1: значение1, свойство2:значение2 }Подробнее об объектах и задании объектов - см. Объекты Javascript в примерах.
А удалять массивы нужно и как вообще очистить существующий массив наиболее коректно?
Javascript автоматически очищает память, как и Java, в отличие от C/C++, поэтому вы можете присвоить переменной новый массив:
При этом старый объект-массив будет удален в процессе "сборки мусора".
Разрешите поинтересоваться, чем плох
Для последующей инициализации массива ещё раз объявляем его с ключевым словом var.
----------------------------------------
window.open(window.location);
переменная удаляется только в том случае, когда перестаёт существовать замыкание в котором они объявлены, а оно перестаёт существовать, как выполнится соответствующая функция и исчезнут все ссылки на эту переменную вне замыкания.
повторное определение "var x" абсолютно ничего не даст, если в этом замыкании уже существует переменная "x".
как задать на яваскрипт двумерный массив...я кучу всего перепробовал неполучается...в браузере не отображается
Обычно это делается созданием массива каждый элемент которого тоже массив.
Насчёт создания массивов
Это далеко не эквивалентные строчки.
Первая создаст массив с длинной в десять элементов.
А вторая массив с одним элементом содержащим значением 10.
Это факт при незнании может приводить к логической ошибке.
Люди помогите : " Размер массива определяет количество ... в массиве "
Вместо точек какое слово ставиться , плз помогите
Элементов.
Парень, ты что - тест сдавал? Какой-то слишком очевидный вопрос! Или плохо читал статью, или лучше займись чем-то кроме программирования.
насколько я понял из статьи, в JavaScript массив - это не отдельный тип данных, а просто разновидность объекта? То есть если объект создаётся как ar = {}, то его можно считать ассоциативным массивом, ключи которого есть свойства и методы объекта, а если ar = [] или ar = new Array(), то это объект-массив-список + плюс к нему добавляются методы для работы с массивом-списком. Это правильные выводы?
Да, выводы правильные. При этом, если вы сделали массив Array - не рекомендуется использовать его как ассоциативный Object.
Есть массив с прерывистыми индексами идущими не по порядку:
Вопрос: как пройти по этому массиву в порядке создания и при этом не сбросить ключи? Т.е. мне нужно получить все знаения в том порядке в котором они созданы (1, 2, 3) при этом внутри цыкла я должен знать ключ.
Если делаю for (var i in arr) { ... } - почему то перед проходом массив сортируется по ключу и обход идёт в порядке: 2, 1, 3.
Была мысль попробовать while ( var v = unshift(arr) ) { ... } но тогда я не узнаю индексы.
подозреваю, что вы пользуетесь браузером Google Chrome версии 1 или 2, именно в них замечен подобный глюк, во всех остальных браузерах, включая Google Chrome 3, проход по массиву через for (.. in .. ) производится в том порядке, в котором элементы в этот массив помещены
Скажите пожалуйста, если использую массив для хранения обьектов, то перед удалением массива надо обнулить все ссылки внутри?
То есть так:
for (var i = 0; i<arr.length; i++) arr[i] = null arr = [];Или обнулять каждый елемент не обязательно?
Спасибо.
Не нужно. Просто задайте
arrновое значение. Сборщик мусора сделает все за Вас.В некоторых браузерах сборщик мусора можно вызвать явным образом, но, как правило, это не требуется. Мало какой массив сравнится по своей громоздкости с тем же объектом
document(на этой странице к нему так или иначе прицеплено более трех тысяч объектов).Кстати, оптимизируя память, обратите внимание на области данных (как по-русски назвать то, что на этом сайте именутеся
{{scope}}?).Пример:
var myHugeArray = Array(10000000000000000000000); function deleteArray(){ var myHugeArray = null; } deleteArray();Этот пример вовсе не удалит массив, а создаст новый элемент
myHugeArrayв областиdeleteArray, который успешно умрет когда функция отработает, т.е., сразу же.подскажите пжл как мне задать двумерный массив(в виде матрицы) чтоб элементы задавались random...если можно то попроще))
Создать массив массивов. Если еще актуально.
подскажите что я делаю не так....мне нужно ввести матрицу размера n на n случайным образом....
n=prompt("Введите н","");
Math.random(10);
var v=new Array(Math.random());
for(i=0;i');
Скажите, а что должно происходить в этом случае:
ar1=["tutu"];
function (){
let ar2 = [];
ar2["a1"]="aa";
ar2["a2"]="bb";
ar1=ar2;
return ar2;
}
что вернёт функция? Что после её отработки будет в ar1?
Пожалуй, ничего. Этот код вызовет ошибку синтаксиса.
Скажите, как найти индекс элемента в массиве?
В новых браузерах есть метод 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 };Значит, IE6 уже не новый... Впрочем, это и так ясно. Спасибо.
Отправить комментарий
Приветствуются комментарии:- Полезные.
- Дополняющие прочитанное.
- Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.Для остальных вопросов и обсуждений есть форум.