Jump to content
  • 0

Пару нюансов в массивах


people2010
 Share

Question

Изучаю массивы JavaScript.

1)Скажите, если массив создаётся вот так:

var z = ['красный','синий','голубой'];

Переменная z первращается в объект конструктора Array?

в отличи от такого создания

var x = new Array(5,7,3,' Петя');

2)Вот такой вариант у меня в коде встречается.

function magazin(products){

А затем,после этой функции такая строка пишется

var product = new Array(); //Здесь создается объект конструктора Аррей,верно?
magazin(product);

Функция с именем magazin,что превращается в массив магазин,такое разве бывает?

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>Тренировка</title>
<link rel="stylesheet" type="text/css" href="trenirovka.css">
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="otd_file.js"></script>

</head>
<script type='text/javascript'>
var x = new Array(5,7,3,' Петя');
for (var i = 0; i <x.length; i++)
document.write(x[i]+' ');

document.write('<br>');
var z = ['красный','синий','голубой'];
for (var i = 0; i <z.length; i++)
document.write(z[i]+' ');
document.write('<br>');


function magazin(products){
products['рубашки'] = 46;
products['брюки'] = 23;
products['шляпы'] = 14;
products['носки'] = 153;
}

//Вывод на экран данных о запасов товаров
function zapastovara(products){
document.write(products['рубашки'], ' рубашек.<br>');
document.write(products['брюки'], ' брюк.<br>');
document.write(products['шляпы'], ' шляп.<br>');
document.write(products['носки'], ' носков.<br>');
}

var product = new Array();
magazin(product);
zapastovara(product);



</script>
<body>
</body>
</html>

Link to comment
Share on other sites

Recommended Posts

  • 0

Ну а что тебя смущает?

var z = ['красный','синий','голубой'];

var x = new Array(5,7,3,' Петя');

Варианты одинаковые, просто первый используется как литерал, но суть таже. Я например всегда пишу первый вариант, так как он проще, и меньше кода.

Все массивы, это тоже объекты, а значит тоже могут иметь свойства.

Вот у тебя в примере функции function magazin передаётся в качестве параметра массив products, ему назначаются свойства и прописываются для них сразу значения

Link to comment
Share on other sites

  • 0

Скажите, каким образом в функцию в качесве аргумента можно передавать массив?

var product = new Array();
magazin(product);
zapastovara(product);

Как в переменную product,которая после строки

var product = new Array(); стала объектом конструктора Аррэй

может записываться всё что было внутри тела функции?

Ведь здесь magazin(product); передача значений должна идти от объекта product в функцию, а не наоборот?

Edited by people2010
Link to comment
Share on other sites

  • 0
Скажите, каким образом в функцию в качесве аргумента можно передавать массив?

Легко, в переменно хранится массив, его ты и передаёшь в качестве параметра любой функции.

Как в переменную product,которая после строки

var product = new Array(); стала объектом конструктора Аррэй

Справа от new должна стоять функция конструктор, а слева от new объект, который и превращается в объект Конструктора в данном случае Array()

может записываться всё что было внутри тела функции?

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

Ведь здесь magazin(product); передача значений должна идти от объекта product в функцию, а не наоборот?

Чаво?

Link to comment
Share on other sites

  • 0

var product = new Array();

magazin(product);

zapastovara(product);

Но ведь после строки var product = new Array();

создался пустой объект класса Array?

Как может в функцию magazin передастся пустой массив хранящийся в объекте продукт?

[codе]

var product = new Array(); //Это объект класса (не конструктора класса, а самого класса)Array,верно? Ведь экземпляр и объект это одно и тоже.

После этой строки в части оперативной памяти - куче, создался объект.

Вот здесь:

function magazin(products){
products['рубашки'] = 46;
products['брюки'] = 23;
products['шляпы'] = 14;
products['носки'] = 153;
}

Возьмём одну из строк например эту:

products['рубашки'] = 46;

Получается здесь создаётся массив с нуля и первый элемент массива будет products['рубашки']?

Это ассоциативный массив как на пхп?

Потом, когда мы написали

var product = new Array();
magazin(product);

Мы здесь в параметр products передаём объект product и потом,

и объект продукт как-то получает кол-во элементов и значения их?

Edited by people2010
Link to comment
Share on other sites

  • 0
Но ведь после строки var product = new Array();

создался пустой объект класса Array?

Легче сказать, что создался просто пустой массив.

Как может в функцию magazin передастся пустой массив хранящийся в объекте продукт?

В функцию передаётся именно массив, в данном случае пустой.

var product = new Array(); //Это объект класса (не конструктора класса, а самого класса)Array,верно?

Это объект класса Array, или просто массив.

После этой строки в части оперативной памяти - куче, создался объект.

Ну допустим

Возьмём одну из строк например эту:

products['рубашки'] = 46;

Получается здесь создаётся массив с нуля и первый элемент массива будет products['рубашки']?

Массивы - это тоже объекты, а у любого объекта могут быть свойства, и тут получается, что мы передали в фукнцию пустой массив, он создал у него свойство "рубашки"(это его имя), и присвоил им число 46

Это ассоциативный массив как на пхп?

Не в курсе

Мы здесь в параметр products передаём объект product и потом,

и объект продукт как-то получает кол-во элементов и значения их?

Тут бред какой-то написан.

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

Link to comment
Share on other sites

  • 0

А если в самом конце дописать

product['Антена'] = 34;
document.write(product['Антена']);

Под каким номером будет находится элемент Антена в массиве продукт, будет ли он относится к тому списку инициализированному в функции?

Link to comment
Share on other sites

  • 0

Сколько элементов содержит массив product?

Если он инициализируется внутри функции так:

products['рубашки'] = 46;
products['брюки'] = 23;
products['шляпы'] = 14;
products['носки'] = 153;

Можно ли считать что это равносильно этому:

product['рубашки'] = 46;
product['брюки'] = 23;
product['шляпы'] = 14;
product['носки'] = 153;

И можно ли потом использовать например product['рубашки'] = 22220005444; ???

Переопределять этот массив, именно так product['рубашки'], а не так products['рубашки'] как было в функции инициализировано??

2)Можно ли обращаться по номеру индекса массива, а не по брюки,шапки,носки?

