JavaScript - передать логический (или побитовый) оператор в качестве аргумента? - PullRequest
0 голосов
/ 29 апреля 2019

В C # существуют различные способы сделать это C # Передать побитовый оператор в качестве параметра , в частности, объект "Bitwise.Operator.OR", но можно ли что-то подобное сделать в JavaScript? Например:

function check(num1, num2, op) {
    return num1 op num2; //just an example of what the output should be like
}

check(1,2, >); //obviously this is a syntax error, but is there some kind of other object or bitwise operator of some kind I can plug into the place of ">" and change the source function somehow?

Ответы [ 4 ]

4 голосов
/ 29 апреля 2019

Вы можете создать объект с ключами в качестве операторов и значениями в качестве функций. Для доступа к функциям вам потребуется обозначение в скобках.

Вы можете использовать параметры отдыха и some() и every() для более чем двух параметров для &&, ||.

Для побитового оператора или +,-,*,/ нескольких значений вы можете использовать reduce()

const check = {
  '>':(n1,n2) => n1 > n2,
  '<':(n1,n2) => n1 < n2,
  '&&':(...n) => n.every(Boolean),
  '||':(...n) => n.some(Boolean),
  '&':(...n) => n.slice(1).reduce((ac,a) => ac & a,n[0])
}

console.log(check['>'](4,6)) //false
console.log(check['<'](4,6)) /true
console.log(check['&&'](2 < 5, 8 < 10, 9 > 2)) //true

console.log(check['&'](5,6,7)  === (5 & 6 & 7))
1 голос
/ 29 апреля 2019

Как насчет чего-то вроде:

 function binaryOperation( obj1, obj2, operation ) {
     return operation( obj1, obj2 );
 }
 function greaterThan( obj1, obj2 ) {
    return obj1 > obj2 ;
 }
 function lessThan( obj1, obj2 ) {
    return obj1 < obj2 ;
 }
 alert( binaryOperation( 10, 20, greaterThan ) );
 alert( binaryOperation( 10, 20, lessThan ) );
0 голосов
/ 29 апреля 2019

Это невозможно. Но 1 способ сделать это - сделать следующее:

function evaluate(v1, v2, op) {
    let res = "" + v1 + op + v2;
    return eval(res)
}
console.log(evaluate(1, 2, "+"));
# outputs 3

Но будьте осторожны при передаче args, поскольку они будут оцениваться, что опасно, если в функцию передан какой-то хакерский код.

0 голосов
/ 29 апреля 2019

Вы можете сделать то же самое, что предлагается по связанным ответам:

function check(num1, num2, op) {
  return op(num1, num2);
}

// Use it like this
check(3, 7, (x, y) => x > y);

Вы также можете создать объект, который обеспечивает все эти операции:

const Operators = {
  LOGICAL: {
    AND: (x, y) => x && y,
    OR: (x, y) => x || y,
    GT: (x, y) => x > y,
    // ... etc. ...
  },
  BITWISE: {
    AND: (x, y) => x & y,
    OR: (x, y) => x | y,
    XOR: (x, y) => x ^ y,
    // ... etc. ...
  }
};

// Use it like this
check(3, 5, Operators.BITWISE.AND);
...