【问题标题】:Unexpected result when using the subtraction operator with string values in Javascript [duplicate]在Javascript中使用带有字符串值的减法运算符时出现意外结果[重复]
【发布时间】:2018-02-04 19:05:56
【问题描述】:

当我使用奇数运算符时,为什么 Javascript 给出的输出为 0?

字符串的减法和加法有什么区别?

var x = 1;

console.log(x+'1')  // Outputs 11
console.log(x-'1')  // Outputs 0 -- but why?

那么我该如何进行数学计算呢?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    + 运算符在 javascript 中具有 三种含义之一。第一个是添加数字,第二个是连接字符串。当您执行1 + '1''1' + 1 时,运算符将首先将一个不是字符串的操作数转换为字符串,因为另一个操作数已被评估为字符串。另一方面,- 运算符只有一个目的,就是从左操作数中减去右操作数。这是一个数学运算,因此 JS 引擎将尝试将两个操作数转换为数字,如果它们是任何其他数据类型。

    我不确定为什么对字符串的类型转换似乎优先于对数字的类型转换,但显然确实如此。

    (在我看来,这很可能是一个纯粹的规范决定,而不是其他语言机制的结果。)

    如果您想确保 + 运算符充当加法运算符,您可以先将值显式转换为 number。尽管 javascript 在技术上不区分整数和浮点数,但存在两个函数可将其他数据类型转换为它们的 number 等效项:分别为 parseInt()parseFloat()

    const x = 10;
    const result = x + parseInt('1'); // 11
    
    const y = 5;
    const result2 = y + parseFloat('1.5'); // 6.5
    const result3 = y + parseInt('1.5');   // 6
    

    编辑

    正如 jcaron 在下面的评论中所说,+ 运算符具有unary + operator 形式的第三个含义。如果+ 只有一个正确的操作数,它会尝试将其值转换为一个几乎等同于parseFloat 的数字:

    + '1';     // returns 1
    + '1.5';   // returns 1.5
    
    // In the context of the previous example:
    const y = 5;
    const result2 = y + +'1.5'; // 6.5
    

    与 parseFloat 的不同之处在于 parseFloat 将创建源字符串的子字符串,直到该子字符串变为无效数字,而一元 + 将始终将整个字符串作为其输入:

    parseFloat('1.5no-longer-valid');   // 1.5
    + '1.5no-longer-valid';             // NaN
    

    【讨论】:

    • 其实+在Javascript中还有一个意思,作为一元运算符,用来强制转换为数字。所以你可以写x + +'1'
    • 你说得对,我会更新我的答案,谢谢!
    • 哇!!好想x + +'1'
    【解决方案2】:

    那是因为+ 是一个连接运算符。所以javascript认为它是一个连接运算符而不是一个数学运算符。但/,*,/等情况并非如此。

    【讨论】:

      【解决方案3】:

      这是因为+ 也用于连接字符串。然后,JS 总是会找到更好的方法来根据类型进行正确的类型转换。在这种情况下,x+'1' 操作将被标识为string type + string type。 否则,x-'1' 将变为 int type - int type

      如果您想使用特定类型,请尝试使用类型转换,链接here

      【讨论】:

        猜你喜欢
        • 2017-11-23
        • 1970-01-01
        • 2022-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-03
        • 2020-06-05
        • 1970-01-01
        相关资源
        最近更新 更多