Другое событие 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));
}
Поскольку 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
).
, что они означают, нет, вы не можете. нет способа сделать это. так что вы могли бы сделать что-то вроде этого
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.
a = 'varname';
str = a+' = '+'123';
eval(str)
alert(varname);
Попробуйте это ...
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)
var node_head = document.getElementsByTagName("head")[0]
вместо ID, поскольку никто не дает id="head"
до <head>
:-)
– ddlab
9 November 2014 в 18:41
Это пример:
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.
Если вы не хотите использовать глобальный объект, например window или global (node), вы можете попробовать что-то вроде этого:
var obj = {};
obj['whatever'] = 'There\'s no need to store even more stuff in a global object.';
console.log(obj['whatever']);
В 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"]);
eval
является одним из вариантов.
var a = 1;
var name = 'a';
document.write(eval(name)); // 1
Вы можете использовать объект окна, чтобы добраться до него.
window['myVar']
window
имеет ссылку на все глобальные переменные и глобальные функции, которые вы используете.
Просто не знаю, что плохой ответ получает так много голосов. Это довольно простой ответ, но вы делаете его сложным.
// 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);
this
" - Если вы хотите получить доступ к переменной global i> таким образом, лучше быть явным и использовать объект 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);