js: Можно ли назвать переменную с сгенерированным именем? [Дубликат]

Другое событие NullPointerException возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals для гарантированного непустого объекта.

Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null.

Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

276
задан user2864740 29 August 2014 в 06:38
поделиться

11 ответов

Поскольку ECMA- / Javascript - это все Objects и Contexts (которые также являются некоторыми объектами Object), каждая переменная хранится в такой переменной Variable (или в случае функции, объекта активации).

Итак, если вы создаете такие переменные:

var a = 1,
    b = 2,
    c = 3;

В глобальной области контекста (= NO) вы неявно записываете эти переменные в объект Global (= window в браузере).

Доступ к ним можно получить с помощью обозначения «точка» или «скобка»:

var name = window.a;

или

var name = window['a'];

работает только для глобального объекта в этом конкретном экземпляре, поскольку объект Variable Object глобального объекта является объектом window. Внутри контекста функции у вас нет прямого доступа к объекту активации. Например:

function foobar() {
   this.a = 1;
   this.b = 2;

   var name = window['a']; // === undefined
   alert(name);
   name = this['a']; // === 1
   alert(name);
}

new foobar();

new создает новый экземпляр самоопределяемого объекта (контекста). Без new область действия функции также будет global (= окно). В этом примере будут предупреждены undefined и 1 соответственно. Если бы мы заменили this.a = 1; this.b = 2 на:

var a = 1,
    b = 2;

Оба вывода оповещений были бы неопределенными. В этом случае переменные a и b будут храниться в объекте активации из foobar, к которому мы не можем получить доступ (конечно, мы могли бы получить доступ к ним напрямую, вызывая a и b).

