2013-11-28 2 views
1

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

  1. Я создал новый Array.
  2. Добавлено "foo"Array как указано в указателе "name".
  3. Добавлено "bar"Array с использованием метода push.

5 тесты на Array

1. var myArray = [];   // undefined 
2. myArray["name"] = "foo";  // "foo" 
3. myArray.push("bar");   // 1 

4. myArray.join(", ");   // "bar" 
5. myArray["name"];    // "foo" 

Мои вопросы (я не понимаю)

  • .push() возвращает 1, который является длина Array, но он должен быть 2, так как Array имеет два значения: «foo» & «bar»

  • Тест 4 показывает, что Array имеет только одно значение "bar", но тест 5 противостоит ему, что также имеет значение "foo".

  • Почему методы Array (push, join и т. Д.) Работают на парах ключ/значение?

  • Тогда как ассоциативный Array работает и как мы можем его обрабатывать (методы, свойства и т. Д.).

ответ

4

.С() возвращает 1, который является длина массива, но он должен быть 2, так как массив имеет два значения «Foo» & «бар»

Нет, потому что массивы в JavaScript не являются ассоциативными структурами данных (даже если вы можете приложить к ним произвольные свойства). Единственными элементами, которые считаются «содержимым массива», являются те, чьи имена свойств удовлетворяют требованиям certain conditions.

Вы также должны знать, что length может также сообщить число, большее, чем вы ожидаете, если массив имеет «дыры». Например:

var a = [1, 2, 3]; 
console.log(a.join(" "), a.length); // "1 2 3", 3 
delete a[1]; 
console.log(a.join(" "), a.length); // "1 3", still 3! 

Test 4 показывает, что массив имеет только одно значение «бар», но тест 5 противостоять она показывает, что она также имеет значение «бар».

Это не имеет значения. Массив также имеет много других свойств, но join затронет только те, о которых говорилось ранее.

Почему методы Array (push, join и т. Д.) Не работают с парами ключ/значение?

Потому что это то, о чем говорит спецификация.

Тогда как работает ассоциативный массив и как мы можем его обрабатывать (методы, свойства и т. Д.).

Используйте простой объект вместо массива, если вы хотите использовать строковые ключи.

0

В JavaScript вы не можете обращаться к элементам массива со строкой, только целыми числами. Так,

1. var myArray = [];   // undefined 
2. myArray["name"] = "foo";  // "foo" 
3. myArray.push("bar"); 

myArray будет содержать только «бар», так как она игнорирует myArray["name"] = "foo"; поэтому вы получите длину 1.

+0

На самом деле, вы можете получить доступ к элементу, используя строку в качестве ключа, если строка может быть преобразован в ряд, попробуйте 'MyArray [«0»]'. – Pavlo

+0

@ pavlo, и если да, то котенок где-то умрет. Не делай этого! Save the kitteh =) – rdodev

0

Так же, как функции, массивы являются объектами. Но есть много прототипов Array, которые целенаправленно не имеют доступа к свойствам объекта. В JavaScript нет «ассоциативного массива», кроме объекта и массивов, в зависимости от функции или кода, которые могут вести себя или использоваться таким же образом, как и для ассоциативного массива. Вы столкнетесь с тем же путаницей для циклов, когда итерации над объектными ключами/парами против значений массива. В целом, хотя они довольно эффективны, есть хорошая книга, называемая Java Script, хорошие части. Что также тогда подчеркивает функции или «плохие части», чтобы избежать или опасны. Гуглинг о резких краях объектов и массивов в Javascript дает некоторые хорошие чтения. Они не сложны, но вам нужно понимать более тонкие способы, по которым Java не похож на JavaScript.

3

У JavaScript на самом деле нет ассоциативных массивов. Способность myArray["foo"] = "bar" является побочным эффектом массивов, просто являющихся объектами и объектами, имеющими свойства.

Только числовые свойства считаются элементами массива. Если вы делаете myArray["foo"] = "bar", вы не не добавляете элемент в массив, вы просто добавляете свойство к объекту.Это отличается от myArray[0] = "bar", который - это, добавляющий элемент и соответственно обновляющий свойство объекта массива length.

+1

У Js есть ассоциативные массивы: js Object * - ассоциативный массив. – GameAlchemist

+1

@GameAlchemist Не так, как описывает OP. JavaScript не имеет типа, который будет автоматически подсчитывать и перебирать все его ключи. –

+0

@JonathanLonowski 'Object.keys()' делает это. – Pavlo

0

Массивы в Javascript не должны быть ассоциативными - когда вы добавляете свойство с помощью ключа, вы фактически добавляете его к объекту массива, а не к самому массиву.

Если вы хотите пару ключ: значение, use an Object

Смежные вопросы