一、数据类型转换
类型转换主要指将其他数据类型转换为:String、Number、Boolean
1、将其他数据类型转换为String
1) 调用toString()方法,b = a.toString();,该方法不会影响原变量,会将结果返回;
Null和Undefined这两个值没有toString()方法,调用会报错
2)调用String()函数,b = String(a);使用String()函数不会影响原变量,对于Boolean和Number来说调用String()函数就是调用toString()方法,而对于null和undifined转换为“null”,“undefined”。
3)算术运算符(隐式类型转换)
任何值与字符串进行+运算都先转换为字符串再进行拼接:我们只需要为任意的数据类型+“”空串,就可以将其转换为String
,由浏览器自动完成,实际上调用的是String()函数 null+“”;字符串null, undefined+"";字符串undefined,true +“1” =“true1”;true + "" ="true"“123”+“345” =“123345”字符串拼接; 1+2+“3” = “33” ;“1”+2+3=“123”
2、将其它数据类型转换为Number
1)使用Number()函数
-字符串 ->数字
如果字符串是纯数字的字符串,则直接将其转换为数字
如果字符串中有非数字内容则转换为NaN
如果字符串是一个空串或全部是空格的字符串,则转换为0
-布尔值-->数值 true:1 false:0、Null 转换为数字0、undefined转换为NaN
2)使用parseInt()将字符串中有效的整数内容解析出来,然后转换为Number,
var a = "123a2345px" ;//123 "b123px";//NaN a = true;//NaN
parseFloat()将字符串中有效的浮点数内容解析出来,然后转换为Number,
var a = "123.234.345px";//123.234
如果对非String使用parseInt()或 parseFloat()会先将其转换为String然后再操作: a = true,false、 null、 undefined--->NaN
十六进制 a=0x10;输出还是按照十进制输出
八进制 b= 070;//56
二进制 c=0b0101010;//二进制在浏览器中兼容性不好,有些浏览器不支持(IE)
b2 = parseInt(a);// chroome、Firefox、IE11、IE10、Edge输出结果为56,IE9及以下中报错但也输出结果56,浏览器版本 不同可能有些版本的浏览器会解析成70,
b3 = parseInt(a,10);//为了防止不同浏览器解析出来的结果不同,可以用第二个参数指定进制
3)算术运算符(隐式类型转换)算数运算符不会对原变量产生影响
+:当对Number类型的值进行运算时,会将这些值转换为Number再进行运算。任何值和NaN做运算都得NaN:
true+1 =2 ;false +1 =1;null + 1 = 1;undefined+1 = NaN;NaN+1 = NaN;
1+2+“3” = “33”;字符串33,从左往右进行计算; “1”+2+3=“123”;字符串123
-:运算符
1-true = 0;1-false = 1;1-null = 1;1-undefined = NaN;1-NaN= NaN;1-“1”=0;1- “”=1;1-“ ”=1;1-“1a”=NaN ;
减0,除1乘1都可以转换成Number原理和Number()一样
4)使用 正号 单目运算符,对于非Number类型的数值先转换成Number类型再进行计算
+正号:-负号
3、将其他数据类型转换为Boolean
使用Boolean()函数
数字0和NaN转换为false,其他的都是true包括Infinity
字符串中空串转换为false,其他的都是true包括空格
null(空对象) 和undefined都转换为false,对象也会转换为true
隐式类型转换
!非:对布尔值进行取反运算,如果对一个非Booleanz值进行!运算,则会将其转换为布尔值再进行运算
二、运算符
typeof,instanceof也是运算符,返回结果是字符串
1、算数运算都:不会对原变量产生影响
+:
1)当对Number类型的值进行运算时,都将其转换为Number,任何值与NaN相加都是NaN
true+1 =2;false+1 = 1;null+1 = 1;undefined+1 =1;NaN+1 =NaN
2)任意数据类型与字符串+都转换成字符串
1+2+“3”=“33”;“1”+2+3=“123”;null+“”="null";undefined+“”=“undefined”;true+“”=“true”;
NaN + "" ="NaN";
-:
1)任意数据类型进行-运算都是将其转换为Number
1 -true 0;1-false=1;1-null=1;1-undefined = NaN ;1-NaN= NaN;1-“”=1;
1-“1”=0;1-“abc”=NaN ;1-“1abc”=NaN;100-“12”=88
*:
1*2=2;2*‘2’ =4;2*undefined =NaN;2*null=0;2*“”=0;2*false=0;2*true=2;
2*“123”=246;2*“abc”=NaN
3/2=1.5
任何值与- * / 减、乘、除做运算都先转换为Number
%取模:取余数
2、一元运算符
正号:负号:对数字进行取反
对非Number类型的值,先转换为Number再进行运算
3、自增和自减:有些会对原变量产生影响
4、逻辑运算符 !非、&&与、||或
1)布尔值的逻辑运算
!非:对布尔值进行取反运算,如果对一个非Booleanz值进行!运算,则会将其转换为布尔值再进行运算。可以为一个任意数据类型取反两次,来将其转换为布尔值
&&与:两个值都为true才会返回true,JS中&&属于短路的与,当一个值为false就不会检查第二个值了
||或:两个都是false返回false,
2)非布尔值的逻辑运算:对于非布尔值进行与或非运算时 ,先将其转换为布尔值再进行运算,并返回原值。(只有在JS中才可以对非布尔值进行逻辑运行,其他语言中没有这个功能)
&&运算:如果两个值都为true则返回后边的,如果有两个值中有false则返回靠前的false
理解:如果第一个值为true则返回第二个值(它需要去检查第二个值);如果第一个值为false(0,NaN)则返回第一个值
||或运算:如果第一个值为true则返回第一个值,如果第一个值为false则返回第二个值
5、赋值运算符
=:、+=;、-+;、*=;等
6、关系运算符 >、<等
非数值进行比较的情况: 对非数值进行比较时,先转换成数值再进行比较,任何值与NaN做任何类型作比较都是false。
注意:如果关系运算符两侧的符号都是字符串则不会将其转换为数字比较,而是比较字符串的Unicode编码
==:比较两个值如果两个值的类型不同,则自动转换成相同的类型进行再 比较,大部分情况下转换成数组
!=:如果两个值的类型不同则自动进行类型转换,再比较如果不等则返回true
===:不会做类型转换,类型不一样直接返回false
!==:不会做类型转换,,类型不同直接返回true
7、条件运算符(三元运算符)
条件表达式?语句1:语句2,先对条件表达式进行求值如果值为true则执行语句1,如果条件表达式值为false则执行语句2.
并且有返回结果,就是执行的语句1或语句2,如果条件表达式的求值结果是一个非Boolean值,则将其转换为布尔值再进行运算。
8、typeof运算符检查基本数据类型,instanceof检查引用类型
9、逗号运算符,可以分割多个语句,var a ,b;
三、运算符的优先级:
优先级越高越优先计算,一样高则从左到右计算,可以使用()改变优先级,需要注意的是&&优先级高于||
1)点号obj.name,[]obj[age],new
2)()
3)!、~、+(单目)、-(单目)、typeof、void、delete
4)%、*、/
5)+(双目)、-(双目)
6)<<、>>、>>>
7)==、!==、===
8)&
9)^
10)|
11)&&
12)||
13)?:
14) = 、+=、-=、*=、/=、%=、<<=、>>=、&=、^=、|=、>>>=