Если Вы не позволяете оценке () динамический контент (через cgi или вводите), это так же безопасно и твердо как весь другой JavaScript на Вашей странице.
В Javascript нет таких вещей, как ассоциативные массивы. Вы можете использовать объектные литералы, которые выглядят как ассоциативные массивы, но имеют неупорядоченные свойства. Обычные массивы Javascript основаны на целочисленных индексах и могут
Прочитав определение ассоциативного массива в Википедии, я собираюсь порвать с традиционными знаниями JavaScript и сказать: «Да, в JavaScript действительно есть ассоциативные массивы». С помощью массивов JavaScript вы можете добавлять, переназначать, удалять и искать значения по их ключам (а ключи могут быть строками в кавычках), что, по словам Википедии, должны делать ассоциативные массивы.
Однако вы, похоже, спрашивая другое - можете ли вы найти одно и то же значение по индексу или ключу. Это не требование для ассоциативных массивов (см. Статью в Википедии). Ассоциативные массивы не обязательно должны давать вам возможность получать значение по индексу.
Массивы JavaScript очень похожи на объекты JavaScript.
arr=[];
arr[0]="zero";
arr[1]="one";
arr[2]="two";
arr["fancy"]="what?";
Да, это массив, и да, вы можете обойтись нечисловыми индексами. (Если вам интересно, после всего этого arr.length будет 3.)
В большинстве случаев, я думаю, вам следует придерживаться числовых индексов при использовании массивов. Думаю, именно этого и ожидает большинство программистов.
Ссылка на мой блог по этой теме.
Собственные объекты JS принимают только строки в качестве имен свойств, что верно даже для индексов числовых массивов ; массивы отличаются от обычных объектов только постольку, поскольку большинство реализаций JS будут хранить числовые индексированные свойства по-разному (то есть в реальном массиве, пока они плотные), и их установка вызовет дополнительные операции (например, настройку свойства length
Если вы ищете карту, которая принимает произвольные ключи, вам придется использовать неродную реализацию . Скрипт предназначен для быстрой итерации, а не для произвольного доступа по числовым индексам, поэтому он может быть не тем, что вы вы ищете.
Базовая реализация карты, которая будет делать то, что вы просите, может выглядеть так:
function Map() {
this.length = 0;
this.store = {};
}
Map.prototype.get = function(key) {
return this.store.hasOwnProperty(key) ?
this.store[key] : undefined;
};
Map.prototype.put = function(key, value, index) {
if(arguments.length < 3) {
if(this.store.hasOwnProperty(key)) {
this.store[key].value = value;
return this;
}
index = this.length;
}
else if(index >>> 0 !== index || index >= 0xffffffff)
throw new Error('illegal index argument');
if(index >= this.length)
this.length = index + 1;
this[index] = this.store[key] =
{ index : index, key : key, value : value };
return this;
};
Аргумент index
для put ()
равен необязательно.
Вы можете получить доступ к значениям в карте map
либо по ключу, либо по индексу через
map.get('key').value
map[2].value
Порядок, в котором объекты появляются в ассоциативном массиве javascript, не определен и будет отличаться в разных реализациях. По этой причине вы не можете рассчитывать на то, что данный ассоциативный ключ всегда будет с одним и тем же индексом.
РЕДАКТИРОВАТЬ:
как указывает Perspx, на самом деле в javascript нет настоящих ассоциативных массивов. Оператор foo ["bar"]
- это просто синтаксический сахар для foo.bar
Если вы доверяете браузеру поддерживать порядок элементов в объекте, вы можете написать функцию
function valueForIndex(obj, index) {
var i = 0;
for (var key in obj) {
if (i++ == index)
return obj[key];
}
}
var stuff = [];
stuff[0] = "foo";
stuff.bar = stuff[0]; // stuff.bar can be stuff["bar"] if you prefer
var key = "bar";
alert(stuff[0] + ", " + stuff[key]); // shows "foo, foo"