字符串到数字混淆

String To Number Confusion

为什么 parseInt("-1000-500-75-33") return -1000?

不应该 return 这些数字的总和:-1608

如何将字符串 "-1000-500-75-33" 到 return 作为这些数字的总和?

parseInt 将尝试从字符串的开头获取一个数字。

由于 - 是数字开头的有效字符,它会解析字符串,直到找到无效字符。第二个 - 无效,因为没有整数可以在其中包含 -,只能包含数字。所以它停在那里并认为数字是 "finished".


现在,如果你想处理表达式,你可以像这样使用eval

eval("-1000-500-75-33")

这将 return -1608 正如预期的那样。

因为它们在一个字符串中,ParseInt 不会解析整个字符串,只是从头开始找到第一个适用的数字 & returns 它。如果无法解析字符串的开头,则 returns NaN

parseInt("-1000NOT_NUMBER") = -1000
parseInt("test-1000`) = NaN

你必须使用 eval 函数来做你想做的事,它会评估给定的字符串,就好像它是输入到控制台的命令一样;

eval("-1000-500-75-33") = -1608

尝试eval! it's safe here

eval("-1000-500-75-33").toString()

console.log(eval("-1000-500-75-33").toString());

关于类型转换:解析-1000后,显然是"negative 1000",它会在检测到数字和字符串之间的公共符号时立即逃避转换。所以 parseInt"-1000-500-75-33" 视为 "-1000NotConvertableString",因此将剩余的部分留在一边,返回 -1000 作为类型转换的结果。

parseInt 不会执行任何计算,而是会尝试将字符串转换为整数。它 returns -1000 因为后面的破折号不会被视为有效数字。如果你想对所有这些数字求和,你可以在破折号上拆分,映射到数字,然后减少:

var numString = "-1000-500-75-33";
numString.split('-').map(e => Number(e)).reduce((a, b) => a - b);