【问题标题】:Preventing concatenation防止串联
【发布时间】:2011-10-16 14:06:43
【问题描述】:

我已经断断续续地编写 JavaScript 13 年了,但在过去的几个月里,我重新发现了它作为编写程序的一种方式,任何访问网页的人都可以使用它而无需安装任何东西。请参阅example

我最近发现的最重要的一点是,由于 JavaScript 在设计上是松散类型的,所以当我希望它添加数字时,它会不断连接字符串。而且是不可预测的。一个例程运行了好几天,然后当我向其中输入不同的数据时,问题就出现了,我最终得到了一个难以置信的大数字。

有时我很幸运可以通过将( ) 放在一个学期左右来避免这种情况,有时我不得不在一个学期内求助于parseInt()parseFloat()。它让我想起了试图通过在一个(常数)项上加上 .00 来强制 C 中的浮点结果。我只是在尝试 += 时发生这种情况,我已经通过对所有内容执行 parseFloat() 来加载我已经加载的数组。

这只是另外发生的吗?如果我每次添加时至少在其中一个条款上使用parseInt()parseFloat(),这会阻止它吗?我在 Linux 下使用 Firefox 6 进行编写,但跨浏览器的可移植性也是一个问题。

【问题讨论】:

    标签: javascript


    【解决方案1】:

    您可以使用+ 运算符将字符串转换为数字。

    var x = '111'
    +x === 111
    

    【讨论】:

      【解决方案2】:

      The specification says about the addition operator:

      如果 Type(lprim) 是 String 或 Type(rprim) 是 String,那么
      返回作为连接 ToString(lprim) 后跟 ToString(rprim)

      的结果的字符串

      这意味着如果至少有一个运算符是一个字符串,就会发生字符串连接。

      如果我每次添加时至少在其中一个条款上使用parseInt()parseFloat(),这会阻止它吗?

      不,所有操作数都必须是数字。

      您可以使用unary plus operator 轻松地将任何数字字符串转换为数字(如果您已经在处理数字,它不会更改值):

      var c = +a + +b;
      

      【讨论】:

        【解决方案3】:

        我通常这样做:

        var x = 2;
        var t = "12";
        var q = t+x; // q == "122"
        var w = t*1+x; // *1 forces conversion to number w == 14
        

        如果 t 不是数字,那么您将得到 NaN

        如果您乘以 1 个变量,您将不知道它们是什么类型。它们将被转换为数字。我发现这种方法比 int 和 float 转换更好,因为 *1 适用于各种数字。

        您遇到的问题是从 DOM 获取值的函数通常返回字符串。即使它是一个数字,当你获取它时它也会被表示为一个字符串。

        【讨论】:

        • 使用(t*1||0) 进行多次添加,其中t 的无效值应被忽略:NaN || 0 = 0,14 || 0 = 14。
        【解决方案4】:

        请放心,它是非常可预测的,您只需要熟悉输入的运算符和数据类型即可。

        简而言之,计算是从左到右的,只要存在字符串,就会发生连接,无论操作的哪一边。

        例如:

        9 + 9 // 18
        9 + '9' // '99'
        '9' + 9 // '99'
        + '9' + 9 // 18 - unary plus
        - '9' + 9 // 0 - unary minus
        

        一些三元表达式:

        9 + '9' + 9 // '999'
        9 + 9 + '9' // '189'
        

        【讨论】:

        • 谢谢,我会记住左右的。我主要是在变量方面遇到问题,而不是常量,但听起来 (1 * A) + B 也可能有效。我喜欢逆向工程的便利。页面已保存以备后用。艾伦
        • @ab1jx,变量和常量之间没有太大区别。他们以相同的方式进行评估,并且适用所有相同的规则。提到的技巧有效,但是我觉得它们在实际代码中是不必要的。为了维护和清晰起见,应该有一个与计算部分分开的验证部分(看到1*A + B 看起来很奇怪)。我会将所有值转换为正确的类型,然后才使用它们。无论如何,祝你好运!
        猜你喜欢
        • 1970-01-01
        • 2017-03-24
        • 2011-06-10
        • 1970-01-01
        • 2022-01-16
        • 2021-08-02
        • 1970-01-01
        • 2021-09-10
        • 1970-01-01
        相关资源
        最近更新 更多