2015-04-17 49 views
0

我试图获得使用eval()评估的字符串的类型,但没有成功。无法获得使用eval()评估的字符串的typeof

该变量是存储在一个数组中的字符串,其中包含一个可能对象的名称,我想知道它是否被定义。

有人可以举手吗?

令人不安线if (typeof eval(x[i][0]) !== 'undefined')这是我的代码:

var infoslider = [ 
    ["revapi5", "el-masnou", "sant-andreu-de-llavaneres"], 
    ["revapi3", "sant-andreu-de-llavaneres", "cardedeu"], 
    ["revapi10", "cardedeu", "eudald-carbonell"], 
    ["revapi9", "arenys-de-mar", "canet-de-mar"] 
]; 
var x = infoslider; 
for (var i = 0; i < x.length; i++) { 
    if (typeof eval(x[i][0]) !== 'undefined') { 
     vesa(x[i][0], x[i][2]); 
    } 
} 

我得到“的ReferenceError:revapi5没有定义”

+2

是什么让你觉得你需要或想'eval'呢? –

+0

*“变量是存储在一个数组中的字符串,其中包含一个可能对象的名称,我想知道它是否被定义。”*不太紧随其后。你是说你可能会或者可能没有一个名为(例如)'revapi5'的变量? –

+0

[我已经回答了你实际询问过的问题](http://stackoverflow.com/a/29700479/157247),我想,但这看起来像是“X/Y问题”:你需要解决X,而你认为Y会帮助你做到这一点,但是你在Y方面遇到困难,并且问Y怎么做 - 但是如果我们知道X是什么,我们或许可以建议比Y更好的解决方案。:-) –

回答

0

The variable is a string stored in an array with the name of a possible object which I want to know if is defined.

如果你的意思,有可能会或可能不会是一个变量名称为revapi5宣称为并且它将具有除undefined以外的值,如果它被声明,并且您想知道它是否是,您可以可以移动typeof字符串你eval“荷兰国际集团:

if (eval("typeof " + x[i][0]) !== 'undefined') { 

,几乎可以肯定更好的方法来解决一切问题是,你想这样做来解决那。上述的

例子:

var revapi5 = {}; // We do have 5, but we don't have the others 
 
var infoslider = [ 
 
    ["revapi5", "el-masnou", "sant-andreu-de-llavaneres"], 
 
    ["revapi3", "sant-andreu-de-llavaneres", "cardedeu"], 
 
    ["revapi10", "cardedeu", "eudald-carbonell"], 
 
    ["revapi9", "arenys-de-mar", "canet-de-mar"] 
 
]; 
 
var x = infoslider; 
 
for (var i = 0; i < x.length; i++) { 
 
    if (eval("typeof " + x[i][0]) !== 'undefined') { 
 
    snippet.log(x[i][0] + " is declared and has a value other than undefined"); 
 
    } else { 
 
    snippet.log(x[i][0] + " is either undeclared, or has the value undefined"); 
 
    } 
 
}
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

+0

@Siguza:谢谢 - 意思是*移动*'typeof',而不是添加第二个,只是在添加一个实例时修复它。 –

+0

@ T.J Crowder它的工作原理! 这就是最终的代码: var infoslider = [“revapi5”,“el-masnou”,“sant-andreu-de-llavaneres”], [“revapi3”,“sant-andreu-de-llavaneres”, “cardedeu”], [“revapi10”,“cardedeu”,“eudald-carbonell”], [“revapi9”,“arenys-de-mar”,“canet-de-mar”] ] var x = infoslider; var z =“”; (eval(“typeof”+ x [i] [0])!=='undefined'){elval(x [i ] [0]),x [i] [2]); } } DanielM你的代码也工作,但我更喜欢避免全局性。 谢谢! –

2

不要使用eval,试试这个:

typeof window[ x[i][0] ] !== 'undefined' 

this answer

更新措施:

如果你的变量没有全局存储,你可以用window替换它们存储的任何对象(假设它在范围内)......如果它是相同的对象,那么this应该可以工作。

另外@ vol7ron提出了使用.hasOwnPropery而不是检查未定义的更好的建议。

+0

这只有在这些变量是全局变量时才有效。当然,Globals当然是最好的避免,所以... –

+1

如果你打算使用全局变量,你可能只是做'if(window.hasOwnProperty(x [i] [0])){... }' – vol7ron

+1

这更偏向于可读性。 'hasOwnProperty'建议寻找存在。但是,重要的是要注意'typeof'会更有效率;所以如果每微秒的性能问题,或者如果这将被放在一个循环,这可能很重要。我还没有看到需要这种优化级别,因为需要编写一个超级资源密集型应用程序,以便能够在早期版本的智能手机上运行。因此,可维护性更好。 – vol7ron