2014-04-07 63 views
3

我想知道是否有可能以比較一個int "1"和一個字符串"!0",使結果真實。的Javascript評估字符串作爲一個比較操作

例如:

//Comparing 0 and "0" works... 
var myVariable = 0; 
var checkVariable = "0"; 
if(myVariable == checkVariable) 
{ 
    console.log('Works'); 
} 

//Comparing 1 and "!0" doesn't work: 
var myVariable = 1; 
var checkVariable = "!0"; 
if(myVariable == checkVariable) 
{ 
    //I would LIKE this to be true! 
    console.log('This part doesn't work'); 
} 

如何做到這一點任何想法?

我願意接受建議,並"!=0"也將被罰款以及。

////////////////////////////////////////////// //// 更新:

所以我想現在的eval,和這裏的結果:

var myVariable = 20; 
var checkVariable = "20"; 
eval(myVariable,checkVariable); 
    //Returns "20", which is ok I guess, but it would be nice if it returned "true" 

var myVariable = 21; 
var checkVariable = "!20"; 
eval(myVariable,checkVariable); 
    //Returns "21", which is ok, but it would be nice if it returned "true" 

var myVariable = 21; 
var checkVariable = "20"; 
eval(myVariable,checkVariable); 
    //Returns "20", which is *wrong* 

在Chrome的JavaScript控制檯也試過這個(@Ishita):

var myVariable = 21; 
var checkVariable = "!20"; 
myVariable == eval(checkVariable); 
    //Returns "false", which should be "true" :/ 
+3

您必須使用您自己的解析器/解釋器或使用'eval()'來評估隱藏在字符串中的表達式。沒有辦法讓語言隱含。 – Pointy

+0

http://en.wikipedia.org/wiki/Code_smell有一個更好的方法來處理這個問題 –

+0

@CoryDanielson :(K我會想另一種方式。謝謝你們:) – Kayvar

回答

2

不要使用eval它被廣泛認爲是使用Javascript的最嚴重的部位之一,是不解析字符串轉換成整數在這種情況下完全需要。 (見這個答案的底部上的詳細信息)

像這樣的事情將是一個合適的解決方案:

的jsfiddle:http://jsfiddle.net/CoryDanielson/zQjyz/

首先,設置地圖的checkVariables和功能實現了預期的比較。所有這些功能都是接受一個數字並根據比較結果返回true/false。

var checkFunctions = { 
    "0": function(num) { return parseFloat(num) === 0 }, 
    "!0": function(num) { return parseFloat(num) !== 0; } 
}; 

下一步,修改你的if語句獲取基礎上,checkVariable適當checkFunction並通過myVariable進入該功能。

//Comparing 0 and "0" works... 
var myVariable = 0; 
var checkVariable = "0"; 

if (checkFunctions[checkVariable](myVariable)) 
{ 
    console.log(myVariable + " equals zero"); 
} 

//Comparing 1 and "!0" doesn't work: 
var myVariable = 1; 
var checkVariable = "!0"; 

if (checkFunctions[checkVariable](myVariable)) 
{ 
    console.log(myVariable + " does not equal zero."); 
} 

Don't use eval needlessly!

的eval()是一個危險的功能,該單元執行它的傳遞 與呼叫者的特權的代碼。如果您運行的eval()用字符串 ,可能導致惡意攻擊者會受到影響,你可能最終運行的用戶的機器上 惡意代碼與 網頁/擴展的權限。更重要的是,第三方的代碼可以看到 範圍中的eval()被調用,這可能會導致的方式,其中類似的功能不易受可能的攻擊 。因爲它必須調用JS解釋器,而許多其他構造被現代JS引擎優化爲 ,因此eval()通常比替代方法更慢。

對於常見的 用例,有eval()的安全(和快速!)替代方法。

+0

太棒了!謝謝你這麼好的回答!^ _^ – Kayvar

+1

I更新checkFunctions都使用parseFloat,因爲'parseInt(0.99)=== 0'會返回true。'parseInt(0.99)'只是拋出小數(不做任何舍入)並返回'0' –

2

你可以使用「eval」函數來完成你想要的。

+0

太棒了!剛剛嘗試eval(myVariable,checkVariable),它的工作。這很簡單,謝謝!編輯:等等,沒有問題,現在更新我的帖子。 – Kayvar

+1

只要小心 - [eval()是邪惡的](http://blogs.msdn.com/b/ericlippert/archive/2003/11/01/53329.aspx) – Bucket

1

這工作:

var a = 1; 
var b = "!0"; 
if(a == eval(b)) 
{ 
    console.log(true); 
} else { 
console.log(false); 
} 
+0

謝謝!我試過這個,但「a == eval(b)」評價爲錯誤:( – Kayvar

+0

這裏是你的現場演示,它似乎適用於我,我很好奇爲什麼它不能爲你工作http: //jsfiddle.net/77Xns/ – Ishita

+0

哦!是的,它很奇怪!我在Chrome的javascript控制檯中試了一下,我會在我的實際代碼中試試它,看它是否有效 – Kayvar

1

使用parseInt函數

if(parseInt("1")!=parseInt("0")) 
{ 
console.log('Try this'); 
} 
+0

謝謝!我想能夠在第二個變量中有「!=」,但:/ – Kayvar