类型转换,位运算符

类型转换

强制转换

  1. Number(): 将数据转成数值类型.bash

    Number()能够将对任意值进行数值的类型转换,分为几种状况:spa

  • 当值是字符串类型的数字时:
Number('123');
复制代码

在控制台上输入这句,打印出的是数字类型的123,而不是字符串类型的。code

  • 当值是包含非数字的字符串时:
Number('abc');
Number('123a');
Number('中文');
...
复制代码

这些状况进行Number()转换,值是NaN,即:非数。可是NaN也是属于数字类型的。字符串

  • 当值是undefined时:
Number(undefined);
复制代码

打印的结果是NaN.string

  • 当值是null或false:
Number(null);
Number(false);
复制代码

打印的值是0.it

  • 当值是true:
Number(true);
复制代码

打印的值是1.class

  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 倍

以此类推。

相关文章
相关标签/搜索