代码之家  ›  专栏  ›  技术社区  ›  Cdhippen

如何在eval语句中插入括号以对JavaScript中的操作进行排序?

  •  0
  • Cdhippen  · 技术社区  · 6 年前

    这是代码沙盒: https://codesandbox.io/s/rw0j2orqmp

    文件是reducers.js

    我正在构建一个React/Redux计算器应用程序,目前我正在使输出显示当前状态下的计算结果它不带括号,但一次计算整个公式而不是一个片段。为了解决这个问题,我想把每一块都用圆括号括起来,让它单独计算,去掉方法,然后在第一部分完成计算后再将它粘上:

    value:
              methods.indexOf(state.lastValue) < 0
                ? eval("(" + state.calc.slice(0, -1) + ")" + state.calc.slice(-1) + state.value)
                : state.value,
    

    但当我有了它,我得到了“意外的令牌”。

    有没有一种更简单的方法来完成我正在尝试的工作,或者在这种情况下有没有eval()的函数替代品?

    1 回复  |  直到 6 年前
        1
  •  1
  •   MinimumViablePerson    6 年前

    我不知道你为什么用eval或括号这对你不起作用有什么原因吗?以下内容:

    methods.indexOf(state.lastValue) < 0
      ? state.calc.slice(0, -1) + state.calc.slice(-1) + state.value
      : state.value
    

    如果你需要把东西组合在一起,只需使用不带eval的括号。

    methods.indexOf(state.lastValue) < 0
      ? ((state.calc.slice(0, -1)) + state.calc.slice(-1) + state.value)
      : state.value
    

    更新 :我明白你在说什么,对不起,从你最初的解释很难理解,我在手机上,无法真正检查你的沙盒。

    我认为最好保留一个字符串,以便稍后进行简单的评估,例如,如果 "7 + 3" 存储并按 * ,将原始字符串括在圆括号中并添加 * ,导致 "(7 + 3) *" ,等等。然后每当您想显示结果时,您只需计算单个存储的计算。

    如果你坚持那样做评估,我就告诉你它是有效的例如,在控制台中尝试此操作:

    eval("(" + "7 + 3" + ")" + "* 2")
    // 20
    

    因此,您可能对从切片返回的值做了一些错误的操作,这会导致eval错误。 尝试控制台记录整个表达式以查看实际情况。