В чем разница между объектами и связанным массивом в JavaScript? - PullRequest
8 голосов
/ 16 ноября 2011

Запутанное обсуждение

В этом вопросе идет обсуждение концепций связанного массива и объекта в javaScript, которое я немного запутал.

Вэтот пример кода:

var check = {
  pattern : {
    name: /^[a-zA-Z-\s]{1,20}$/,
    email: /^[a-zA-Z0-9._(-)]+@[a-zA-Z0-9.(-)]+\.[a-zA-Z]{1,4}$/,
    pass: /.{6,40}/,
    url:  /^[(-)\w&:\/\.=\?,#+]{1,}$/,
    aml:  /<(.+)_([a-z]){1}>$/
    }
};

Это обсуждение приводит меня в замешательство:

@steven.yang внешний объект не является ассоциативным массивом в вашем образце, но это то, чтоспрашивается о

@ sissonb, что вы подразумеваете под «внешний объект не является ассоциативным массивом»?Я думаю, что связанный массив выражается как объект в JavaScript.Разница в обозначениях - либо через foo.bar, либо через foo[bar]

@steven.yang связанный массив означает ключ => значение.http://en.wikipedia.org/wiki/Associative_array Ваш внутренний объект имеет ключ шаблона, у объекта, содержащего этот ассоциативный массив, нет ключа.

Мое понимание связанных массивов и объектов в JS

Associatedмассив определен как пар ключ-значение, что в JavaScript выражается как object.

Внешний объект, назначенный check, имеет ключ pattern и значение другогообъект.Внутренний объект имеет ключи name, email ... и соответствующие значения объектов регулярного выражения.

Могут ли оба объекта считаться ассоциативными массивами?

Ответы [ 5 ]

6 голосов
/ 16 ноября 2011

Не совсем, вот почему:

var arr = new Array();
arr["foo"] = 100;
arr["bar"] = 200;
console.log(arr.length); // Prints 0.

Добавление элементов в ассоциативный массив должно увеличить его длину (IMO).

Это выглядит и действует (несколько) как ассоциативный массив из-за синтаксического сахара. Однако то, что представляется «записями массива», - это (просто) свойства объекта.

5 голосов
/ 16 ноября 2011

Если вы определите «ассоциативный массив» как структуру данных, которая хранит информацию как набор пар ключ-значение, тогда да, объекты JavaScript являются ассоциативными массивами.

Однако фраза «ассоциативный массив»обычно не используется в контексте JavaScript, скорее мы говорим " object ".Я бы предложил придерживаться стандартной терминологии JS, чтобы избежать недопонимания.

Обратите внимание, что JS также имеет (неассоциативные) массивы , с элементами, доступными через числовые индексы.Эти являются также объектами и поэтому допускают свойства нечисловых ключей, но это обычно считается плохой практикой.

3 голосов
/ 16 ноября 2011

В JavaScript нет ассоциативных массивов.Все является объектом.

Конечно, они похожи, но ассоциативные массивы в JavaScript - просто объекты.

2 голосов
/ 16 ноября 2011

Ассоциативный массив

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

Насколько я знаю, объекты в JavaScript соответствуют этому определению.

Конечно, нет уникального объекта «Ассоциативный массив», он отличается от любого другого обычного объекта. Поэтому, если вы хотите использовать функциональность ассоциативного массива, используйте объект javascript.

Однако следующее является распространенной дезинформацией

В JavaScript нет ассоциативного массива

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

0 голосов
/ 24 января 2019

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

...