Javascript 对函数和纯字符串都有效的评估
Javascript Eval to work for both function and plain string
我想显示一个项目列表,现在有时这些项目的标题只是一个普通字符串,有时它可能是一个函数返回的值。
如何使用 eval() 让这两个事件都起作用?
这是一个示例代码:
var a1 = "formatDate('" + startTime + "') + ' - ' + formatDate('" + endTime + "')"
var a2 = "#america"
var result1 = eval(a1) // works well!
var result2 = eval(a2) // doesn't work, need to use eval('a2') but then first one doesn't work
我唯一能想到的是在创建字符串(例如“#america”)时将其保存为“'#america'”,但我宁愿避免它
[编辑]
最终我会有这样的东西:
arr.push("formatDate('" + startTime + "') + ' - ' + formatDate('" + endTime + "')");
arr.push("#america");
for(var i = 0; i < arr.length; i++) {
var ev = eval(arr[i]);
console.log(ev);
}
我的建议是将 eval 包装在 try catch 块中,如果 eval 成功,则 return 值否则 return 最初传递给函数的值。在很多情况下,eval 可能会失败,因为它只是试图将字符串解析为有效 JavaScript,因此任何无效的 JS 而不仅仅是简单的字符串都可能导致它失败,因此最好是安全并捕获出现的任何错误出来了。
var evaluate = function(value) {
try {
return eval(value);
}
catch(err)
{
return value;
}
}
var ev = eval(a2)
等同于 var ev = eval('#america')
,这没有任何实际意义。
当您说 eval('a2')
有效时,我假设 ev = '#america'
是期望的结果。 'a2'
表达式被评估为简单地访问该名称的变量的值。
您基本上只是拥有一系列字符串,这些字符串可能是有效的 javascript 代码,也可能不是,而且无法分辨哪个是哪个。在那种情况下,你能做的最好的事情就是
try {
ev = eval(arr[i]);
} catch(ex) {
ev = arr[i];
}
... 这显然看起来很糟糕。你能控制arr
中条目的内容吗?
arr.push(function() {
return formatDate(startTime) - formatDate(endTime);
});
arr.push("#america");
在这种情况下,您可以检查每个条目的类型,并据此采取行动:
for(var i = 0; i < arr.length; i++) {
var ev = typeof arr[i] == 'function' ? arr[i]() : arr[i];
console.log(ev);
}
这是我应该做的:
var a1 = function(){
return formatDate(startTime) + formatDate(endTime)
}
var a2 = "#america"
var result1 = a1();
var result2 = a2;
你可以用 typeof(a1) 检查 var 是函数还是对象还是其他任何东西。
if(typeof(a1)=='function'){
result = a1();
}else{
result=a1;
}
我想显示一个项目列表,现在有时这些项目的标题只是一个普通字符串,有时它可能是一个函数返回的值。
如何使用 eval() 让这两个事件都起作用?
这是一个示例代码:
var a1 = "formatDate('" + startTime + "') + ' - ' + formatDate('" + endTime + "')"
var a2 = "#america"
var result1 = eval(a1) // works well!
var result2 = eval(a2) // doesn't work, need to use eval('a2') but then first one doesn't work
我唯一能想到的是在创建字符串(例如“#america”)时将其保存为“'#america'”,但我宁愿避免它
[编辑]
最终我会有这样的东西:
arr.push("formatDate('" + startTime + "') + ' - ' + formatDate('" + endTime + "')");
arr.push("#america");
for(var i = 0; i < arr.length; i++) {
var ev = eval(arr[i]);
console.log(ev);
}
我的建议是将 eval 包装在 try catch 块中,如果 eval 成功,则 return 值否则 return 最初传递给函数的值。在很多情况下,eval 可能会失败,因为它只是试图将字符串解析为有效 JavaScript,因此任何无效的 JS 而不仅仅是简单的字符串都可能导致它失败,因此最好是安全并捕获出现的任何错误出来了。
var evaluate = function(value) {
try {
return eval(value);
}
catch(err)
{
return value;
}
}
var ev = eval(a2)
等同于 var ev = eval('#america')
,这没有任何实际意义。
当您说 eval('a2')
有效时,我假设 ev = '#america'
是期望的结果。 'a2'
表达式被评估为简单地访问该名称的变量的值。
您基本上只是拥有一系列字符串,这些字符串可能是有效的 javascript 代码,也可能不是,而且无法分辨哪个是哪个。在那种情况下,你能做的最好的事情就是
try {
ev = eval(arr[i]);
} catch(ex) {
ev = arr[i];
}
... 这显然看起来很糟糕。你能控制arr
中条目的内容吗?
arr.push(function() {
return formatDate(startTime) - formatDate(endTime);
});
arr.push("#america");
在这种情况下,您可以检查每个条目的类型,并据此采取行动:
for(var i = 0; i < arr.length; i++) {
var ev = typeof arr[i] == 'function' ? arr[i]() : arr[i];
console.log(ev);
}
这是我应该做的:
var a1 = function(){
return formatDate(startTime) + formatDate(endTime)
}
var a2 = "#america"
var result1 = a1();
var result2 = a2;
你可以用 typeof(a1) 检查 var 是函数还是对象还是其他任何东西。
if(typeof(a1)=='function'){
result = a1();
}else{
result=a1;
}