【问题标题】:How can I improve this Javascript calculation tool?如何改进这个 Javascript 计算工具?
【发布时间】:2021-01-06 17:08:58
【问题描述】:

我正在制作一个计算工具。我对javascript不是很熟悉,所以我的代码看起来有点不对劲。应该进行哪些编辑才能使此工具正常工作?我想要像下面的等式一样计算输入数字:

calculate = function()
{
  var x = document.getElementById('a').value;
  var y = document.getElementById('b').value;
  var z = document.getElementById('c').value; 
  document.getElementById('result').value = x * 588 + y * 28 + z + 44032
}
<input type="number" id="a" oninput="calculate()"/> × 588 +
<input type="number" id="b" oninput="calculate()"/> × 28 +
<input type="number" id="c" oninput="calculate()"/> + 44032 =
<input type='text' id="result"/>

方程:(x × 588) + (y × 28) + z + 44032 = 结果

【问题讨论】:

  • 将等式中的括号添加到代码有帮助吗?
  • 代码看起来不错,但缺少分号。您希望每个输入的默认值是多少? 0 ?例如,对于 0,使用 var x = document.getElementById('a').value || 0;哟,您的输入值将是一个字符串,您需要将其转换为 int/float 才能在等式中安全地使用它。
  • @Loenix 分号没有“丢失”,请参见此处:stackoverflow.com/questions/2846283/…

标签: javascript


【解决方案1】:
  • 当您使用document.getElementById 获取&lt;input /&gt; 元素时,它会返回一个HTMLInputElement 类型的JavaScript object,它具有.value 属性(您正在使用)。
  • 但是,HTMLInputElement.value 属性返回 string 值,而不是 number 值。
    • 您可能知道 valueAsNumber 属性,但这不适用于 &lt;input type="text" /&gt; - 仅适用于 &lt;input type="number" /&gt;(幸运的是,您的 HTML 是),但请始终检查 NaN
  • JavaScript 通常被描述为“松散类型”,但我更喜欢将其称为“wtfy 类型”,因为its rules for implicit type conversions are inconsistent
    • 在 JavaScript 和 PHP 等松散类型语言中的一个常见“功能”是 implicit conversion of string values to number values,但最好避免完全依赖该行为,并坚持始终使用 @987654339 将 string 值显式转换为 number 值@、parseFloat(string)Number(any)

这样做:

var calculate = function()
{
    const x = parseFloat( document.getElementById('a').value );
    const y = parseFloat( document.getElementById('b').value );
    const z = parseFloat( document.getElementById('c').value );
    const o = document.getElementById('result');

    if( isNaN(x) || isNaN(y) || isNaN(z) ) {
        o.value = "Invalid input.";
    }
    else {
        const result = x * 588 + y * 28 + z + 44032;
        o.value = result.toString();
        // If `result` will be fractional then use `toFixed` instead of `toString`.
        // This is to avoid very long string representations of imprecise floating-point numbers due to how IEEE-754 works.
    }
}
input[type=number] {
    text-align: right;
    width: 5em;
}
input#result {
    text-align: right;
    width: 10em;
}
<input type="number" id="a" oninput="calculate()" /> × 588 +
<input type="number" id="b" oninput="calculate()" /> × 28 +
<input type="number" id="c" oninput="calculate()" /> + 44032 =
<input type='text' id="result" readonly />

【讨论】:

    【解决方案2】:

    Javascript 类型在和你玩游戏 :),它实际上是在执行连接。 当您读取值时,您必须将其转换为实际类型,即数字。 这是工作代码

    <input type="number" id="a" oninput="calculate()"/> × 588 +
    <input type="number" id="b" oninput="calculate()"/> × 28 +
    <input type="number" id="c" oninput="calculate()"/> + 44032 =
    <input type='text' id="result"/>
    <script>
    calculate = function()
    {
      var x = Number(document.getElementById('a').value);
      var y = Number(document.getElementById('b').value);
      var z = Number(document.getElementById('c').value); 
    
      document.getElementById('result').value = (x * 588) + (y * 28) + z + 44032
    }
    </script>
    

    还有其他方法可以实现相同的目标,例如 ParseIntParseFloat。 如果您希望字符串在其中包含其他字符时以 NaN 失败,Number() 实际上可能是更好的选择。

    因为

    Number('1234'); // returns 1234
    Number('12.34'); // returns 12.34
    Number('3.4040blahblahblac'); // returns NaN
    Number('49cm'); // returns NaN
    

    【讨论】:

    • parseIntparseFloat 在失败时也会返回 NaN - 除非它们有不同的失败规则(Number 解析整个输入字符串,而 parseFloat/parseInt 允许以有效数字文本开头的字符串:thisthat.dev/number-constructor-vs-parse-int
    • 是的,你是对的,我的意思是在我不知道它到底是什么类型的情况下
    猜你喜欢
    • 1970-01-01
    • 2021-03-21
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    • 2014-07-03
    • 1970-01-01
    • 2011-01-27
    • 2016-01-07
    相关资源
    最近更新 更多