我对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
我很好奇是从两个方面导致这种差异的原因。
抱歉,我忘记了作业导致的异常结果。
答案 0 :(得分:1)
我怀疑
temp = temp - 0 // temp is number , 111
产生你在那里提到的结果。见http://jsbin.com/faquvobo/1/edit?js,output
您有观察错误(可能您实际使用过temp = 0 + temp;
)。
一般解释:
+
运算符已超载且-
运算符不足。
如果使用+
运算符且一个操作数是字符串,则操作数将转换为字符串并执行字符串连接(而不是添加)。
-
运算符仅为数字定义,因此两个操作数首先转换为数字,然后执行减法。
答案 1 :(得分:0)
在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
答案 2 :(得分:0)
来自ECMAScript Language Specification。对于Addition operator:
7.如果Type(lprim)是String或Type(rprim)是String,则返回 字符串,它是连接ToString(lprim)后跟的结果 ToString(rprim)
8.将添加操作的结果返回到ToNumber(lprim)和ToNumber(rprim)。
这意味着+
运算符将首先尝试String,如果其中一个是String。否则,它将通过将数字转换为数字来应用数字。
5.Let lnum是ToNumber(lval)。
6.Letum是ToNumber(rval)。
7.将减法运算的结果返回到lnum和rnum
这意味着-
运算符将始终转换为数字并应用数字减法运算。