一 JavaScript之數據類型

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/ab20514/article/details/51063229

js中有5種簡單數據類型:Undefined、Null、Boolean、Number和String。還有一種複雜數據類型——Object。ECMAScript不支持任何創建自定義類型的機制,所有值都成爲以上6中數據類型之一。

一.typeof操作符

  • typeof操作符是用來檢測變量的數據類型。對於值或變量使用typeof操作符會返回如下字符串。
字符串 描述
undefined 未定義
boolean 布爾值
string 字符串
number 數值
object 對象或null
function 函數


  • typeof操作符可以操作變量,也可以操作字面量。雖然也可以這樣使用:typeof(box),但,typeof是操作符而非內置函數。

PS:函數在ECMAScript中是對象,不是一種數據類型。所以,使用typeof來區分function和object是非常有必要的。

二.Undefined類型

  • Undefined類型只有一個值,即特殊的undefined。在使用var聲明變量,但沒有對其初始化時,這個變量的值就是undefined。

    var box;
    alert(box);
    

    未初始化的變量與根本不存在的變量(未聲明的變量)也是不一樣的。

    var box;
    alert(age);   //age is not defined
  • 如果typeof box,typeof age都返回的undefined。從邏輯上思考,他們的值,一個是undefined,一個報錯;他們的類型,卻都是undefined。

    • 所以,我們在定義變量的時候,儘可能的不要只聲明,不賦值。

三.Null類型

  • Null類型是一個只有一個值的數據類型,即特殊的值null。它表示一個空對象引用(指針),而typeof操作符檢測null會返回object。

    var box = null;
    alert(typeof box);
  • 如果定義的變量準備在將來用於保存對象,那麼最好將該變量初始化爲null。這樣,當檢查null值就知道是否已經變量是否已經分配了對象引用了。
 var box = null;
 if (box != null) {
    alert('box對象已存在!');
 }

說明:undefined是派生自null的,因此ECMA-262規定對它們的相等性測試返回true。
alert(undefined == null);

  • 數據類型也必須相等,返回false

    • alert(undefined === null) //數據類型必須相等纔可以

四.Boolean類型

  • Boolean類型有兩個值(字面量):true和false。而true不一定等於1,false不一定等於0。

    • JavaScript是區分大小寫的,True和False或者其他都不是Boolean類型的值。
      var box = true;
      alert(typeof box);
      
  • 顯示轉換,屬於強制性轉換

    • 要將一個值轉換爲其對應的Boolean值,可以使用轉型函數Boolean()。
var hello = 'Hello World!';
var hello2 = Boolean(hello);
alert(typeof hello);
  • 隱式轉換
var hello = 'Hello World!';
if (hello) {
    alert('如果條件爲true,就執行我這條!');
} else {
    alert('如果條件爲false,就執行我這條!');
}
  • 以下是其他類型轉換成Boolean類型規則
數據類型 轉換爲true的值 轉換爲false的值
Boolean true false
String 任何非空字符串 空字符串
Number 任何非零數字值(包括無窮大) 0和NaN
Object 任何對象 null
Undefined undefined

五.Number類型

  • Number類型包含兩種數值:整型和浮點型。
最基本的數值字面量是十進制整數。
var box = 100;          //十進制整

八進制數值字面量,(以8爲基數),前導必須是0,八進制序列(0~7)。
var box = 070;          //八進制,56
var box = 079;          //無效的八進制,自動解析爲79
var box = 08;           //無效的八進制,自動解析爲8

十六進制字面量前面兩位必須是0x,後面是(0~9及A~F)。
var box = 0xA;      //十六進制,10
var box = 0x1f;     //十六進制,31

浮點類型,就是該數值中必須包含一個小數點,並且小數點後面必須至少有一位數字。
var box = 3.8;
var box = 0.8;
var box = .8;           //有效,但不推薦此寫法

由於保存浮點數值需要的內存空間比整型數值大兩倍,因此ECMAScript會自動將可以轉換爲整型的浮點數值轉成爲整型。
var box = 12.0;     //小數點後面是0,轉成爲12

對於那些過大或過小的數值,可以用科學技術法來表示(e表示法)。e表示該數值的前面10的指數次冪。
var box = 4.12e9;       //即4120000000
var box = 0.00000000412;    //即4.12e-9

