類型轉換,位運算符

類型轉換

強制轉換

  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 倍

以此類推。

相關文章
相關標籤/搜索