【问题标题】:Is it safe to use strings in arithmetic expressions?在算术表达式中使用字符串是否安全?
【发布时间】:2021-05-17 20:17:01
【问题描述】:

我的字符串中有几秒钟,例如:'5'

从中我需要获取毫秒数,它必须是Number 类型,例如:5000

我知道您可以通过在字符串前面加上 + 来轻松地将字符串转换为数字

const result = +'5';

console.log(result, typeof(result));

不过,我发现这甚至没有必要,因为当您尝试在字符串和数字之间使用算术时,JavaScript 会自动为您进行转换。

const result = '5' * 3;

console.log(result, typeof(result));

console.log('5.3' * 3);

在文档中,我只找到了有关 Number() 构造函数的信息。

我的问题是:对字符串使用算术是否安全(加法除外)?我可以依赖上面显示的行为吗?

【问题讨论】:

  • 是的,+ 以外的任何东西都会自动将操作数转换为数字。话虽如此,以防万一,最好明确一点。从现在起六个月后阅读代码时会有所帮助。也许您想将 a * 2 + b * 3 更改为 a + b * 3 但您忘记了 a 是一个字符串。

标签: javascript string math numbers


【解决方案1】:

是的,它是安全的。所有算术运算except a binary + 都会将操作数转换为数字。这包括按位运算符以及unary plus

话虽如此,不要广泛地依赖它可能是个好主意。想象一下你有这样的代码:

function calculate(a, b) {
  return a * 2 + b * 3;
}

//elsewhere in the code
console.log(calculate("5", "2"));

这很好用,因为ab 都是相乘的,所以将被转换为数字。但是六个月后你回到项目并意识到你想修改计算,所以你改变了函数:

function calculate(a, b) {
  return a + b * 3;
}

//elsewhere in the code
console.log(calculate("5", "2"));

...结果突然错了。

因此,如果要进行算术运算,最好将值显式转换为数字。节省了偶发的意外bug,更易维护。

【讨论】:

    【解决方案2】:

    是的,但你必须小心......

    console.log('5.3' * 3);
    
    console.log('5.3' + 3);

    这两个非常相似的函数以不同的方式转换值:

    • * 只能应用在两个数字之间,所以 '5.3' 变为 5.3
    • + 也可以连接字符串,字符串在first,所以3变成'3'

    如果您了解所有这些,您可以这样做,但我建议您不要这样做。很容易错过,而且 JS 有很多奇怪的意外转换。

    【讨论】:

      猜你喜欢
      • 2021-08-26
      • 2015-05-30
      • 2011-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-24
      • 2013-11-28
      相关资源
      最近更新 更多