Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Объясните, нубу джаваскрипта, поведени массива. (https://javascript.ru/forum/misc/10234-obyasnite-nubu-dzhavaskripta-povedeni-massiva.html)

Alive Substance 24.06.2010 11:55

Объясните, нубу джаваскрипта, поведени массива.
 
Приветсвую.

Есть простой html:
<html>
<head>
    <script src="js/temp2.js" type="text/javascript"></script>
</head>
<body>
<input type="button" value="kick me" onclick="kick()" >
</body>
</html>


temp2.js:
function kick()
{
    qNumber = 3;

    var qNum = {
        number: qNumber,
        ready: true
    }

    var array = new Array();
    array[qNumber] = qNum;
    var size = array.length;
}


Почему значение переменной size равно 4?
То есть 0,1 и 2-ой элементы массива undefined и только 3-ий имеет конкретное значение.

Kolyaj 24.06.2010 12:00

Потому что length не равно количеству элементов в массиве, а всего навсего всегда больше любого числового индекса.

Alive Substance 24.06.2010 14:00

В приведенном примере в массиве 4 элемента:
[undefined, undefined, undefined, qNum].

Его длина равна 4. Понятно, что индекс последнего элемента 3.
В большой степени интересует почему элементов 4, а не 1. Я ведь добавил только один объект.
Видимо это не полноценный ассоциативный массив, который есть в джаве, допустим.

subzey 24.06.2010 14:16

Потому что length — по определению самый верхний индекс плюс один.

var a = [];
a[3] = "foo";
alert(a.length);
var c = 0;
for (var i in a) c++;
alert(c);

Alive Substance 24.06.2010 14:33

Ок. Спасибо за объяснение.
Я подготавливал массив, что б потом его с помощью DWR кинуть в джава класс. В классе была коллекция, ассоциированная с этим массивом и она говорила, что у нее 4 элемента. При обращениии к 0, 1 и 2 элементу бросалася NullPointerException. Было 2 выхода: почистить массив от undefined элементов до передачи по аджаксу или уже в рантайме в джаве удалить все элементы, что null. Сделал первым способом, что б объем передаваемой информации был меньше(как мне кажется).

Kolyaj 24.06.2010 14:38

Цитата:

Сообщение от Alive Substance
В приведенном примере в массиве 4 элемента:
[undefined, undefined, undefined, qNum].

В приведённом примере в массиве только один элемент, под номером 3.

Цитата:

Сообщение от Alive Substance
Видимо это не полноценный ассоциативный массив, который есть в джаве, допустим.

В JS вообще нет полноценных массивов, а ассоциативных и подавно.

Цитата:

Сообщение от subzey
Потому что length — по определению самый верхний индекс плюс один.

Нет.
alert([1,, , , , , ].length)

B~Vladi 24.06.2010 14:45

Вообще такие моменты описаны в каждой книге.
Цитата:

Сообщение от Kolyaj
В JS вообще нет полноценных массивов

А чего в них не хватает?

Alive Substance 24.06.2010 14:47

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

Kolyaj 24.06.2010 14:48

B~Vladi,
я книг по JS, конечно, не читал. Но вот поискал статьи в интернетах про массивы в JS: в основном ложь и провокация, есть достойные, но не исчерпывающие. В итоге взялся за написание своих. Когда-нибудь допишу :)

subzey 24.06.2010 15:04

Цитата:

Сообщение от http://javascript.ru/Array/length
Длина массива: число, на единицу превосходящее максимальный индекс массива

Kolyaj,
как же это получилось? Там же должен быть 7.

B~Vladi 24.06.2010 15:07

Цитата:

Сообщение от Kolyaj
Когда-нибудь допишу

Аха, поделится ссылкой не забудь:)
Я точно помню, что как минимум в двух источниках видел несколько абзацев по этой теме. И твой, Alive Substance, с добавлением элемента в "середину" массива, и твой, Kolyaj, с определением пустых ключей. Причем length ведёт себя как раз логично.
Цитата:

Сообщение от Kolyaj
Нет.

Как нет ты же сам определил эти элементы, соответственно и длина сходится с определением.

Kolyaj 24.06.2010 15:09

Цитата:

Сообщение от B~Vladi
Как нет ты же сам определил эти элементы

Нет там элементов. Элемент только один, с индексом 0. Больше элементов нет, а length равен 7 в IE и 6 в остальных браузерах.

B~Vladi 24.06.2010 15:11

Цитата:

Сообщение от Kolyaj
Нет там элементов. Элемент только один, с индексом 0

Ни-фи-га. Иначе была бы синтаксическая ошибка. Причем последняя запятая не добавляет элемент, а в ИЕ из-за этого падает скрипт.

Kolyaj 24.06.2010 15:11

Цитата:

Сообщение от subzey
Ушел читать ман

Было бы это в манах-то :)

Kolyaj 24.06.2010 15:13

Цитата:

Сообщение от B~Vladi
Иначе была бы синтаксическая ошибка.

С чего бы вдруг ошибка-то?

var a = [1,,,,];
alert([a.length, 0 in a, 1 in a, 2 in a, 3 in a]);

B~Vladi 24.06.2010 15:19

Цитата:

Сообщение от Kolyaj
С чего бы вдруг ошибка-то?

Ну с того, что синтаксис поддерживает такую запись, определяя пустые элементы. Если бы не поддерживал - другое дело.
А к чему этот код приведён был? Там всё вполне понятно и логично.
in вроде как свойство смотрит?

Kolyaj 24.06.2010 15:21

Цитата:

Сообщение от B~Vladi
определяя пустые элементы

Не пустые элементы, а пропуски элементов.

Цитата:

Сообщение от B~Vladi
А к чему этот код приведён был?

Код показывает, что в массиве существует только нулевой индекс, а length при этом равно 4(5).

B~Vladi 24.06.2010 15:24

Цитата:

Сообщение от Kolyaj
а length при этом равно 4(5)

Дк вот почему так решили написать... Типа всё-таки происходит добавление. Наверно чтобы не травмировать неокрепшие умы:)
Да, кста, осёл в своем духе.


Часовой пояс GMT +3, время: 02:49.