簡體   English   中英

JavaScript —將布爾(或按位)運算符作為參數傳遞嗎?

[英]JavaScript — pass a boolean (or bitwise) operator as an argument?

在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?

您可以使用鍵作為運算符,將值作為函數來創建對象。 您將需要使用括號符號來訪問功能。

您可以將Rest參數以及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 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 ) );

您可以執行鏈接的答案所建議的完全相同的操作:

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要小心,因為將對它們進行評估,如果將一些hacky代碼傳遞給該函數,則很危險。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM