类型转换,位运算符

类型转换

强制转换

  1. 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.

  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.

  1. parseFloat(): 将数据转成浮点型数值。

    这个比较好理解,数值本来就不一定是刚好是整数的,很多时候我们可能会用到小数,所以这个方法恰好可以帮我们保留值得小数部分。

parseFloat('1.5a');  // -> 1.5
parseFloat('a1.5');  // -> NaN

当然了,和parseInt()一样,对于字符串的开头是非数的值,转换结果是NaN.

  1. toString(): 将值转换成字符串。
    上面的类型转换,都是把需要转换的值写在括号里面的,但是这个方法不是这么直接填写的方式的,需要把你要转换的值,先存在一个变量里,然后调用这个方法。
var n = 123;
n.toString();   // -> '123'

该方法可以把值转换成字符串的类型,但是注意了,undefined 和 null 不能调用该方法,即使是先赋值给变量,再调用也不行,会报错。

隐示类型转换

  1. 数字 + 字符串:数字转成字符串。
var a = 2 + '3';   // -> '23'
var b = 5 + 'hello';  // -> '5hello'

数字和字符串相加,不管字符串是数字的字符串,还是非数字的字符串,都是直接进行字符的拼接,变成字符串类型的值。

  1. 数字 + 布尔型:布尔型转成数字。
var a = 2 + true;  // -> 3
var b = 5 + false;  // -> 5

数字与布尔值相加,布尔值进行了隐示的Number()类型转换,true=1,false=0.

  1. 字符串+布尔型:布尔型转成字符串。
var a = 'a' + true;   // -> 'atrue'
var b = 'b' + false;  // -> 'bfalse'
  1. 关于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,结果是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,结果是1,否则是0.
    类似上面的方法,但是比较方式不同:
var a = 5 | 9;

0101    // 5
↓↑
1001    // 9
进行上下对比:
1101

得出的结果是1101,但是不是直接打印出1101,因为这个是2进制的,需要转化成十进制的,再打印出来,所以结果是 13.

  1. 按位异或(^): 上下两位相同是0,不同是1.
    类似上面的方法,仅比较方式不同:
var a = 5 ^ 9;

0101    // 5
↓↑
1001    // 9
进行上下对比:
1100    

得出的结果是1101,转化成十进制再打印出来,结果是 12.

  1. 按位右移(>>) 删除二进制的最后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 )的一半。

  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 倍

以此类推。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容