当前位置: 首页 > 知识库问答 >
问题:

parseInt与一元加号,何时使用哪个?

桂浩言
2023-03-14

这一行有什么不同:

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

这条线呢

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

这个jperf测试显示,一元操作符在当前chrome版本中要快得多,假设它是node.js!?

如果我尝试转换非数字的字符串,两者都返回NaN

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

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

编辑:和双波浪操作符~~有什么区别?

共有3个答案

司允晨
2023-03-14

我相信thg435答案中的表格是全面的,但我们可以总结为以下模式:

  • 一元加号并没有把所有错误的值都同等对待,但它们都是错误的。
  • Unary plus发送true到1,但是trueNaN
  • 另一方面,parseInt对于不是纯数字的字符串更加自由。parseInt('123abc') === 123,而报告NaN
  • Number将接受有效的十进制数,而parseInt仅仅删除超过十进制的所有内容。因此,parseInt模仿了C行为,但对于评估用户输入可能并不理想。
  • 都用字符串修饰空格。
  • parseInt是一个设计糟糕的解析器,接受八进制和十六进制输入。一元加号只取十六进制。

假值转换为数字,遵循在C中有意义的方式:nullfalse都是零。"变为0并不完全遵循这个约定,但对我来说足够有意义。

因此,我认为,如果您正在验证用户输入,一元加号除了接受小数外,在所有方面都有正确的行为(但在我的现实生活中,我更感兴趣的是捕获电子邮件输入,而不是userId,值完全省略,等等),而parseInt太自由了。

闽鸿宝
2023-03-14

好吧,以下是我所知道的一些区别:

>

  +'' === 0;              //true
  isNaN(parseInt('',10)); //true

一进制更像parseFloat,因为它也接受小数。

另一方面,parseInt在看到非数字字符时停止解析,比如表示小数点的句点

  +'2.3' === 2.3;           //true
  parseInt('2.3',10) === 2; //true

parseIntparseFloat从左到右解析并构建字符串。如果他们看到一个无效字符,它将返回被解析为数字的内容(如果有),如果没有被解析为数字,则返回NaN

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

  parseInt('2a',10) === 2; //true
  parseFloat('2a') === 2;  //true
  isNaN(+'2a');            //true

如@Alex K的注释所示,parseIntparseFloat将按字符进行解析。这意味着十六进制和指数符号将失败,因为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.

杨腾
2023-03-14
EXPRS = [
    'parseInt(x)',
    'parseFloat(x)',
    'Number(x)',
    '+x',
    '~~x',
    'x>>>0',
    'isNaN(x)'

];

VALUES = [
    '"123"',
    '"+123"',
    '"-123"',
    '"123.45"',
    '"-123.45"',
    '"12e5"',
    '"12e-5"',
    
    '"0123"',
    '"0000123"',
    '"0b111"',
    '"0o10"',
    '"0xBABE"',
    
    '"4294967295"',
    '"123456789012345678"',
    '"12e999"',

    '""',
    '"123foo"',
    '"123.45foo"',
    '"  123   "',
    '"foo"',
    '"12e"',
    '"0b567"',
    '"0o999"',
    '"0xFUZZ"',

    '"+0"',
    '"-0"',
    '"Infinity"',
    '"+Infinity"',
    '"-Infinity"',

    'null',
    'undefined',
    'true',
    'false',
    'Infinity',
    'NaN',

    '{}',
    '{valueOf: function(){return 42}}',
    '{toString: function(){return "56"}}',

];

//////

function wrap(tag, s) {
    if (s && s.join)
        s = s.join('');
    return '<' + tag + '>' + String(s) + '</' + tag + '>';
}

function table(head, rows) {
    return wrap('table', [
        wrap('thead', tr(head)),
        wrap('tbody', rows.map(tr))
    ]);
}

function tr(row) {
    return wrap('tr', row.map(function (s) {
        return wrap('td', s)
    }));
}

function val(n) {
    return n === true || Number.isNaN(n) ? wrap('b', n) : String(n);
}

var rows = VALUES.map(function (v) {
    var x = eval('(' + v + ')');
    return [v].concat(EXPRS.map(function (e) {
        return val(eval(e))
    }));
});

document.body.innerHTML = table(["x"].concat(EXPRS), rows);
css prettyprint-override">table { border-collapse: collapse }
tr:nth-child(odd) { background: #fafafa }
td { border: 1px solid #e0e0e0; padding: 5px; font: 12px monospace }
td:not(:first-child) { text-align: right }
thead td { background: #3663AE; color: white }
b { color: red }
 类似资料:
  • 问题内容: 这行之间有什么区别: 这条线 此jsperf测试表明,假设适用于node.js!,在当前的chrome版本中,一元运算符要快得多。 如果我尝试转换不是数字的字符串,都将返回: 所以我什么时候应该更喜欢使用一元加号(尤其是在node.js中)??? 编辑 :和双波浪号运算符有什么区别? 问题答案: 好吧,这是我知道的一些区别: 空字符串的计算结果为a ,而其计算结果为。IMO,空白字符串

  • 问题内容: 这行之间有什么区别: 这条线 此jsperf测试表明,假设适用于node.js !,在当前的chrome版本中,一元运算符要快得多。 如果我尝试转换不是数字的字符串,则都返回: 所以我什么时候应该更喜欢使用一元加号(尤其是在node.js中)??? 编辑 :和双波浪号运算符有什么区别? 问题答案: 好吧,这是我知道的一些区别: 空字符串的计算结果为a ,而其计算结果为。IMO,空白字符

  • 我在Spring Jpa数据文档中读到过两种不同类型的对象,当您用存储库对动态查询进行“分页”时。 有人有这种类型的知识、文章或一些好的信息来源吗?

  • 问题内容: 在Python中,何时应使用列表以及何时使用元组? 有时您别无选择,例如,如果您有 那么x必须是一个元组。 但是,如果我是设计API并选择数据类型的人,那么指导原则是什么? 问题答案: 元组有一种强大的文化,即用于异构集合(类似于您在C中使用s的元组)和列表用于同类集合(类似于用于数组的形式)。但是我从来没有与其他答案中提到的可变性问题完全吻合。可变性有它的作用(实际上您不能更改一个元

  • 我开玩笑地增加,减少物品数量。我想算数。文本加上“T”字符。当我试图编写这样的代码时。错误代码:java.lang.NumberFormatException:对于输入字符串:“1T”如何解决此问题?有人能帮忙吗??

  • 我想了解更多这句话发现Grails留档: 如果测试涉及证明测试对象以特定方式与合作者交互,则使用模拟。如果协作者以某种方式的行为暴露了测试主题中的特定行为,那么该行为的结果就是您正在测试的,请使用存根