Глобальные переменные не обязательно плохие, так же как макросы не обязательно плохие, а обогащенный уран не обязательно плохой. Пока вы принимаете осознанное решение о плюсах и минусах данного выбора дизайна, у вас все будет в порядке.
Некоторые из аргументов против глобальных переменных:
Некоторые из аргументов для глобальных переменных:
Если в вашем проекте глобальные переменные имеют смысл, и их можно использовать для упрощения чтения или поддержки вашего кода , не настраивая себя на случайные ошибки и проверяя головные боли, тогда непременно используйте их.
Я пишу много кода на C для встроенных микроконтроллеров и постоянно использую глобальные переменные. В такой жесткой системе глобальные переменные имеют смысл. Я знаю о потенциальных недостатках, но я проанализировал плюсы и минусы. минусы и я пишу свой код, чтобы защититься от основных ловушек.
Итог: нет жесткого и быстрого правила. Просто примите лучшее решение для вашего конкретного проекта или платформы, основываясь на лучшей информации, которую вы имеете.
Если порядок объектов имеет значение, вам следует пересмотреть схему JSON для хранения объектов в массиве:
[
{"name":"foo", ...},
{"name":"bar", ...},
{"name":"baz", ...}
]
или, возможно,:
[
["foo", {}],
["bar", {}],
["baz", {}]
]
Как указывает Бен Альперт, свойства объектов Javascript не упорядочены, и ваш код не работает, если вы ожидаете, что они будут перечисляться в том же порядке, в котором они указаны в литерале объекта - нет свойства "first".
Невозможно получить первый элемент, поскольку «хэши» (объекты) в JavaScript имеют неупорядоченные свойства. Лучше всего хранить ключи в массиве:
var keys = ["foo", "bar", "baz"];
Затем используйте это, чтобы получить правильное значение:
object[keys[0]]
они не на самом деле упорядочены, но вы можете сделать:
var first;
for (var i in obj) {
if (obj.hasOwnProperty(i) && typeof(i) !== 'function') {
first = obj[i];
break;
}
}
.hasOwnProperty ()
важен для игнорирования прототипов объектов.
Вчера у меня была такая же проблема. Я решил это так:
var obj = {
foo:{},
bar:{},
baz:{}
},
first = null,
key = null;
for (var key in obj) {
first = obj[key];
if(typeof(first) !== 'function') {
break;
}
}
// first is the first enumerated property, and key it's corresponding key.
Не самое элегантное решение, и я почти уверен, что оно может давать разные результаты в разных браузерах (т.е. в спецификациях сказано, что перечисление не требуется для перечисления свойств в том же порядке, в каком они были определено). Однако в моем объекте было только одно свойство, так что это не было проблемой. Мне просто нужен был первый ключ.
Вы можете сделать что-то вроде этого:
var object = {
foo:{a:'first'},
bar:{},
baz:{}
}
function getAttributeByIndex(obj, index){
var i = 0;
for (var attr in obj){
if (index === i){
return obj[attr];
}
i++;
}
return null;
}
var first = getAttributeByIndex(object, 0); // returns the value of the
// first (0 index) attribute
// of the object ( {a:'first'} )
Если вам нужно что-то лаконичное, попробуйте:
for (first in obj) break;
alert(first);
обернутое в функцию:
function first(obj) {
for (var a in obj) return a;
}