【JS. ES5重點筆記】數據類型

雖然目前已經算是ES6的時代,然是ES5的尾巴仍在衆多框架中出現,JS我雖然經過視頻等方式學習,曾經作過項目,可是仍對部分細節和原理不瞭解,經過閱讀這本書,但願能對ES5有更加完整的瞭解。git

爲何我要選擇這個作專題

數據類型相信對JS有所瞭解的人都不陌生,可是具體的細節我仍是想作好筆記,方便複查,有時候,這種細節問題出bug你要是不知道是根本沒法排除的。另外,面試的時候極可能遇到。github

數據類型

簡單數據類型

ES5中有5中簡單數據類型,Undefined, Null, Boolean, Number, String.面試

Undefined類型

一種特殊的數據類型,只有一個值undefined。框架

var message;
alert(message==undefined);  // true

已經聲明可是沒有初始化的變量默認都是Undefined類型的。可是須要強調的是,Undefined類型的默認是在已經聲明的前提下,未聲明的變量是直接報錯而並不是Undefined。函數

var message;

// var news; 
// news未聲明

alert(message==undefined);  // true
alert(news==undefined);     // 報錯

Null類型

Null類型一樣很特殊,只有一種值,那就是null,他更像是一個空指針,因此其typeof會顯示爲object類型。另外,當不清楚變量的初始值時,將變量初始爲null更加合適,這樣一來,只要直接檢查 null 值就能夠知道相應的變量是否已經保存了一個對象的引用。組件化

if (car!=null){
    // some possible operation
}

還須要注意的是,Null類型和Undefined類型的相等操做符運算返回值爲「true」。學習

Boolean類型

布爾型只有兩個值,true和false,他不是簡單的1和0的對應關係,而是真假,可是,簡便地,數據類型的轉換會十分靈活,以下面所示。spa

數據類型 轉換爲True 轉換爲False
Boolean true false
String 任何非空字符串 空字符串
Number 任何非0數值,包括無窮大 0和NaN
Object 任何對象 null
Undefined n/a undefined

Number類型

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

String類型

字符串相信都比較熟悉,此處首先是先強調一點,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類型

object一樣屬於一種數據類型,可是屬於複雜數據類型,在這本書裏面專門有專題講解,此處先不贅述。

下面是個人我的公衆號,技術方面的內容以及非技術方面內容都會在此展現。
我的公衆號

相關文章
相關標籤/搜索