雖然浮點數值的最高精度是17位小數,但算術運算中可能會不精確。由於這個因素,做判斷的時候一定要考慮到這個問題(比如使用整型判斷)。
例如:alert(0.1+0.2); //0.30000000000000004

  • 浮點數值的範圍在:Number.MIN_VALUE ~ Number.MAX_VALUE之間
alert(Number.MIN_VALUE);            //最小值
alert(Number.MAX_VALUE);            //最大值
  • 如果超過了浮點數值範圍的最大值或最小值,那麼就出現Infinity(正無窮)或者-Infinity(負無窮)。
var box = 100e1000;             //超出範圍,Infinity
var box = -100e1000;            //超出範圍,-Infinity
  • 通過Number.POSITIVE_INFINITY和Number.NEGATIVE_INFINITY得到Infinity(正無窮)及-Infinity(負無窮)的值。
alert(Number.POSITIVE_INFINITY);    //Infinity(正無窮)
alert(Number.NEGATIVE_INFINITY);    //-Infinity(負無窮)
  • 確定一個數值到底是否超過了規定範圍,可以使用isFinite()函數。如果沒有超過,返回true,超過了返回false。
var box = 100e1000;
alert(isFinite(box));   //返回false或者true
  • NaN,即非數值(Not a Number)是一個特殊的值,這個數值用於表示一個本來要返回數值的操作數未返回數值的情況(這樣就不會拋出錯誤了)。

    var box = 0 / 0;                //NaN
    var box = 12 / 0;               //Infinity
    var box = 12 / 0 * 0;           //NaN
    
    • 通過Number.NaN得到NaN值
    • 任何與NaN進行運算的結果均爲NaN
    • NaN與自身不相等(NaN不與任何值相等)
    alert(Number.NaN);            //NaN
    alert(NaN+1);                  //NaN
    alert(NaN == NaN)              //false
    
  • ECMAScript提供了isNaN()函數,用來判斷這個值到底是不是NaN
    • isNaN()函數在接收到一個值之後,會嘗試將這個值轉換爲數值
alert(isNaN(NaN));              //true
alert(isNaN(25));               //false,25是一個數值
alert(isNaN('25'));             //false,'25'是一個字符串數值,可以轉成數值
alert(isNaN('Lee'));            //true,'Lee'不能轉換爲數值
alert(isNaN(true));             //false true可以轉成成1
  • isNaN()函數也適用於對象。
    • 在調用isNaN()函數過程中,首先會調用valueOf()方法,然後確定返回值是否能夠轉換成數值
    • 如果不能,則基於這個返回值再調用toString()方法,再測試返回值。
var box = {
    toString : function () {
        return '123';           //可以改成return 'Lee'查看效果
    }
};
alert(isNaN(box));              //false
  • 有3個函數可以把非數值轉換爲數值:Number()、parseInt()和parseFloat()

    • Number()函數是轉型函數,可以用於任何數據類型

      alert(Number(true));        //1,Boolean類型的true和false分別轉換成1和0
      alert(Number(25));          //25,數值型直接返回
      alert(Number(null));         //0,空對象返回0
      alert(Number(undefined));   //NaN,undefined返回NaN
      
    • 另外兩個則專門用於把字符串轉成數值

  • 字符串轉換,應該遵循一下規則:

    • 1.只包含數值的字符串,會直接轉成成十進制數值,如果包含前導0,即自動去掉

      alert(Number('456'));          //456
      alert(Number('070'));          //70
      
    • 2.只包含浮點數值的字符串,會直接轉成浮點數值,如果包含前導和後導0,即自動去掉

      alert(Number('08.90'));         //8.9
    • 3.如果字符串是空,那麼直接轉成0

      alert(Number(''));              //0
    • 4.如果不是以上三種字符串類型,則返回NaN

      alert('Lee123');               //NaN
    • 5.如果是對象,首先會調用valueOf()方法,然後確定返回值是否能夠轉換成數值。如果轉換的結果是NaN,則基於這個返回值再調用toString()方法,再測試返回值

      var box = {
      toString : function () {
          return '123';           //可以改成return 'Lee'查看效果
      }
      };
      alert(Number(box));         //123
      
  • 由於Number()函數在轉換字符串時比較複雜且不夠合理,因此在處理整數的時候更常用的是parseInt()。

    • parseInt() 只能轉換字符串至數值
