变量运算符可能吗?

Gar*_*ary 76 javascript variables operators dynamic-variables operator-keyword

有没有办法做类似于以下任何一种情况:

var1 = 10; var2 = 20;
var operator = "<";
console.log(var1 operator var2); // returns true
Run Code Online (Sandbox Code Playgroud)

- 要么 -

var1 = 10; var2 = 20;
var operator = "+";
total = var1 operator var2; // total === 30
Run Code Online (Sandbox Code Playgroud)

小智 153

没有开箱即用.但是,很容易用包括JS在内的多种语言手工构建.

var operators = {
    '+': function(a, b) { return a + b },
    '<': function(a, b) { return a < b },
     // ...
};

var op = '+';
alert(operators[op](10, 20));
Run Code Online (Sandbox Code Playgroud)

您可以使用基于ascii的名称plus,以避免在不需要时通过字符串.然而,有一半类似于这个问题的问题被问到,因为有人用字符串代表操作符并希望从中获取函数.


ulo*_*lou 8

有点新的方法。使用柯里化可以做得相当不错:

const calculate = a => str => b => {switch(str) {
  case '+': return a + b
  case '-': return a - b
  case '/': return a / b
  case '*': return a * b
  default: return 'Invalid operation'
}}

const res = calculate(15)('*')(28)

console.log('15 * 28 =', res)
Run Code Online (Sandbox Code Playgroud)


Man*_*arz 6

你可以使用这个eval()功能,但这不是一个好主意.我认为更好的方法是为您的运营商编写函数,如下所示:

var addition = function(first, second) {
   return first+second;
};

var subtraction = function(first, second) {
   return first-second;
};

var operator = addition;

alert(operator(12, 13));

var operator = subtraction;

alert(operator(12, 13));
Run Code Online (Sandbox Code Playgroud)


小智 6

我相信你想要一个变量运算符.这是一个,作为对象创建的.您可以通过更改以下内容来更改当前操作

[yourObjectName].operation = "<" //changes operation to less than


function VarOperator(op) { //you object containing your operator
    this.operation = op;

    this.evaluate = function evaluate(param1, param2) {
        switch(this.operation) {
            case "+":
                return param1 + param2;
            case "-":
                return param1 - param2;
            case "*":
                return param1 * param2;
            case "/":
                return param1 / param2;
            case "<":
                return param1 < param2;
            case ">":
                return param1 > param2;
        }
    }
}

//sample usage:
var vo = new VarOperator("+"); //initial operation: addition
vo.evaluate(21,5); // returns 26
vo.operation = "-" // new operation: subtraction
vo.evaluate(21,5); //returns 16
vo.operation = ">" //new operation: ">"
vo.evaluate(21,5); //returns true
Run Code Online (Sandbox Code Playgroud)


Man*_*anu 5

我们可以使用eval来实现此功能,因为我们将其用于操作员检查。

var number1 = 30;
var number2 = 40;
var operator = "===";

function evaluate(param1, param2, operator) {
     return eval(param1 + operator + param2);
}

if(evaluate(number1, number2, operator)) {
}
Run Code Online (Sandbox Code Playgroud)

这样,我们可以使用动态运算符评估。

  • 巨大的安全风险 - https://developer.mozilla.org/en-US/docs/web/javascript/reference/global_objects/eval#never_use_eval! (8认同)