281
ответ дан McGarnagle 19 August 2018 в 17:39
поделиться
  • 1
    Еще одна интересная вещь заключается в том, что таким образом вы можете добавить обратный вызов (начало / конец) для любой функции глобального уровня. – antitoxic 7 August 2012 в 08:39
  • 2
    Но что, если моя динамическая переменная локальна в функции? например: function boink () {var a = 1; // это не будет работать var dynamic = this ['a']; // это также не работает var dynamic = ['a']; } – Kokodoko 28 October 2013 в 13:03
  • 3
    @ Kokodoko, потому что этот не является «контекстом». или ссылку на контекст выполнения функции (нет способа ссылаться на контекст выполнения, это запрещено ECMA-262). этот задается тем, как вызывается функция (или bind ), это просто объект, который не имеет никакого отношения к контексту выполнения, в котором он доступен. – RobG 13 May 2015 в 02:55
  • 4
    Если вам нужно получить доступ к вложенным свойствам, проверьте stackoverflow.com/questions/4244896/… – Mr Br 22 June 2015 в 08:12
  • 5
    указал мне в правильном направлении с обозначением кронштейна. Была заклеена мысленная точка ноты. – Andrew 2 March 2017 в 21:29

, что они означают, нет, вы не можете. нет способа сделать это. так что вы могли бы сделать что-то вроде этого

function create(obj, const){
// where obj is an object and const is a variable name
function const () {}

const.prototype.myProperty = property_value;
// .. more prototype

return new const();

}

, имеющее функцию создания так же, как и в ECMAScript 5.

3
ответ дан Alfgaar 19 August 2018 в 17:39
поделиться
  • 1
    Остерегайтесь: const - это ключевое слово в ES6 – Tejas Manohar 17 November 2015 в 10:00
  • 2
    ... и до этого было будущее зарезервированное слово . – T.J. Crowder 9 December 2015 в 17:23
a = 'varname';
str = a+' = '+'123';
eval(str)
alert(varname);

Попробуйте это ...

27
ответ дан amitchd 19 August 2018 в 17:39
поделиться

eval () не работал в моих тестах. Но добавление нового кода JavaScript в дерево DOM возможно. Итак, вот функция, которая добавляет новую переменную:

function createVariable(varName,varContent)
{
  var scriptStr = "var "+varName+"= \""+varContent+"\""

  var node_scriptCode = document.createTextNode( scriptStr )
  var node_script = document.createElement("script");
  node_script.type = "text/javascript"
  node_script.appendChild(node_scriptCode);

  var node_head = document.getElementsByTagName("head")[0]
  node_head.appendChild(node_script);
}

createVariable("dynamicVar", "some content")
console.log(dynamicVar)
0
ответ дан Axel Heider 19 August 2018 в 17:39
поделиться
  • 1
    небольшое улучшение, лучше использовать var node_head = document.getElementsByTagName("head")[0] вместо ID, поскольку никто не дает id="head" до <head> :-) – ddlab 9 November 2014 в 18:41
  • 2
    Я делаю :) Но спасибо, теперь я могу, наконец, удалить этот `id = & quot; head & quot; вещь – Axel Heider 4 May 2015 в 11:33
  • 3
    Это просто слишком сложный способ создания глобальной переменной ?! (... и как это отвечает на вопрос?) – MrWhite 23 August 2015 в 23:39

Это пример:

for(var i=0; i<=3; i++) {
    window['p'+i] = "hello " + i;
}

alert(p0); // hello 0
alert(p1); // hello 1
alert(p2); // hello 2
alert(p3); // hello 3

Другой пример:

var myVariable = 'coco';
window[myVariable] = 'riko';

alert(coco); // display : riko

Итак, значение « coco » myVariable становится переменной coco.

Поскольку все переменные глобальной области действия являются свойствами объекта Window.

19
ответ дан Azodium 19 August 2018 в 17:39
поделиться

Если вы не хотите использовать глобальный объект, например window или global (node), вы можете попробовать что-то вроде этого:

var obj = {};
obj['whatever'] = 'There\'s no need to store even more stuff in a global object.';

console.log(obj['whatever']);
3
ответ дан Brent Barbata 19 August 2018 в 17:39
поделиться

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

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

var id = "abc";
var mine = {};
mine[id] = 123;
console.log(mine.abc);

дает 123. Обычно вы хотите построить переменную, поэтому есть косвенность, так что вы также можете сделать это наоборот.

var mine = {};
mine.abc = 123;
console.log(mine["a"+"bc"]);
11
ответ дан David Newcomb 19 August 2018 в 17:39
поделиться
  • 1
    var someJsonObj = {}; в цикле .... для (var i = 0; i & lt; = 3; i ++) {someJsonObj [i] = []; }, но я могу быть чем угодно. так что динамически сгенерированные переменные, все сидят внутри someJsonObj для удобства. – rajeev 7 April 2017 в 06:31

eval является одним из вариантов.

var a = 1;
var name = 'a';

document.write(eval(name)); // 1
122
ответ дан erickb 19 August 2018 в 17:39
поделиться
  • 1
    +1. Eval - единственный ответ здесь, который будет работать для неглобальных переменных, и об этом следует упомянуть в принятом ответе. – Ethan 2 January 2014 в 08:20
  • 2
  • 3
    @EasyBB - если вы собираетесь сказать, что никогда не используйте что-то, я могу объяснить, почему. У меня есть ситуация, в которой я не могу думать о другом способе выполнения того, что я делаю, кроме eval () – Rampant Creative Group 25 March 2014 в 12:54
  • 4
    Eval представляет угрозу для нападений на конечных пользователей, и мы не будем технически зла, а неправильно истолковываться и злоупотреблять в случае потери. Я видел ответы php, которые содержат литеральные вары, а затем используют eval для запуска. Хотя это не следует использовать в этом случае, поскольку есть лучшие методы. Этот вопрос под рукой eval не должен использоваться вообще, поскольку есть лучшие методы в целом, и я уверен, что многие из нас это знают. – EasyBB 25 March 2014 в 15:26
  • 5
    Через javascriptweblog.wordpress.com/2010/04/19/how-evil-is-eval --- «Давайте рассмотрим наиболее часто используемые аргументы против использования eval: 1) Требуется компиляция и поэтому медленно 2) Что делать, если вредоносный скрипт нашел свой путь в аргументе eval? 3) Он выглядит уродливым. 4) Он наследует контекст выполнения и эту привязку области, в которой его вызывал & quot; – mattLummus 13 May 2015 в 15:07
  • 6
    Вот как создать динамические переменные с помощью eval: stackoverflow.com/a/13291766/5528600 – am2124429 21 March 2016 в 13:54

Вы можете использовать объект окна, чтобы добраться до него.

window['myVar']

window имеет ссылку на все глобальные переменные и глобальные функции, которые вы используете.

58
ответ дан Sebastian Palma 19 August 2018 в 17:39
поделиться

Просто не знаю, что плохой ответ получает так много голосов. Это довольно простой ответ, но вы делаете его сложным.

// If you want to get article_count
// var article_count = 1000;
var type = 'article';
this[type+'_count'] = 1000;  // in a function we use "this";
alert(article_count);
28
ответ дан shkschneider 19 August 2018 в 17:39
поделиться
  • 1
    "в функции, которую мы используем this" - Если вы хотите получить доступ к переменной global таким образом, лучше быть явным и использовать объект window, а не this. this неоднозначно. – MrWhite 23 August 2015 в 23:25

Мне нужно было нарисовать несколько FormData «на лету» и объектный способ работал хорошо

var forms = {}

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

forms["formdata"+counter]=new FormData();
forms["formdata"+counter].append(var_name, var_value);
2
ответ дан Talha 19 August 2018 в 17:39
поделиться
Другие вопросы по тегам:

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