Я имею ввиду так: products[2].

Link to comment
Share on other sites

  • 0
Можно ли считать что это равносильно этому:

Можно

И можно ли потом использовать например product['рубашки'] = 22220005444; ???

Можно

Переопределять этот массив, именно так product['рубашки'], а не так products['рубашки'] как было в функции инициализировано??

Не понял вопроса.

2)Можно ли обращаться по номеру индекса массива, а не по брюки,шапки,носки?

Я имею ввиду так: products[2].

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

Link to comment
Share on other sites

  • 0

Просто в функции параметр products инициализация была с products каждого элемента внутри тела функции.

В параметр функции передался объект product, а потом эти все products превратились в индексы не products а product

Link to comment
Share on other sites

  • 0

var arr = [ 1, 2, 3 ];
arr[ 'abc' ] = 10;

Чтобы было более понятно, то это звучит примерно так:

Есть грузовик arr. В кузове грузовика лежит три коробки: 1, 2, 3. В кабину подсела попутчица. Сколько коробок в кузове? Правильно, три. Потому что элементы массива и свойства массива совершенно разные вещи.

Абстрактно в XML этот массив можно описать так

<array>
<properties>
<property name="abc">10</property>
</properties>
<elements>
<element index="0">1</element>
<element index="1">2</element>
<element index="2">3</element>
</elements>
</array>

Edited by s0rr0w
Link to comment
Share on other sites

  • 0
В JavaScript нет ассоциативных массивов как в PHP. Вы раньше на PHP чтоль программировали? Или на чем?

А по-моему этот камрад берётся за всё подряд и как я заметил, только делает себе этим хуже, потому-что из-за дикой каши в голове он ничего не может понять вообще.

Как по мне, то нужно делать всё последовательно, а не сразу 10 вещей.

Link to comment
Share on other sites

  • 0
В JavaScript нет ассоциативных массивов как в PHP. Вы раньше на PHP чтоль программировали? Или на чем? Объектная модель в JavaScript сильно отличается от таковой на PHP.

В JavaScript есть ассоциативные массивы. Объекты - это как раз и есть ассоциативные массивы, и доступ к элементам объекта возможен как через точку, так и через квадратные скобки.

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

Link to comment
Share on other sites

  • 0

Если вы не заметили, я говорил про ассоциативные массивы в PHP. Там ассоциативный массив и объект (класс) - это совершенно разные вещи. Такого плана массивов в JavaScript нет.

