JavaScript -- 将布尔(或按位)运算符作为参数传递?
JavaScript -- pass a boolean (or bitwise) operator as an argument?
在 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?
您可以创建一个以键作为运算符、以值作为函数的对象。您将需要括号表示法才能访问这些函数。
对于 &&
、||
.
的两个以上参数,您可以使用 Rest Parameters 和 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))
您可以执行链接答案所建议的完全相同的操作:
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);
这是不可能的。但是您可以通过执行以下操作来解决此问题:
function evaluate(v1, v2, op) {
let res = "" + v1 + op + v2;
return eval(res)
}
console.log(evaluate(1, 2, "+"));
# outputs 3
但是在传递 args
时要小心,因为它们将被评估,如果将一些骇人听闻的代码传递给函数,这是很危险的。
怎么样:
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 ) );
在 C# 中有多种方法可以做到这一点
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?
您可以创建一个以键作为运算符、以值作为函数的对象。您将需要括号表示法才能访问这些函数。
对于 &&
、||
.
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))
您可以执行链接答案所建议的完全相同的操作:
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);
这是不可能的。但是您可以通过执行以下操作来解决此问题:
function evaluate(v1, v2, op) {
let res = "" + v1 + op + v2;
return eval(res)
}
console.log(evaluate(1, 2, "+"));
# outputs 3
但是在传递 args
时要小心,因为它们将被评估,如果将一些骇人听闻的代码传递给函数,这是很危险的。
怎么样:
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 ) );