Javascript Evil Eval()未向对象添加属性
我想向具有动态属性名称的对象添加属性 为此,我使用了Javascript Evil Eval()未向对象添加属性,javascript,json,object,eval,Javascript,Json,Object,Eval,我想向具有动态属性名称的对象添加属性 为此,我使用了eval(),但编译器返回:意外标记。我正在做的是可能的,还是eval()不能用于str vars之类的对象 这是我的一些代码 var options = {}; // Creating empty object $("#selAdresse, #selCP, #selVille, #selPays, #selNom, #selDescription").live('change', function(){ var opt =
eval()
,但编译器返回:意外标记。我正在做的是可能的,还是eval()
不能用于str vars之类的对象
这是我的一些代码
var options = {}; // Creating empty object
$("#selAdresse, #selCP, #selVille, #selPays, #selNom, #selDescription").live('change', function(){
var opt = eval("var options.lol"); // The evil eval();
opt = "Test"; // Trying to set options.lol = "test"
console.log(options); // Returning an empty object... Nothing change
});
为什么不这样做呢
var options = {}; // Creating empty object
$("#selAdresse, #selCP, #selVille, #selPays, #selNom, #selDescription").live('change', function(){
options.lol = "Test"; // Trying to set options.lol = "test"
console.log(options); // Returning an empty object... Nothing change
});
为什么不这样做呢
var options = {}; // Creating empty object
$("#selAdresse, #selCP, #selVille, #selPays, #selNom, #selDescription").live('change', function(){
options.lol = "Test"; // Trying to set options.lol = "test"
console.log(options); // Returning an empty object... Nothing change
});
您不能使用var
向对象添加属性。使用var最初声明变量:
var foo = {};
添加属性很简单:
foo.bar = null;
如果有包含属性名称的字符串,则使用方括号表示法:
var propName = 'bar';
foo[propName] = null;
编辑:
根据您对kbok的评论,方括号符号是您想要的:
var options = {};
options[ $( this ).attr( 'id' ) ] = 'Test';
结束编辑
针对您的问题(尽管您不应该这样做,并且有一些方法可以避免),您的评估的语法如下所示:
eval( 'foo.bar = null;' );
您不能使用var
向对象添加属性。使用var最初声明变量:
var foo = {};
添加属性很简单:
foo.bar = null;
如果有包含属性名称的字符串,则使用方括号表示法:
var propName = 'bar';
foo[propName] = null;
编辑:
根据您对kbok的评论,方括号符号是您想要的:
var options = {};
options[ $( this ).attr( 'id' ) ] = 'Test';
结束编辑
针对您的问题(尽管您不应该这样做,并且有一些方法可以避免),您的评估的语法如下所示:
eval( 'foo.bar = null;' );
使用以下代码可以实现相同的行为:
var options = {};
options['lol'] = "Test"; // or options[$(this).attr('id')] = "Test"
console.log(options);
使用以下代码可以实现相同的行为:
var options = {};
options['lol'] = "Test"; // or options[$(this).attr('id')] = "Test"
console.log(options);
问题在于,您将对象属性视为它们自己的变量。它们的工作原理类似,但这意味着您不能声明它们。因此,当您说var options.lol
时,解释器试图将options.lol
解析为有效标识符,但显然不是。在Javascript中,您只需动态添加属性,无需在任何地方声明它们:
options.lol = 'Test';
此外,我假设您首先使用eval
的原因是因为您不知道实际要设置什么属性。Javascript实际上有这样一种语法:
options['lol'] = 'Test';
实际上,您应该几乎从不需要使用eval
来做任何事情。问题在于您将对象属性视为它们自己的变量。它们的工作原理类似,但这意味着您不能声明它们。因此,当您说var options.lol
时,解释器试图将options.lol
解析为有效标识符,但显然不是。在Javascript中,您只需动态添加属性,无需在任何地方声明它们:
options.lol = 'Test';
此外,我假设您首先使用eval
的原因是因为您不知道实际要设置什么属性。Javascript实际上有这样一种语法:
options['lol'] = 'Test';
实际上,您应该几乎从不需要使用eval
来做任何事情。查看注释和其他答案,您似乎在尝试获取对象属性的引用?Javascript没有getter和setter的概念。无论如何你都不能这么做
但是,可以将空对象定义为特性,并创建对该特性的引用
var options = {}; // Creating empty object
options.lol={};
opt = options.lol;
// assign "text" sub-property of options.lol .. equiv. to options.lol.text="Test"
opt.text = "Test";
您还可以创建一个封装引用的函数:
// if falsy value is passed, then return current value. Will be limited because
// you can't assign a falsy value.
opt = function(text) {
if (text) {
options.lol=text;
} else {
return options.lol;
}
};
opt("Test");
alert(opt());
但是绝对没有办法在javascript中创建对属性的直接引用,因为对象在内部不是这样工作的。属性名称本身就是引用 查看注释和其他答案,您似乎正在尝试获取对对象属性的引用?Javascript没有getter和setter的概念。无论如何你都不能这么做
但是,可以将空对象定义为特性,并创建对该特性的引用
var options = {}; // Creating empty object
options.lol={};
opt = options.lol;
// assign "text" sub-property of options.lol .. equiv. to options.lol.text="Test"
opt.text = "Test";
您还可以创建一个封装引用的函数:
// if falsy value is passed, then return current value. Will be limited because
// you can't assign a falsy value.
opt = function(text) {
if (text) {
options.lol=text;
} else {
return options.lol;
}
};
opt("Test");
alert(opt());
但是绝对没有办法在javascript中创建对属性的直接引用,因为对象在内部不是这样工作的。属性名称本身就是引用 哦,对不起,我的解释不清楚;这是因为我想做一些类似的事情:var opt=eval(“var options.”+$(this.attr('id'));//邪恶的评估();哦,对不起,我的解释不清楚;这是因为我想做一些类似的事情:var opt=eval(“var options.”+$(this.attr('id'));//邪恶的评估();为什么不写options.lol=“Test”。这似乎是在试图获取对对象属性的引用,无论是否使用eval,这都是不可能的。您只能获取对对象的引用(尽管对字符串、数字等的引用似乎不是引用,因为对象是不可变的)。为什么不写options.lol=“Test”。这似乎是试图获取对对象属性的引用,无论使用eval还是其他方法,这都是不可能的。您只能获取对对象的引用(尽管对字符串、数字等的引用似乎不是引用,因为这些对象是不可变的)。谢谢,我再也不会使用这个eval()!我的代码现在是options[$(this).attr('id')]=$(“option:selected”,this).val();谢谢你,我再也不用这个eval()了!我的代码现在是options[$(this).attr('id')]=$(“option:selected”,this).val();谢谢你,我要说的是再简单不过了,再快不过了!谢谢你,我要说的是再简单不过了,再快不过了!