雖然目前已經算是ES6的時代,然是ES5的尾巴仍在衆多框架中出現,JS我雖然經過視頻等方式學習,曾經作過項目,可是仍對部分細節和原理不瞭解,經過閱讀這本書,但願能對ES5有更加完整的瞭解。git
數據類型相信對JS有所瞭解的人都不陌生,可是具體的細節我仍是想作好筆記,方便複查,有時候,這種細節問題出bug你要是不知道是根本沒法排除的。另外,面試的時候極可能遇到。github
ES5中有5中簡單數據類型,Undefined, Null, Boolean, Number, String.面試
一種特殊的數據類型,只有一個值undefined。框架
var message; alert(message==undefined); // true
已經聲明可是沒有初始化的變量默認都是Undefined類型的。可是須要強調的是,Undefined類型的默認是在已經聲明的前提下,未聲明的變量是直接報錯而並不是Undefined。函數
var message; // var news; // news未聲明 alert(message==undefined); // true alert(news==undefined); // 報錯
Null類型一樣很特殊,只有一種值,那就是null,他更像是一個空指針,因此其typeof會顯示爲object類型。另外,當不清楚變量的初始值時,將變量初始爲null更加合適,這樣一來,只要直接檢查 null 值就能夠知道相應的變量是否已經保存了一個對象的引用。組件化
if (car!=null){ // some possible operation }
還須要注意的是,Null類型和Undefined類型的相等操做符運算返回值爲「true」。學習
布爾型只有兩個值,true和false,他不是簡單的1和0的對應關係,而是真假,可是,簡便地,數據類型的轉換會十分靈活,以下面所示。spa
數據類型 | 轉換爲True | 轉換爲False |
---|---|---|
Boolean | true | false |
String | 任何非空字符串 | 空字符串 |
Number | 任何非0數值,包括無窮大 | 0和NaN |
Object | 任何對象 | null |
Undefined | n/a | undefined |
Number類型還能細分整數和浮點數值。指針
// 整數 var intNum=55; // 八進制 var octalNum1=070; var octalNum2=079; var octalNum3=08; // 十六進制 var hexNum1=0xA; var hexNum2=0x1f; // 浮點數 var floatNum1=1.1; var floatNum2=10.; // 會解析爲整數 var floatNum3=3.14e10; // 科學計數法
js在計算中存在精度問題的內容我單獨寫一篇文章解釋,是解決JS浮點數精度問題。因爲精度問題的複雜性,本身變成解決成本過高,有人已經組件化實現了。Big.jscode
計算機中的數值是存在範圍的,最小值精度表示爲Number.MIN_VALUE
,值爲5e-325,最大值表示爲Number.MAX_VALUE
,值爲1.7976931348623157e+308。超過最大值會被解析爲Infinity
,小於最小值精度-Infinity
。
NaN是最特殊的類型,表示沒有意義的數,例如10/0。並且有下面的特殊規則。
alert(NaN == NaN); //false alert(isNaN(NaN)); //true alert(isNaN(10)); //false( 10 是一個數值) alert(isNaN("10")); //false(能夠被轉換成數值 10) alert(isNaN("blue")); //true(不能轉換成數值) alert(isNaN(true)); //false(能夠被轉換成數值 1)
數值轉換成其餘類型規則和案例以下:
若是是 Boolean 值, true 和 false 將分別被轉換爲 1 和 0。
若是是數字值,只是簡單的傳入和返回。
若是是 null 值,返回 0。
若是是 undefined,返回 NaN。
若是是字符串,遵循下列規則:
若是字符串中只包含數字(包括前面帶正號或負號的狀況),則將其轉換爲十進制數值,即"1"
會變成 1, "123"會變成 123,而"011"會變成 11(注意:前導的零被忽略了);
若是字符串中包含有效的浮點格式,如"1.1",則將其轉換爲對應的浮點數值(一樣,也會忽略前導零);
若是字符串中包含有效的十六進制格式,例如"0xf",則將其轉換爲相同大小的十進制整數值;
若是字符串是空的(不包含任何字符),則將其轉換爲 0;
若是字符串中包含除上述格式以外的字符,則將其轉換爲 NaN。
若是是對象,則調用對象的 valueOf()方法,而後依照前面的規則轉換返回的值。若是轉換的結果是 NaN,則調用對象的toString()方法,而後再次依照前面的規則轉換返回的字符串值。
var num1 = Number("Hello world!"); //NaN var num2 = Number(""); //0 var num3 = Number("000011"); //11 var num4 = Number(true); //1
因爲Number()比較複雜,處理整數的時候parseInt()函數,規則不用多說,直接看例子。
var num1 = parseInt("1234blue"); // 1234 var num2 = parseInt(""); // NaN var num3 = parseInt("0xA"); // 10(十六進制數) var num4 = parseInt(22.5); // 22 var num5 = parseInt("070"); // 56(八進制數) var num6 = parseInt("70"); // 70(十進制數) var num7 = parseInt("0xf"); // 15(十六進制數)
對於部分狀況,ES3和ES5存在分歧。
//ECMAScript 3 認爲是 56(八進制), ECMAScript 5 認爲是 70(十進制) var num = parseInt("070"); alert(num)
爲了防止上述問題,這個函數有了雙參數形式。雙參數形式的主要目的實際上是規定解析的進制。
var num = parseInt("0xAF", 16); //175 var num1 = parseInt("AF", 16); //175 var num2 = parseInt("AF"); //NaN var num1 = parseInt("10", 2); //2 (按二進制解析) var num2 = parseInt("10", 8); //8 (按八進制解析) var num3 = parseInt("10", 10); //10 (按十進制解析) var num4 = parseInt("10", 16); //16 (按十六進制解析)
相似地,還有parseFloat()函數。下面是詳細的例子。主要是要看清楚其解析機制。
var num1 = parseFloat("1234blue"); //1234 (整數) var num2 = parseFloat("0xA"); //0 var num3 = parseFloat("22.5"); //22.5 var num4 = parseFloat("22.34.5"); //22.34 var num5 = parseFloat("0908.5"); //908.5 var num6 = parseFloat("3.125e7"); //31250000
字符串相信都比較熟悉,此處首先是先強調一點,JS對單雙引號括起來的字符串沒有區別,可是必須匹配。
下面是常見的轉義字符:
轉義字符 | 含 義 |
---|---|
n | 換行 |
t | 製表 |
b | 空格 |
r | 回車 |
f | 進紙 |
\\ | 斜槓 |
\' | 單引號('),在用單引號表示的字符串中使用。例如: 'He said, 'hey.'' |
\" | 雙引號("),在用雙引號表示的字符串中使用。例如: "He said, "hey."" |
xnn | 以十六進制代碼nn表示的一個字符(其中n爲0~F)。例如, x41表示"A" |
unnnn | 以十六進制代碼nnnn表示的一個Unicode字符(其中n爲0~F)。例如, u03a3表示希臘字符Σ |
關於字符串的轉換,其實核心就是toString()函數,若是是數字型,還能夠添加參數,使之變爲二進制、八進制、十進制、十六進制數。
var num = 10; alert(num.toString()); // "10" alert(num.toString(2)); // "1010" alert(num.toString(8)); // "12" alert(num.toString(10)); // "10" alert(num.toString(16)); // "a"
而對其餘類型,存在一些特殊狀況:
var value1 = 10; var value2 = true; var value3 = null; var value4; alert(String(value1)); // "10" alert(String(value2)); // "true" alert(String(value3)); // "null" alert(String(value4)); // "undefined"
object一樣屬於一種數據類型,可是屬於複雜數據類型,在這本書裏面專門有專題講解,此處先不贅述。
下面是個人我的公衆號,技術方面的內容以及非技術方面內容都會在此展現。