2015-04-17 59 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