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

Длинна массива не зависит от наличия данных у элементов. Вы можете создать массив длинной в 5 элементов, и не заполнять ни одну ячейку.

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

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

Link to comment
Share on other sites

  • 0
Про хеши:

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

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

А я попытаюсь дать определение (сам, никуда не заглядывая). Хэш-функция - это функция, значение которой непредсказуемо, и как бы случайно зависит он аргумента. Т.е поменяли в исходном значении что-то незначительно (один битик в целом числе, одну букву в строке) и значение функции поменялось, причем поменялось сильно, независимо от того, как мало поменялось исходное данное. Понятно, что в криптографии требование к "как бы случайно" намного выше.Хэш-таблица - структура данных и метод поиска в нем (а также добавления), основанный на использовании свойст хэш-функции. Просто хеш - некорректное использование слова, что нередко встречается, когда, например, марганцовку называют марганцем, а нашатырный спирт - нашатырем.

Теперь о свойствах объекта. В языке С есть структуры, у которых есть поля. Последнее время их стало модным называть не полями а свойствами, но суть не меняется. Главное, что если у структуры s есть поля a,b и c, то мы можем доступиться до них написав s.a s.b s.c, так должно быть написано в программе, и нет никакого способа указать к какому из полей мы хотим доступиться используя переменную.В JavaScript все не так, там можно доступиться, s[ x ] где x - переменная, содержащая текстовую строку, сообщающую к какому именно полю мы хотим доступиться. Все, этого уже достаточно чтобы называть это ассоциативным массивом.

Есть операция добавления, доступа, удаления.

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

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

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

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

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

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

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

Я к сожалению не знаю PHP поэтому тут ничего сказать не могу.

Ссылки:

1. Ассоциативный массив в википедии. Приводятся конкретные примеры в т.ч. и объекты JavaScript

http://ru.wikipedia.org/wiki/%D0%90%D1%81%...%81%D0%B8%D0%B2

2. Сайт javascript.ru на этом форуме считается авторитетным источником. Вот что там написано:

Объект в javascript представляет собой обычный ассоциативный массив или, иначе говоря, "хэш". Он хранит любые соответствия "ключ => значение" и имеет несколько стандартных методов.
Длинна массива не зависит от наличия данных у элементов. Вы можете создать массив длинной в 5 элементов, и не заполнять ни одну ячейку.
Именно то, что я и утверждаю, максимальный целочисленный индекс плюс один. И больше ничего.

Если написать:

var a = new Array();

a[10] = 0;

то "длина" будет 11, a[15] не существует, но равным образом не существует и a[5]

Вы ошибаетесь, думая, что JS работает с памятью или есть какие-то ограничения. Длинна массива может быть декларативной, а может быть реальной. Пустые элементы могут не занимать вообще память, а могут занимать, все зависит от реализации интерпретатора.
Я как раз не ошибаюсь. Я точно знаю, что массив в других языках программирования - это расположене элементов в памяти последовательно, т.е. если есть первый элемент и есть десятый, то будет и второй, третий, и т.д. (или по крайней мере будет память где он должен находиться, с конкретным адресом). В JavaScript такого нет, занимают память только существующие элементы, и это потому что массивов в JavaScript нет, есть только эмуляция массивов с помощью ассоциативных_массивов.
Пустые элементы могут не занимать вообще память, а могут занимать, все зависит от реализации интерпретатора.
Нет, не так. Пустые элементы в JavaScript не будут занимать память ни в какой реализации интерпретатора.

Еще раз:

1. массив и ассоциативный массив - два разных понятия, а не одно - разновидность другого. У ассоциативного массива нет и не может быть сортировки, обращения.

2. Хэш-таблица - метод поиска, с помощью которого можно реализовать ассоциативный массив. Но это есть и должно быть скрыто, и если вместо хэш-таблицы использовать какое-нибудь из многочисленных деревьев, ничего не поменяется. Так же как "быстрая сортировка" - название метода (алгоритма) сортировки, но когда вы вызываете функцию сортировки, вам не важно знать что она делает внутри, и действительно ли там быстрая сортировка или heap-сортировка, или еще какая-то.

Link to comment
Share on other sites

  • 0
У ассоциативного массива нет и не может быть сортировки, обращения.

Я уж не знаю как в Си, но вот в PHP любой массив - ассоциативный, так что ваше утверждение не совсем верно. Причем PHP - это Си-подобный язык...

То что приведено в Википедии под видом хеша называется JSON.

Link to comment
Share on other sites

  • 0
Я уж не знаю как в Си, но вот в PHP любой массив - ассоциативный, так что ваше утверждение не совсем верно. Причем PHP - это Си-подобный язык...

Мое утверждение не совсем верно - наверно это так. Давайте подумаем что такое сортировка. Есть некоторое множество полей, ячеек, элементов, не важно как называть. У них есть названия (имена, номера), и в них могут храниться значения.

Иногда (но не всегда) у ячеек есть какой-то естественный, самоочевидный порядок, напр. если это числа, то по возрастанию. Так вот, сортировка - перестановка ЗНАЧЕНИЙ так, чтобы в результате порядок НАЗВЕНИЙ и порядок ЗНАЧЕНИЙ совпадал. У массива (обычного) есть естественный порядок ячеек - порядок целых чисел. Поэтому понятно что значит сортировка. Для ассоциативных массивов это не так, но придумать что-нибудь можно :-)

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

О массивах (обычных). Никто не станет спорить что в С массивы есть, и никто не назовет их неполноценными. Тем не менее нет добавления элементов в начало и в конец, нет обращения, соединения. Да, кажется, вообще ничего нет :-) хотя кое-что из этого списка можно легко реализовать самому.

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

То что приведено в Википедии под видом хеша называется JSON.

Про хэш вообще ничего не говорил. Привел ссылку на статью в википедии про ассоциативные массивы.

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

Link to comment
Share on other sites

  • 0
rgl, открою вам страшную тайну, в PHP ассоциативные массивы можно сортировать. По ключу. http://www.php.net/manual/en/function.ksort.php

Гы.... все то же самое, а именно, нужно сначала четко определиться, что мы понимаем под каким-то термином, а затем уже обсуждать и спорить. То, что я увидел в приведенном в начале странички примере, говорит, что тут оба слова, и "сортировка" и "массив" используются в несколько другом смысле, а конкретно - если у пар (ключ-значение) есть какой-то порядок, который можно поменять (напр. при сортировке), то это нечто большее, чем ассоциативный массив. Каждой такой паре можно естественным образом присвоить номер, а значит к значению можно доступиться по ключу (что собственно и требуется от ассоциативного массива), но можно также и по номеру - а это свойство простого массива. И вот этот простой массив, в котором хранятся пары (ключ-значение) как раз и сортируется. Ассоциативный же массив остается таким, каким и был, т.е. как было у элемента с ключом d значение lemon", а у элемента с ключом a - orange, так они и остались.

Другими словами, кроме ассоциативного массива есть еще скрытый (?) обычный массив, вот он как раз и сортируется.

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