1.操作符
+ (正号)
- '+'的第一种用法:进行数据相加
'+'放在数据的前面,就是取正数
'+'与字符串运算时,就是字符串连接符
'+'可以将数字字符串或布尔类型等隐式转换成number类型
-(负号)
-
正、负号可以对数字进行取正或取负,其他运算符不能转换
-
正、负号可以将字符串数字隐式转换成数字
var num1 = '20'; var num2 = '-20'; console.log(-num1); //-20 console.log(+num1, typeof +num1); //20 number console.log(-num2); //20 console.log(+num2, typeof +num2); //-20 number
++(递增)
通常用于循环语句,动画操作等。
++放在前面,并进行赋值:先累加,后赋值
++放在后面,并进行赋值:先赋值,后累加
--(递减)
通常用于循环语句,动画操作等。使用方法与++类似。
2.JavaScript隐式转换
(隐式转换:自动转换。低级向高级转换,转换后的数据类型的表示范围要比转换前的大)
隐式转换中主要涉及到三种转换:
1、将值转为原始值,ToPrimitive()。
2、将值转为数字,ToNumber()。
3、将值转为字符串,ToString()。
2.1通过ToPrimitive将值转换为原始值
js引擎内部的抽象操作ToPrimitive有着这样的签名:
ToPrimitive(input, PreferredType?)
input是要转换的值,PreferredType是可选参数,仅可以是Number或String类型。 他只是一个转换标志,转化后的结果并不一定是这个参数值的类型,但是转换结果一定是一个原始值(或者报错)。
对于Date求原始值比较特殊,PreferredType是String,其他Object对象均为Number。
2.2基本类型的转换
加减乘除:
1.字符串加数字,数字就会转成字符串。数字加数字或字符串加字符串不需要转换。
在加法的过程中,首先把等号左右两边进行了求原值ToPrimitive()操作,然后如果两个或多个原始值只要有一个是String类型,就把两个或多个原始值都进行转化字符串toString()操作,进行字符串拼接;否则把两个或多个原始值都进行转化数字toNumber()操作,进行数字相加。
var a = 1 + 2 + '3';
console.log(a, typeof a); // '33' string
var b = 1 + 2 + 3;
console.log(b, typeof b); // 6 number
2.数字减字符串,字符串转成数字。如果字符串不是纯数字就会转成NaN。字符串减数字也一样。两个字符串相减也先转成数字。
// -
10 - '20' //-10
10 - 'one' //NaN
10 - '100a' //NaN
3.乘,除,大于,小于跟减的转换也是一样。
// *
10*'20' //200
'10'*'20' //200
// /
20/'10' //2
'20'/'10' //2
'20'/'one' //NaN
-
有关==的隐式转换
1.undefined等于null
2.字符串和数字比较时,字符串转数字
3.数字为布尔比较时,布尔转数字
4.字符串和布尔比较时,两者转数字
// ==
undefined == null; //true
'0' == 0; //true,字符串转数字再比较 0==0
0 == false; //true,布尔转数字比较 0==1
'0' == false; //true,两者转数字比较 0==0
2.3引用类型的转换
基本类型间的比较相对简单。引用类型和基本类型的比较就相对复杂一些,先要把引用类型转成基本类型,再按上 述的方法比较。
PreferredType转换策略
-
如果PreferredType被标记为Number,则会进行下面的操作流程来转换输入的值。
1、如果输入的值已经是一个原始值,则直接返回它
2、否则,如果输入的值是一个对象,则调用该对象的valueOf()方法, 如果valueOf()方法的返回值是一个原始值,则返回这个原始值。
3、否则,调用这个对象的toString()方法,如果toString()方法返回的是一个原始值,则返回这个原始值。
4、否则,抛出TypeError异常。
-
如果PreferredType被标记为String,则会进行下面的操作流程来转换输入的值。
1、如果输入的值已经是一个原始值,则直接返回它
2、否则,调用这个对象的toString()方法,如果toString()方法返回的是一个原始值,则返回这个原始值。
3、否则,如果输入的值是一个对象,则调用该对象的valueOf()方法, 如果valueOf()方法的返回值是一个原始值,则返回这个原始值。
4、否则,抛出TypeError异常。
注意:
PreferredType的值会按照这样的规则来自动设置:
1、该对象为Date类型,则PreferredType被设置为String
2、否则,PreferredType被设置为Number
//object 隐式转换
var obj = {
name: 'zhangsan',
age:18
}
// 如果输入的值是一个对象,则调用该对象的valueOf()方法,
// 如果valueOf()方法的返回值是一个原始值,则返回这个原始值。(对象的原始值string)
// 3、否则,调用这个对象的toString()方法,如果toString()方法返回的是一个原始值,则返回这个原始值。
console.log(obj,typeof(obj));//{ name: 'zhangsan', age: 18 }
console.log(obj.valueOf(),typeof(obj.valueOf()));//{ name: 'zhangsan', age: 18 } object
console.log(obj.valueOf().toString(),typeof(obj.valueOf().toString()));//[object Object] string
console.log(obj + 'hello');//{name:zhangsan,age:18}hello,这个是错误。[object Object]hello,才正确