Number(): 將數據轉成數值類型.bash
Number()能夠將對任意值進行數值的類型轉換,分爲幾種狀況:spa
Number('123');
複製代碼
在控制檯上輸入這句,打印出的是數字類型的123,而不是字符串類型的。code
Number('abc');
Number('123a');
Number('中文');
...
複製代碼
這些狀況進行Number()轉換,值是NaN,即:非數。可是NaN也是屬於數字類型的。字符串
Number(undefined);
複製代碼
打印的結果是NaN.string
Number(null);
Number(false);
複製代碼
打印的值是0.it
Number(true);
複製代碼
打印的值是1.class
parseInt(100.23); // -> 100
parseInt(5.9); // -> 5
複製代碼
parseInt('100'); // - > 100
parseInt('123.66'); // -> 123
複製代碼
parseInt('225aaa'); // -> 225
parseInt('100bcd88'); // -> 100
parseInt('eee32'); // NaN
複製代碼
這麼說有點抽象,舉個例子:變量
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.
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和布爾值同樣,會進行隱示的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進制就是這樣轉化成十進制的,而後咱們一塊兒看位運算符。
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.
var a = 5 | 9;
0101 // 5
↓↑
1001 // 9
進行上下對比:
1101
複製代碼
得出的結果是1101,可是不是直接打印出1101,由於這個是2進制的,須要轉化成十進制的,再打印出來,因此結果是 13.
var a = 5 ^ 9;
0101 // 5
↓↑
1001 // 9
進行上下對比:
1100
複製代碼
得出的結果是1101,轉化成十進制再打印出來,結果是 12.
按位右移,是指把數值轉化成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,不是加1,沒有偏差。
var a = 10 << 1; //先把10轉化成2進制的數
10 -> 1010;
往左移1位,即在最後一位添加一個0
獲得 10100
10100 轉化成十進制 -> 20
複製代碼
10 按位右移2位獲得的值是 40.是以前的 4 倍
10 按位右移3位獲得的值是 80.是以前的 8 倍
以此類推。