Определить const с массивом [duplicate]

Когда вы объявляете ссылочную переменную (т. е. объект), вы действительно создаете указатель на объект. Рассмотрим следующий код, в котором вы объявляете переменную примитивного типа int:

int x;
x = 10;

В этом примере переменная x является int, и Java инициализирует ее для 0. Когда вы назначаете его 10 во второй строке, ваше значение 10 записывается в ячейку памяти, на которую указывает x.

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

Integer num;
num = new Integer(10);

Первая строка объявляет переменную с именем num, но она не содержит примитивного значения. Вместо этого он содержит указатель (потому что тип Integer является ссылочным типом). Поскольку вы еще не указали, что указать на Java, он устанавливает значение null, что означает «Я ничего не указываю».

Во второй строке ключевое слово new используется для создания экземпляра (или создания ) объекту типа Integer и переменной указателя num присваивается этот объект. Теперь вы можете ссылаться на объект, используя оператор разыменования . (точка).

Exception, о котором вы просили, возникает, когда вы объявляете переменную, но не создавали объект. Если вы попытаетесь разыменовать num. Перед созданием объекта вы получите NullPointerException. В самых тривиальных случаях компилятор поймает проблему и сообщит вам, что «num не может быть инициализирован», но иногда вы пишете код, который непосредственно не создает объект.

Например, вы можете имеют следующий метод:

public void doSomething(SomeObject obj) {
   //do something to obj
}

В этом случае вы не создаете объект obj, скорее предполагая, что он был создан до вызова метода doSomething. К сожалению, этот метод можно вызвать следующим образом:

doSomething(null);

В этом случае obj имеет значение null. Если метод предназначен для того, чтобы что-то сделать для переданного объекта, целесообразно бросить NullPointerException, потому что это ошибка программиста, и программисту понадобится эта информация для целей отладки.

Альтернативно, там могут быть случаи, когда цель метода заключается не только в том, чтобы работать с переданным в объекте, и поэтому нулевой параметр может быть приемлемым. В этом случае вам нужно будет проверить нулевой параметр и вести себя по-другому. Вы также должны объяснить это в документации. Например, doSomething может быть записано как:

/**
  * @param obj An optional foo for ____. May be null, in which case 
  *  the result will be ____.
  */
public void doSomething(SomeObject obj) {
    if(obj != null) {
       //do something
    } else {
       //do something else
    }
}

Наконец, Как определить исключение & amp; причина использования Трассировки стека

83
задан senshin 29 December 2014 в 04:56
поделиться

7 ответов

Для этого нет единственного решения (ну, есть eval, но не стоит серьезно относиться к этому). Доступ к глобальным переменным возможен динамически через window, но это не работает для переменных, локальных для функции.

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

Если у вас есть фиксированный набор имен, например

// BAD
var foo = 42;
var bar = 21;

var key = 'foo';
console.log(eval(key));

сохранить эти имена / значения в качестве свойств объекта и использовать нотацию скобки для динамического поиска:

// GOOD
var obj = {
  foo: 42,
  bar: 21,
};

var key = 'foo';
console.log(obj[key]);


Если у вас есть «последовательные» нумерованные переменные, такие как

// BAD
var foo1 = 'foo';
var foo2 = 'bar';
var foo3 = 'baz';

var index = 1;
console.log(eval('foo' + index));

, тогда вы должны использовать массив и просто использовать индекс для доступа к соответствующему значению:

// GOOD
var foos = ['foo', 'bar', 'baz'];
var index = 1;
console.log(foos[index - 1]);

113
ответ дан cezar 18 August 2018 в 21:30
поделиться

Вы можете использовать функцию JavaScript eval(str) .

Что эта функция делает, это преобразовать строку, предоставленную в JS-код, а затем выполняет ее.

Например:

eval("console.log('hello world')"); // Logs hello world

Итак, чтобы использовать его как переменную переменную, вы можете сделать следующее:

var a = "hello";
var hello = "world";
console.log(a + " " + eval(a)); // Logs hello world

Это даст тот же результат, что и:

console.log(a + " " + hello); // Logs hello world

(Пример из руководства PHP по переменным переменным .)

2
ответ дан Abraham Murciano Benzadon 18 August 2018 в 21:30
поделиться

Чтобы ссылаться на переменную в javascript только с помощью строки, вы можете использовать

window['your_variable_name']

. Вы можете также устанавливать и ссылаться на переменные и объекты в переменных.

3
ответ дан Awesomeness01 18 August 2018 в 21:30
поделиться

Конечно, можете, но не надо. Переменные должны быть глобальными.

var killingFunction = 'alert'
var killMeNow = 'please'
var please = 'You have been killed!'
this[killingFunction](this[killMeNow])
1
ответ дан Konrad Borowski 18 August 2018 в 21:30
поделиться
var vars = {};
var var_name = "str";
vars[var_name] = "working";
console.log(vars["str"]);
1
ответ дан lkdhruw 18 August 2018 в 21:30
поделиться

Если вы отчаянно хотите сделать это, вы можете либо попробовать использовать eval ():

var data = "testVariable";
eval("var temp_" + data + "=123;");
alert(temp_testVariable);

, либо использовать оконный объект:

var data = "testVariable";
window["temp_" + data] = 123;
alert(window["temp_" + data]);

http: //www.hiteshagrawal.com/javascript/dynamic-variables-in-javascript

39
ответ дан Masterbuddha 18 August 2018 в 21:30
поделиться
  • 1
    +1 для оконного решения – DanMan 14 May 2013 в 14:53
  • 2
    eval не может создавать локальные переменные в строгом режиме. Однако косвенный вызов может создавать глобальные переменные. – Oriol 27 November 2016 в 23:41

В отличие от PHP, JavaScript не предоставляет доступ к массиву globals (который содержит ссылки на все объявленные имена переменных). Таким образом, JavaScript не предлагает встроенную поддержку переменных переменных. Вы можете, однако, эмулировать эту функцию, пока вы определяете все свои переменные как часть массива или объекта. Это, в свою очередь, создаст для вас массив злодеев. Например, вместо объявления переменной hello в глобальной области видимости следующим образом:

var hello = 'hello world';

давайте инкапсулируем ее внутри объекта. Мы будем называть этот объект vv (переменными переменными):

var vv = {
    'hello': 'hello world',
    //Other variable variables come here.
},
referToHello = 'hello';

Теперь мы можем ссылаться на переменную по ее индексу, и поскольку индексы массива могут быть предоставлены с использованием переменной, мы фактически используем переменная переменная:

console.log(vv[referToHello]); //Output: hello world

Ответ на ваш вопрос

Давайте применим это к коду, указанному в исходном вопросе:

    var vv = {
        'x': 'variable',
        'variable': 'hello world!'
    };
    console.log(vv[vv['x']]); //Displays "hello, world!"

A Практическое использование

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

var elementIds = [],
        elements = ['message','fillOrStroke','sizePicker','colorPicker']; //The items in this array could be defined automatically via an input, database query, event, etc.
        elements.forEach( (element) => {
            elementIds[element] = document.getElementById(element);
        });

В этом примере объявляются переменные переменные (ключи в elementIds) на основе идентификатора каждого элемента , и назначит узел упомянутого элемента как значение каждой переменной. И поскольку использование глобальных переменных в JavaScript, как правило, не рекомендуется, если переменные переменные являются уникальной областью (в этом случае, объявив их внутри массива elementIds) не только аккуратно, но и более ответственным.

2
ответ дан Nadav 18 August 2018 в 21:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: