由于XOR位^运算符,Java中的JavaScript表达式的返回值类型不正确

Return value type is not correct for JavaScript expression in Java due to XOR bitwise ^ operator

本文关键字:表达式 JavaScript 返回值 不正确 类型 中的 Java XOR 运算符 由于      更新时间:2023-09-26

我正在尝试评估这个表达式:

ScriptEngineManager sem = new ScriptEngineManager () 
ScriptEngine scriptEngine = sem.getEngineByName("js") ;
String expr = "true ^ true";
Boolean obj = (Boolean) scriptEngine.eval(expr);

但是返回的结果是java Double。我已经尝试了字符串expr的各种选项,如:

String expr = "0x1 ^ 0x0";String expr = "1 ^ 0";

基本上,我希望能够使用JavaScript引擎来评估各种表达式,可能看起来像这样:

"ture && false || false (true || false && true || false XOR true)"

所有其他操作符,如&&或||工作很好,当我评估这样的表达式并返回布尔值,但当它来XOR(它有JavaScript等效的位运算符)它返回Double。我并不想将表达式转换为替换XOR的逻辑运算符(例如(true || false) &&!(真,,false))),因为这样我就必须解析整个表达式字符串以将异或转换为上面的逻辑表达式。我对这个表达式求值的全部意义是,这样我就可以在不解析其复杂性的情况下求值。

任何帮助将非常感激!提前感谢!

引用自此处:http://www.howtocreate.co.uk/xor.html

"不幸的是,JavaScript没有逻辑异或操作符。它有一个按位异或操作符^,可以对两个数字进行按位比较,但是当您想要获得两个表达式的异或结果时,这没有帮助,因为它们不返回数字。

异或运算符可以用以下方式模拟:

if( ( foo && !bar ) || ( !foo && bar ) ) {
  ...
}

或者少做一次操作(取决于foo和bar的值):

if( ( foo || bar ) && !( foo && bar ) ) {
  ...
}

或者使用三元运算符使其更小:

if( foo ? !bar : bar ) {
  ...
}

可以在JavaScript代码中使用双否定强制转换为布尔值:

Boolean obj = (Boolean) scriptEngine.eval("!!(" + expr + ")");

不使用异或,更自然的是写!=,例如true != false。如果这在Javascript中不起作用,我会感到惊讶。

我在没有任何明确的替代方案的情况下实现此解决方案:

    boolean useDouble = false;
    String expr = "true ^ false";
    if(expr.contains("^"))
    {
        useDouble = true;
    }
            ...
            if(useDouble)
         {
             Double d = (Double) scriptEngine.eval(expr); 
             boolean r = (d != 0.0);
             System.out.println(" result: " + r);
         }
         else
         {
             Boolean b = (Boolean)scriptEngine.equals(expr);
             System.out.println(b.getClass().getName() + "result:" + b);
         }