Даже в яваскрипте Объекты - это не ассоциативные массивы. Вы не сможете работать со свойствами объекта так же как с массивом (я имею в виду такие методы как push(), join(), shift(), slice() и т.п.).

Не вводите человека в заблуждение.

Link to comment
Share on other sites

  • 0
<html>
<head>
</head>

<body>
<script type='text/javascript'>

var a = new Array(); // пустой массив
a[7] = 7;
a[77.7] = 77.7; // т.к. индекс не челый, длина осталась 8
a.abcd = "xyz"; // равносильно a[abcd] = "xyz"
alert(a.length);
alert(a["abcd"]); // ни чем не отличается от alert(a.abcd);


</script>

</body>
</html>

Link to comment
Share on other sites

  • 0

Да нет в яваскрипте ассоциативных массивов! Запустите и убедитесь:

var arr = new Array();

arr['a'] = 1;
arr['b'] = 2;
arr['c'] = 3;
arr['d'] = 4;
alert(arr.length);
alert(arr);

arr.push(1);
arr.push(2);
arr.push(3);
arr.push(4);
alert(arr.length);
alert(arr);

Если ему свойств назадавать, как вы по нему циклом то ходить будете? А сортировку как сделаете?

Link to comment
Share on other sites

  • 0
В JavaScript есть ассоциативные массивы. Объекты - это как раз и есть ассоциативные массивы, и доступ к элементам объекта возможен как через точку, так и через квадратные скобки.

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

Это не ассоциативные массивы, это больше хэши.

Link to comment
Share on other sites

  • 0
Если вы не заметили, я говорил про ассоциативные массивы в PHP. Там ассоциативный массив и объект (класс) - это совершенно разные вещи. Такого плана массивов в JavaScript нет.

Даже в яваскрипте Объекты - это не ассоциативные массивы. Вы не сможете работать со свойствами объекта так же как с массивом (я имею в виду такие методы как push(), join(), shift(), slice() и т.п.).

Не вводите человека в заблуждение.

Я совершенно ничего не знаю про PHP поэтому, возможно, не понял вашего утверждения, что конкретно вы имели ввиду. Я только знаю общепринятое значение слов "ассоциативный массив" - это (если можно так сказать) массив, в котором индексов может быть не число, а (скажем) произвольная строка. В этом смысле объекты в JavaScript - это ассоциативные массивы. Другой пример ассоциативного массива - map в STL

Если я не могу использовать методы push(), shift() - это вовсе не говорит что что-то - не ассоциативный массив. Это говорит скорее что не массив с целочисленным индексом. Просто не надо считать понятие "ассоциативный массив" разновидностью просто массива, это два разных понятия, хоть и в названии есть общее слово. Так вот, правильнее сказать было бы, что в JavaScript нет "просто массива" а сделана его эмуляция и помощью ассоциативного массива, или, что то же самое, объекта.

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

В JavaScript все не так, память выделяется только для тех элементов, которые есть, и располагаются они в памяти не "в порядке номеров".

Link to comment
Share on other sites

  • 0
В JavaScript все не так, память выделяется только для тех элементов, которые есть, и располагаются они в памяти не "в порядке номеров".

А это тогда как понимать?

var arr = [];
arr[0] = 1;
arr[7] = 2;

alert(arr);
alert(arr.length);

Link to comment
Share on other sites

  • 0
Да нет в яваскрипте ассоциативных массивов! Запустите и убедитесь:

var arr = new Array();

arr['a'] = 1;
arr['b'] = 2;
arr['c'] = 3;
arr['d'] = 4;
alert(arr.length);
alert(arr);

arr.push(1);
arr.push(2);
arr.push(3);
arr.push(4);
alert(arr.length);
alert(arr);

Если ему свойств назадавать, как вы по нему циклом то ходить будете? А сортировку как сделаете?

И в чем я должен убедиться?

Сортировка для ассоциативного массива - понятие не определенное. Еще раз: если в термине "ассоциативный массив" есть слово "массив" это вовсе не значит, что ассоциативный массив - разновидность массива. Это совершенно другое понятие.

Ходить циклом можно используя for( i in ...), кстати, а вот по простому массиву в JavaScript ходить циклом можно не всегда, запросто можно создать массив, в котором десятый элемент есть (и "длина" будет одинадцать), а первого-второго-третьего нет.