alert(parsetInt('456Lee'));      //456,會返回整數部分
alert(parsetInt('Lee456Lee'));   //NaN,如果第一個不是數值,就返回NaN
alert(parseInt('12Lee56Lee'));    //12,從第一數值開始取,到最後一個連續數值結束
alert(parseInt('56.12'));         //56,小數點不是數值,會被去掉
alert(parseInt(''));              //NaN,空返回NaN
  • parseInt()除了能夠識別十進制數值,也可以識別八進制和十六進制
alert(parseInt('0xA'));         //10,十六進制
alert(parseInt('070'));         //56,八進制
alert(parseInt('0xALee'));      //100,十六進制,Lee被自動過濾掉
  • ECMAScript爲parseInt()提供了第二個參數,用於解決各種進制的轉換。
alert(parseInt('0xAF'));        //175,十六進制
alert(parseInt('AF',16));       //175,第二參數指定十六進制,可以去掉0x前導
alert(parseInt('AF'));          //NaN,理所當然
alert(parseInt('101010101',2)); //314,二進制轉換
alert(parseInt('70',8))         //56,八進制轉換
  • parseFloat()是用於浮點數值轉換的,和parseInt()一樣,從第一位解析到非浮點數值位置
alert(parseFloat('123Lee'));        //123,去掉不是別的部分
alert(parseFloat('0xA'));           //0,不認十六進制
alert(parseFloat('123.4.5'));       //123.4,只認一個小數點
alert(parseFloat('0123.400'));      //123.4,去掉前後導
alert(parseFloat('1.234e7'));       //12340000,把科學技術法轉成普通數值

六.String類型

  • String類型用於表示由零或多個16位Unicode字符組成的字符序列,即字符串。字符串可以由雙引號(“)或單引號(‘)表示

PS:在某些其他語言(PHP)中,單引號和雙引號表示的字符串解析方式不同,而ECMAScript中,這兩種表示方法沒有任何區別。但要記住,必須成對出現,不能穿插使用,否則會出錯。

  • String類型包含了一些特殊的字符字面量,也叫轉義序列
字面量 含義
\n 換行
\t 製表
\b 空格
\r 回車
\f 進紙
\ 斜槓
\’ 單引號
\” 雙引號
\xnn 以十六進制代碼nn表示的一個字符(0~F)。例:\x41
\unnn 以十六進制代碼nnn表示的一個Unicode字符(0~F)。例:\u03a3
  • ECMAScript中的字符串是不可變的,

    • 字符串一旦創建,它們的值就不能改變
    • 要改變某個變量保存的字符串,首先要銷燬原來的字符串,然後再用另一個包含新值的字符串填充該變量
  • toString()方法可以把值轉換成字符串

var box = 11;
var box = true;
alert(typeof box.toString()); // 字符串類型
  • toString()方法一般是不需要傳參的,在數值轉成字符串的時候,可以傳遞進制參數
var box = 10;
alert(box.toString());              //10,默認輸出
alert(box.toString(2));             //1010,二進制輸出
alert(box.toString(8));             //12,八進制輸出
alert(box.toString(10));            //10,十進制輸出
alert(box.toString(16));            //a,十六進制輸出
  • 如果在轉型之前不知道變量是否是null或者undefined的情況下,我們還可以使用轉型函數String(),這個函數能夠將任何類型的值轉換爲字符串
var box = null;
alert(String(box));

PS:如果值有toString()方法,則調用該方法並返回相應的結果;如果是null或者undefined,則返回”null”或”undeinfed”

七.Object類型

  • ECMAScript中的對象其實就是一組數據和功能的集合。
    • 對象可以通過執行new操作符後跟要創建的對象類型的名稱來創建

      var box = new Object();
  • Object()是對象構造,如果對象初始化時不需要傳遞參數,可以不用寫括號,但這種方式我們是不推薦的。

  • Object()裏可以任意傳參,可以傳數值、字符串、布爾值等

var box = new Object(2);            //Object類型,值是2
var age = box + 2;                  //可以和普通變量運算
alert(age);                     //輸出結果,轉型成Number類型了
  • new操作符來創建其他類型的對象
var box = new Number(5);   //new String('Lee')、new Boolean(true)
alert(typeof box);         //Object類型
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章