类型转换
强制转换
-
Number(): 将数据转成数值类型.
Number()可以将对任意值进行数值的类型转换,分为几种情况:
- 当值是字符串类型的数字时:
Number('123');
在控制台上输入这句,打印出的是数字类型的123,而不是字符串类型的。
- 当值是包含非数字的字符串时:
Number('abc');
Number('123a');
Number('中文');
...
这些情况进行Number()转换,值是NaN,即:非数。但是NaN也是属于数字类型的。
- 当值是undefined时:
Number(undefined);
打印的结果是NaN.
- 当值是null或false:
Number(null);
Number(false);
打印的值是0.
- 当值是true:
Number(true);
打印的值是1.
- parseInt(): 将值转换成数字整型。
- 带小数点的数字,会取整数的部分,但是不是四舍五入的,是向下取整。
parseInt(100.23); // -> 100
parseInt(5.9); // -> 5
- 注意,parseInt也会进行隐示的Number()转换,所以对于字符串数字,一样可以取整。
parseInt('100'); // - > 100
parseInt('123.66'); // -> 123
- 对带有非数字的字符串,如果首位是数字,会进行取整,直到取到不是数字位的,如果首位不是数字,值为NaN,请看例子:
parseInt('225aaa'); // -> 225
parseInt('100bcd88'); // -> 100
parseInt('eee32'); // NaN
- parseInt()也可以填两个值,即:parseInt(strin,radix),第一个值还是填你需要转换的值,第二个值可以填一个数字,代表前面的值是以该数字为基底的进制的。
这么说有点抽象,举个例子:
parseInt('26',8);
执行这段代码,就会把字符串‘26’作为8进制的整数,然后再转换成10进制的数值进行输出。比如上面这段代码,8进制的26,其实在十进制里是22,所以打印出的结果是22.
第二个值可以写也可以不写,范围在2~36之间,如果你的取值不在这个区间,返回结果是NaN.
需要注意的是,如果你输入的第一个值,很明显不在后面填写的进制范围内,返回结果也是NaN,请看例子:
parseInt(8,2);
上面的代码是要把以2进制为基底的数值8,转换成十进制的整数。
但是2进制我们都知道,只有0、1,不可能出现8,所有执行该代码返回的结果只能是NaN.
-
parseFloat(): 将数据转成浮点型数值。
这个比较好理解,数值本来就不一定是刚好是整数的,很多时候我们可能会用到小数,所以这个方法恰好可以帮我们保留值得小数部分。
parseFloat('1.5a'); // -> 1.5
parseFloat('a1.5'); // -> NaN
当然了,和parseInt()一样,对于字符串的开头是非数的值,转换结果是NaN.
- toString(): 将值转换成字符串。
上面的类型转换,都是把需要转换的值写在括号里面的,但是这个方法不是这么直接填写的方式的,需要把你要转换的值,先存在一个变量里,然后调用这个方法。
var n = 123;
n.toString(); // -> '123'
该方法可以把值转换成字符串的类型,但是注意了,undefined 和 null 不能调用该方法,即使是先赋值给变量,再调用也不行,会报错。
隐示类型转换
- 数字 + 字符串:数字转成字符串。
var a = 2 + '3'; // -> '23'
var b = 5 + 'hello'; // -> '5hello'
数字和字符串相加,不管字符串是数字的字符串,还是非数字的字符串,都是直接进行字符的拼接,变成字符串类型的值。
- 数字 + 布尔型:布尔型转成数字。
var a = 2 + true; // -> 3
var b = 5 + false; // -> 5
数字与布尔值相加,布尔值进行了隐示的Number()类型转换,true=1,false=0.
- 字符串+布尔型:布尔型转成字符串。
var a = 'a' + true; // -> 'atrue'
var b = 'b' + false; // -> 'bfalse'
- 关于null
null和布尔值一样,会进行隐示的Number()类型转换,变成0,所有与数字相加是数字类型的转换,与字符串相加变成字符串。
var a = 2 + null; // -> 2
var b = true + null; // -> 1
var c = 'abc' + null; // -> 'abcnull'
位运算符
说位运算符之前,首先我们看一下,2进制是怎么转换成十进制的。
将数据转成二进制然后执行运算
1 10 11 100 101 110 111 1000 1001...
2 4 8
我们看第一行,是二进制的1位数,2位数,3位数等等,下面对应第一行位置的第二行,是这个数字在十进制中的数值。
即: 二进制10 = 十进制2 = 2的1次方;
100 = 4 = 2的2次方;
1000 = 8 = 2的3次方;
...
有几个零,就是2的几次方。
所以100000 = 2的5次方 = 32;
11001 = 10000 + 1000 + 1 = 16 + 8 + 1 = 25;
2进制就是这样转化成十进制的,然后我们一起看位运算符。
- 按位与(&): 上下两位都是1,结果是1,否则是0.
举个例子:
var a = 5 & 9;
首先我们需要把5和9都转换成2进制的数,再进行运算。
5 = 4 + 1 = 100 + 1 = 101;
9 = 8 + 1 = 1000 + 1 = 1001;
再把5和9进行上下的每一位进行对比,位数不够可以前面补零:
0101 // 5
↓↑
1001 // 9
进行上下对比:
0001
上下两位都是1的,结果是1,否则是0,所以上面的结果是0001,也就是1,所以打印出 a 的结果就是1.
- 按位或(|): 上下两位含有1,结果是1,否则是0.
类似上面的方法,但是比较方式不同:
var a = 5 | 9;
0101 // 5
↓↑
1001 // 9
进行上下对比:
1101
得出的结果是1101,但是不是直接打印出1101,因为这个是2进制的,需要转化成十进制的,再打印出来,所以结果是 13.
- 按位异或(^): 上下两位相同是0,不同是1.
类似上面的方法,仅比较方式不同:
var a = 5 ^ 9;
0101 // 5
↓↑
1001 // 9
进行上下对比:
1100
得出的结果是1101,转化成十进制再打印出来,结果是 12.
- 按位右移(>>) 删除二进制的最后n位,大概变小到原来 1/2的n次方 倍。
按位右移,是指把数值转化成2进制的,然后把数值整体往右移n位,具体多少位,可以自定义,移几位,就删除尾数几位。
var a = 16 >> 1; //先把16转化成2进制的数
16 -> 10000
往右移1位,即删除最后一位
得到 1000
1000 转化成十进制 -> 8
所以数值 16 按位右移1位得到的值是 8.是之前的 1/2 倍
16 按位右移2位得到的值是 4.是之前的 1/4 倍
16 按位右移3位得到的值是 2.是之前的 1/8 倍
但是为什么之前说是大概呢,因为对于偶数,后面去除的位数刚好是0,正好就是整数倍。但是对于奇数,或者后面去除的位数是1的,会向下取整。
var a = 15 >> 1; //先把15转化成2进制的数
15 -> 1111;
往右移1位,即删除最后一位
得到 111
111 转化成十进制 -> 7
15 按位右移1位得到的值是 7; //14的一半
13 按位右移1位得到的值是 6; // 12的一半
11 按位右移1位得到的值是 5; // 10的一半
得到的值,刚好是(该值-1 )的一半。
- 按位左移(<<): 在二进制的最后添加0,变大到原来 2的n次方 倍.
这个是正好的倍数,因为每次都是在末尾加一个0,不是加1,没有误差。
var a = 10 << 1; //先把10转化成2进制的数
10 -> 1010;
往左移1位,即在最后一位添加一个0
得到 10100
10100 转化成十进制 -> 20
10 按位右移2位得到的值是 40.是之前的 4 倍
10 按位右移3位得到的值是 80.是之前的 8 倍
以此类推。