Это не ассоциативные массивы, это больше хэши.

Понятия "большие хэши" не знаю. Слово "хэш" знаю в двух смыслах, 1. способ организации поиска, который описан в теории, но на практике наверно уже не применяется, всякие там деревья лучше. Но в любом случае это был бы СПОСОБ РЕАЛИЗАЦИИ ассоциативного массива. 2) Криптографический хэш - к обсуждаемой теме очевидно никакого отношения не имеет.

А это тогда как понимать?

var arr = [];
arr[0] = 1;
arr[7] = 2;

alert(arr);
alert(arr.length);

Понимать так, что length возвращает НЕ размер массива (количество элементов), а максимальный целочисленный номер.

Link to comment
Share on other sites

  • 0
Понимать так, что length возвращает НЕ размер массива (количество элементов), а максимальный целочисленный номер.

А первый alert вы типа не заметили?

1,,,,,,2

а вот по простому массиву в JavaScript ходить циклом можно не всегда

По простому массиву циклом ходить можно всегда.

запросто можно создать массив, в котором десятый элемент есть (и "длина" будет одинадцать), а первого-второго-третьего нет.

неправда, остальные элементы будут пустые

Читайте про хеши.

Вот вам несколько цитат из статьи (если мне не верите и читать лень):

Hash tables are a permutation of associative arrays (i.e. name => value pairs). If you use PHP, then you are very familiar with this type of data structure already since all PHP arrays are associative.
The Javascript language implements very loose and somewhat limited support for associative arrays.

P.S.

Еще по поводу вот этой фразы:

Понимать так, что length возвращает НЕ размер массива (количество элементов), а максимальный целочисленный номер.
The length property sets or returns the number of elements in an array.

Взято отсюда

Link to comment
Share on other sites

  • 0
А первый alert вы типа не заметили?

1,,,,,,2

Так устроен alert, а что тут удивительного?

По простому массиву циклом ходить можно всегда.

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

неправда, остальные элементы будут пустые

var a = new Array();
a[1000000000] = "test";
alert(a[1000000000]);
alert(a.length);

Где берется столько памяти для пустых элементов?

Вот вам несколько цитат из статьи (если мне не верите и читать лень):

Для начала надо бы определиться с терминами. Еще раз, кто такие "хеши" не знаю, вот в цитате написано про хеш-таблицы, есть хэш-функции, а просто "хэши" - нет такого. А главное, прежде чем спорить "ассоциативный массив или нет" надо дать ЧЕТКОЕ определение этому термину.

Тоже приведу цитату (про ассоциативные массивы)

Наиболее популярны реализации, основанные на различных деревьях поиска. Так, например, в стандартной библиотеке STL языка С++ контейнер map реализован на основе красно-чёрного дерева. В языках Ruby, Tcl, Python используется один из вариантов хэш-таблицы. Есть и другие реализации.

Т.е. хэш-таблица - способ реализации.

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

P.S.

Еще по поводу вот этой фразы:

Взято отсюда

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

http://javascript.ru/basic/array#avto-dlina-length

По вашей же ссылке - в JavaScript имеется loose поддержка ассоциативных массивов (слово loose перевел бы как "слабая", "ограниченная", но все же имеется ведь. А чем же она ограничена? Нет удобного конструктора - это та. Нельзя проходить как в STL в порядке возрастания ключей, перейти к следующему, предыдущему (но чтобы это было возможно, надо для начала задать этот самый порядок ключей. Для целых чисел он самоочевиден, а для значений произвольного типа, где могут быть вперемешку дробные числа, строки, ... - как? В STL при создании map можно задать функцию сравнения ключей, да, возможностей больше, но это как раз те возможности, которые выходят за рамки понятия "ассоциативный массив"

Edited by rgl
Link to comment
Share on other sites

  • 0

Про хеши:

определения я давать не собираюсь - как назвали так назвали. По мне это тоже глупость, я б называл вещи своими именами - это просто свойства объекта.

Но я оперирую теми понятиями, которые приняты среди JavaScript программистов. Если вы скажете любому из них про хеш, он поймет вас правильно (ему не придут в голову алгоритмы шифрования типа MD5).

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

Если следовать вашей логике то в том же PHP существуют два ассоциативных массива что ли?

Первый - когда я создаю массив вот так:

$arr = array('key' => value);

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

Но это же бред...

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy