一尘不染

parseInt vs一元加-何时使用

javascript

这行之间有什么区别:

var a = parseInt("1", 10); // a === 1

这条线

var a = +"1"; // a === 1

此jsperf测试表明,假设适用于node.js!,在当前的chrome版本中,一元运算符要快得多。

如果我尝试转换不是数字的字符串,都将返回NaN

var b = parseInt("test" 10); // b === NaN
var b = +"test"; // b === NaN

所以我什么时候应该更喜欢使用parseInt一元加号(尤其是在node.js中)???

编辑 :和双波浪号运算符有~~什么区别?


阅读 272

收藏
2020-04-25

共1个答案

一尘不染


好吧,这是我知道的一些区别:

  • 空字符串的""计算结果为a 0,而其parseInt计算结果为NaN。IMO,空白字符串应为NaN

    +'' === 0;              //true
    

    isNaN(parseInt(‘’,10)); //true

  • 一元的+行为更像是parseFloat因为它也接受小数。

parseInt另一方面,当看到非数字字符(例如要用作小数点的句点)时,它将停止解析.

    +'2.3' === 2.3;           //true
parseInt('2.3',10) === 2; //true
  • parseInt从左到右parseFloat解析并构建字符串。如果他们看到一个无效字符,它将返回已解析的内容(如果有)为数字,如果没有解析为数字,则返回。 __NaN

+另一方面,NaN如果整个字符串不可转换为数字,则一元将返回。

    parseInt('2a',10) === 2; //true
parseFloat('2a') === 2;  //true
isNan(+'2a');            //true
  • 如@Alex K.的评论所示,parseInt并将parseFloat按字符进行解析。这意味着十六进制和指数符号将失败,因为xe将被视为非数字组件(至少在base10上)。

一元+将正确地转换它们。

    parseInt('2e3',10) === 2;  //true. This is supposed to be 2000
+'2e3' === 2000;           //true. This one's correct.

parseInt("0xf", 10) === 0; //true. This is supposed to be 15
+'0xf' === 15;             //true. This one's correct.
2020-04-25