2014-02-24 128 views
3

我想在JavaScript中創建一個動態驗證的結構,「如果」,例如:在JavaScript中創建一個動態驗證的結構,「如果」

var var1=1; 
    var comparator="!=="; 
    var var2=1; 
    if(var1+comparator+var2){ 
     alert("Yes, its false"); 
    }else{ 
     alert("Yes, its true"); 
    } 

三個變量可以爲用戶所期望的改變。我發現句子總是被驗證爲「真」,因爲結構「if」驗證字符串存在。

我想要的是,用戶更改這三個變量中的任何一個,並且函數返回結果。顯然,比較操作是由限制了運營商的選項,其他功能來控制:「==」「===」,...

感謝和問候

+0

見我的回答如下 - 如何做到這一點適當的方式取決於'var1',很多'var2'和'comparator'來從。編輯你的問題來解釋你的應用程序,這樣我們可以給你更好的建議。 –

回答

1

最簡單的方式做到這一點:

eval(var1+comparator+var2) 

這不過是個好主意取決於正是你在做什麼。 var1var1comparator從何而來?如果用戶自己輸入,這不是問題。即使他們從服務器加載它不是一個大問題。

但是,如果這是什麼,用戶可以提交到服務器,然後把它顯示在另一個用戶的瀏覽器,這是一個巨大壞主意,因爲他們可以提交任意JavaScript和有它在其他用戶的瀏覽器執行。這被稱爲跨站點腳本(XSS)注入。

+0

Eval不能使用字符串!證明 - > http://jsfiddle.net/MarkkNijboer/PDw97/ 事情是,字符串走出報價。所以它將數字作爲字符串處理,因爲它變成了一個整數。一個字符串不能保留一個字符串,就像你提供答案的方式。 –

+0

@MarkNijboer是的,但那不是一個真正的字符串,它實際上是對名爲「test」的全局變量的引用。如果OP想要作爲一個字符串,他們當然必須引用它。 –

+0

嘗試用一個整數替換字符串,它的工作原理。即使只有一個數字的字符串也可以工作,但是一個帶有字母的字符串不會。 –

0

如果我沒有理解好什麼你願意的話,可以用「功能」或「EVAL」

var result = eval(var1+comparator+var2); 

var result = new Function("return " + var1+comparator+var2)(); 
1

你不能做到這一點 - JavaScript就只是把它們都作爲串並連接在一起;這將始終返回true。

您需要專門的語句,如ifswitch,然後使用真實的操作員進行比較。

例子:

var var1=1; 
var comparator="!=="; 
//var comparator = "=="; // presumes user input, commented out in this example 
var var2=1; 

switch (comparator) 
{ 
    case "!==": 
     alert(var1 !== var2); 
     break; 
    case "==": 
     alert(var1 == var2); 
     break; 
} 
+0

雖然你的可能更實用:) – sabof

2

也許沿着這些線?

var comparator = '==='; 

var comparators = { 
    '===': function(a, b) { 
    return a === b; 
    } 
}; 

if (comparators[comparator](var1, var2)) { 
    alert("Yes, its false"); 
}else{ 
    alert("Yes, its true"); 
} 
+0

非常好的方法。 –

+0

沒有必要調用'比較器[比較器](var1,var2)'應該可以正常工作 –

+0

我已經在解析器中修復了它。 – sabof

0

只是我的一個做法:LIVE DEMO

function compare(a, op, b){ 

    var operators = { 
    ">" : a>b ? "Great!" : "Wrong", 
    "<" : a<b ? "Great!" : "Wrong", 
    "!=": a!=b ? "Great. Not equal!" : "Wrong" 
    }; 
    return operators[op]; 

} 

compare(10, ">", 20) // Wrong 
+0

你在這裏使用'_'作爲變量的任何原因?通常我會參考下劃線庫或(對於具有功能語言背景的人)參考您在函數體中未使用的參數。 –

+0

@GeorgeMauer我在'a''符號''b'的方法中使用了'_'。並且有機會製作一個漂亮的盒子[_]'不是錯過的機會 –