【问题标题】:JS type conversion between string and number字符串和数字之间的JS类型转换
【发布时间】:2014-10-01 13:29:24
【问题描述】:

我对 javascript 中的类型转换感到困惑。

var temp = "111"
temp = temp + 0 // temp is "1110" now 
temp = temp - 0 // temp is number , 111 

temp = "1110" - 0 // temp is number 1110

我很好奇导致这种差异的原因有两种。

对不起,我忘记分配导致结果异常。

【问题讨论】:

  • 这是因为javascript中的字符串连接是用加号完成的,当然不能从一个字符串中减去一个字符串,所以没有减号的等价物,所以当你想到关于它,这很有意义。
  • temp = temp - 0 // temp 是数字,111 不正确。你会得到 1110
  • 这个问题似乎是题外话,因为它似乎是基于观察错误。

标签: javascript string type-conversion


【解决方案1】:

我怀疑

temp = temp - 0 // temp is number , 111 

产生你在那里提到的结果。见http://jsbin.com/faquvobo/1/edit?js,output

你有一个观察错误(也许你实际上使用了temp = 0 + temp;)。


一般解释:

+ 运算符已重载,而 - 运算符未重载。

如果您使用+ 运算符并且一个操作数是字符串,则操作数将转换为字符串并执行字符串连接(而不是加法)。

- 运算符只为数字定义,因此两个操作数都先转换为数字,然后进行减法。

【讨论】:

  • 你说得对,其实是我忘记赋值导致结果异常,抱歉。
【解决方案2】:

在 javascript 中,如果任一操作数不是数字,+ 运算符执行类型转换为字符串,而 - 运算符始终转换为数字。

所以你的代码在类型转换后将如下所示:

var temp = "111";

//before cast and variable evaluation
var temp2 = temp + 0;
//after cast and variable evaluation
var temp2 = "111" + "0"; // evaluates to string "1110" => string concatenate
//temp2 is string "1110"
//before cast and variable evaluation
temp2 = temp2 - 0;
//after cast and variable evaluation
temp2 = 1110 - 0; //evaluates to number 1110 => number subtraction
//temp2 is number 1110

//before cast and variable evaluation
var temp3 = "1110" - 0;
//after cast and variable evaluation
var temp3 = 1110 - 0; // evaluates to number 1110 => number subtraction
//temp3 is number 1110

【讨论】:

    【解决方案3】:

    来自ECMAScript Language Specification。对于Addition operator

    7.如果 Type(lprim) 是 String 或 Type(rprim) 是 String,则返回 作为连接 ToString(lprim) 后跟的结果的字符串 ToString(rprim)

    8.返回对ToNumber(lprim)和ToNumber(rprim)进行加法运算的结果。

    这意味着+ 运算符将首先尝试字符串,如果其中一个是字符串。否则,它将通过将它们转换为数字来应用数字加法。

    对于Subtraction Operator

    5.设 lnum 为 ToNumber(lval)。

    6.设 rnum 为 ToNumber(rval)。

    7.返回对lnum和rnum进行减法运算的结果

    这意味着-运算符将始终转换为数字并应用数字减法运算。

    【讨论】:

      猜你喜欢
      • 2015-10-08
      • 2012-06-04
      • 2010-11-29
      • 1970-01-01
      • 2020-05-28
      • 2013-07-13
      • 1970-01-01
      • 2019-12-09
      • 2011-12-05
      相关资源
      最近更新 更多