1. 程式人生 > >《JavaScript高級程序設計》讀書筆記(三)基本概念第二小節 Number類型

《JavaScript高級程序設計》讀書筆記(三)基本概念第二小節 Number類型

一個 存在 ron 之前 value nbsp 瀏覽器 整數 操作

內容
---語法 上一小節
---數據類型 本小節 number類型
---流程控制語句
---理解函數

number類型
--使用IEEE754格式來表示整數和浮點數值(雙精度數值)
--規定了數值字面量格式,支持各種數值類型

55 //整數
070 //八進制56
079 //無效八進制,解析為79
08 //無效,解析為8

--八進制第一位必須是零(0),如果字面值超出範圍,前導忽略作為十進制
--嚴格模式下,八進制無效,會拋出錯誤

--十六進制以 0x 開頭,超出格式報錯
--在算術計算時,統一用十進制數值
--+0和-0,支持保存,但是值認為相等


浮點數值
--數值中必須包含小數點,並且小數點之後必須有一位數字
--小數點之前可以沒有數字,但是不推薦

var a = 1.1;
var b = 0.2;
var c = .3; //有效,不推薦

--浮點數值存儲空間是整數值的兩倍,因此ECMAScript會不失時機地將浮點數值轉化為整數值
--小數點後沒有任何數字,本身就是整數的浮點數(1.0)都會被轉化成整數值

科學記數法
--e表示法,前面是一個數值,中間是一個e/E,後面是10的冪中的指數

var floatNum = 3.125e7; //31250000

--表示極小數時,ECMAScript默認會對小數點後帶有6個零以上的浮點數值轉化為e表示法

--浮點數值最高精度是17位小數,但是在進行算術計算時精度遠遠不如整數
--0.1+0.2 = 0.30000000000004
--所以不要測試某個特定的浮點數值,用於判斷
--這是IEEE754數值的通病

數值範圍
--最小數值保存在Number.MIN_VALUE中,在大多數瀏覽器下是5e-324
--最大數值保存在Number.MAX_VALUE中,在大多數瀏覽器下是1.7976931348623157e+308
--計算的數值超出數值範圍,這個數值將被保存為特殊值 Infinity
--正數 Infinity, 負數 -Infinity
--訪問Number.NEGATIVE_IFINNTY和Number.POSITIVE_IFINNTY可以得到負和正Infinity的值


NAN
--非數值(Not a Number)是一個特殊數值
--用於表示本來要返回數值的操作數未返回數值的情況(不會拋出錯誤)
--例如 a/0 返回NaN不會影響其他代碼的執行
--涉及NaN的操作返回都是NaN
--NaN與任何值都不相等,包括自身 NaN==NaN//false
--isNaN()函數,用於判斷是否 不是數值

isNaN(NaN); //true
isNaN(10); //false
isNaN("10"); //false
isNaN("blue");//true
isNaN(true); //false

--true->1,false->0,

--isNaN()也適用於對象,
--對象調用,會首先對用對象的valueOf()方法,判斷返回值,如果不能
--則基於這個返回值再調用toString()方法,再檢測返回值

數值轉換
--Number(),parseInt(), parseFloat()
--Number()用於任何數據類型,後兩個專門用於字符串

Number()下
--true->1,false->0
--數值,簡單傳入和返回
--null->0
--undefined->NaN
--字符串
----只包含數值(包括+,-)轉化為十進制數(前導零會被忽略,所以沒有八進制)
----有效浮點數(前導零會被忽略,所以沒有八進制)
----有效十六進制,會轉化為相同大小十進制
----空串-> 0
----還包含其他字符,則轉化為NaN
----如果是對象,則先調用valueOf(),轉化如果為NaN,再調用toString()
--對字符串轉換比較復雜,不合理一般用parseInt,parseFloat代替

Number()等同於一元+操作符

Number("11"); //11
+("11"); //11
-("11"); //-11
+"11"; //11
-"11"; //-11

parseInt(string, radix)方法
--返回十進制數值
--忽略空格
--第一個不是負號或者數字字符 返回NaN
--直到解析完後續字符或者遇到了非數字字符
--小數點無效
--radix,可選(es5支持的參數)。表示要解析的數字的基數。該值介於 2 ~ 36 之間。
--(es5)八進制無效,(es3支持八進制)
--如果省略該參數或其值為 0,則數字將以 10 為基礎來解析。
--如果它以 “0x” 或 “0X” 開頭,將以 16 為基數。
--如果基數為16,則能識別 0x開頭的 和不以0x開頭的兩種
--如果該參數小於 2 或者大於 36,則 parseInt() 將返回 NaN。

parseInt(" 1.1asd"); //1
parseInt("010"); //10
parseInt("010",6); //6
parseInt("0xa"); //10
parseInt("0xa",16); //10
parseInt("a",16); //10
parseInt("0xa",17); //0 x無法識別

請始終保持基數radix參數的書寫,防止出錯

拓展

["1", "2", "3"].map(parseInt)輸出什麽?

["1", "2", "3"].map(parseInt)等同於
["1","2","3"].map(function(ele,index){
  return parseInt(ele,index)
})

等於調用了三次parseInt方法:
第一次 parseInt("1",0) //基數為0時,按照上邊陳述即為10進制,返回 1
第一次 parseInt("2",1)//基數為1,不在2-36範圍內,默認輸出NaN
第一次 parseInt("3",2)//基數為2,因為字符串3大於基數不合法,解析為NaN
答案也就是:[1, NaN, NaN]


parseFloat(string)方法
--與parseInt相同,從第一位置解析之末尾
--或者遇到第一個無效浮點數字符
--第一個小數點有效,之後的無效
--只識別十進制

parseFloat(" 0.1.1asd"); //0.1
parseFloat("0.1e2.3"); //10 e後面為整數 第二個點無效

《JavaScript高級程序設計》讀書筆記(三)基本概念第二小節 Number類型