js數據類型

JS中有6種數據類型:Undefined、Boolean、Number、String,Function和Object。JS中不支持任何建立自定義類型的機制,而全部值最終都將是這6種數據類型。其數據類型的動態性特色足以表示全部數據。JS提供typeof操做符來檢測變量的數據類型。javascript

                  alert(typeof undefined); //undefined;
                                    alert(typeof null); //object;
                                    alert (typeof NaN); //number;
                                    alert(undefined==null); //true;
                                    alert(NaN==NaN); //false;
                                    alert(isNaN(NaN));//true;
java

一.Undefinedjson

  undefined是一個表示"無"的原始值,轉爲數值時爲NaN;數組

  undefined表示"缺乏值",就是此處應該有一個值,可是尚未定義。典型用法是:函數

 

  (1)變量被聲明瞭,但沒有賦值時,就等於undefined。
  (2) 調用函數時,應該提供的參數沒有提供,該參數等於undefined。
  (3)對象沒有賦值的屬性,該屬性的值爲undefined。
  (4)函數沒有返回值時,默認返回undefined。
  
var str;
alert(str);//undefined--變量被聲明瞭,但沒有賦值時
function move(obj){
      var a=obj;
      alert(a);
} 
move(); //undefined--調用函數時,應該提供的參數沒有提供
var json={"a":"1"}
alert(json.b); //undefined--對象沒有賦值的屬性

二.Booleanspa

  boolean 數據類型 boolean 變量存儲爲 8 位(1 個字節)的數值形式,但只能是 True 或是 False。prototype

  alert(1&&2)//前面爲真執行後面--2指針

  alert(0||2)//前面爲假執行後面--2code

  什麼是真什麼是假:orm

    真[true]:非0的數字;非空的字符串;非空對象;true;
           假[fasle]: 0;空字符串;空對象; false; undefined;NaN;

  javascript中建立boolean對象的方法

    使用關鍵詞 new 來定義 Boolean 對象。下面的代碼定義了一個名爲 myBoolean 的邏輯對象:
    var myBoolean = new Boolean();
三.Number
  var  item =55;   //整數
    除了以十進制表示外,整數還能夠經過八進制(以8爲基數)或十六進制(以16爲基數)的字面值來表示。其中,八進制字面值的第一位必須是零(0),而後是八進制數字序列(0-7)。若是字面值中的數值超出了範圍,那麼前導零將被忽略,後面的數值將被當作十進制數值解析。請看下面的例子:
    var color1=070;   //八進制的56
    var color2=079;   //無效的八進制數值——解析爲79
    var color3=08;    //無效的八進制數值——解析爲8
    十六進制字面值的前兩位必須是0x,後跟任何十六進制數字(0-9及A-F)。其中,字面A-F能夠大寫,也能夠小寫。以下面的例子所示:
    var num1=0xA;    //十六進制的10
    var num2=0x1f;    //十六進制的31
 
    所謂浮點數值,就是該數值中必須包含一個小數點,而且小數點後面必須至少有一位數字。雖然小數點前面能夠沒有整數,但咱們不推薦這種寫法。
    var floatNum1=1.1;
  var floatNum2=0.1;
    var floatNum3=.1;  //有效,但不推薦
 
    針對NaN的這兩個特色,ECMAScript定義了isNaN()函數。這個函數接受一個參數,該參數能夠是任何類型,而函數會幫咱們肯定這個參數是否「不是數值」。isNaN()在接收到一個值以後,會嘗試將這個值轉換爲數值。某些不是數值的值會直接轉換爲數值,例如字符串「10」或「Boolean」值。而任何不能轉換爲數值的值都會致使這個函數返回true。請看下面的例子:
    alert(isNaN(NaN)) ; //true
    alert(isNaN(10));   //false(10是一個數值)
    alert(isNaN(true));  //false (能夠被轉換成數值1)
  
  有3個函數能夠把非數值轉換爲數值:Number()、parseInt()和parseFloat()。第一個函數,即轉型函數Number()能夠用於任何數據類型,而另兩個函數則專門用於把字符串轉換成數值。這3個函數對於一樣的輸入會有返回不一樣的結果。
  Number()函數的轉換規則以下。
   0.  若是是Boolean值,true和false將分別被轉換成1和0.
  1. 若是是數字值,只是簡單的傳入和返回。
  2. 若是是null值,返回0。
  3. 若是是undefined,返回NaN。
  4. a.若是字符串中只包含數字(包括前面帶正號或負號的狀況),則將其轉換爲十進制數值,即「1」會變成1,「123」會變成123,而「011」會變成11(注意:前導的零被忽略了)   
     b.若是字符串中包含有效的浮點格式,如「1.1」,則將其轉換爲對應的浮點數值(一樣,也會忽略前導零);
     c.若是字符串中包含有效的十六進制格式,例如:「0xf」,則將其轉換爲相同大小的十進制整數數值;
     d.若是字符串是空的(不包含任何字符),則將其轉換爲0;
     e.若是字符串中包含除上述格式以外的字符,則將其轉換爲NaN。

     var num1=parseInt("1234blue");   //1234
       var num1=parseInt("");   //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 (按十六進制解析)
四.String
   數值,布爾值,對象和字符串值(每一個字符串也都有一個toString()方法,該方法返回值返回串的一個副本)都有toString()方法。但null和undefined值沒有這個方法。
    多數狀況下,調用toString方法沒必要傳遞參數。可是,在調用數值的toString()方法時,能夠傳遞一個參數:輸出數值的基數。默認狀況下,toString()方法以十進制格式返回數值的字符串表示。而經過傳遞基數,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"
    若是值有toString()方法,則調用該方法(沒有參數)並返回相應的結果;
    若是值是null,則返回"null";
    若是值是undefined,則返回「undefined」
    下面再看幾個例子:
     var value1=10;
     var value2=true;
     var value3=null;
     alert(String(value1));    //"10"
     alert(String(value2));    //"true"
     alert(String(value3));    //"null"
     alert(String(value4));    //"undefined"
    這裏前後轉換了4個值:數值、布爾值、null和undefined。數值和布爾值的轉換結果與調用toString()方法獲得的結果相同。由於null和undefined沒有toString()方法,因此String()函數就返回了這兩個值的字面量。
五.Object 
ECMAScript中的對象是可變的鍵控集合(即一組數據和功能的集合)。它將不少值聚合在一塊兒,可經過名字訪問這些值。對象也可看作屬性的容器,每一個屬性都是一個名/值對。屬性的名字能夠是包括空字符串在內的任意字符串。屬性值能夠是除undefined值以外的任何值。對象最多見的用法是建立(create)、設置(set)、查找(query)、刪除(delete)、檢測(test)和枚舉(enumerate)他的屬性。
    1、屬性類型
    ECMA-262第5版在定義只有內部採用的特性時,描述了屬性的各類特徵。爲了表示特性時內部值,該規範把它們放在了兩對方括號中,例如:[[Enumerable]]。ECMAScript對象中有兩種屬性:數據屬性和訪問器屬性。
   1.數據屬性
    數據屬性包含一個數據值的位置。在這個位置能夠讀取和寫入值。數據屬性有4個描述其行爲的特性。
     a.[[Configurable]]:表示可否經過delete刪除屬性從而從新定義屬性,可否修改屬性的特性,或者可否把屬性修改成訪問器屬性。這個特性默認值爲true。
     b.[[Enumerable]]:表示可否經過for-in循環返回屬性。這個特性默認值爲true。
     c.[[Writable]]:表示可否修改屬性的值。這個特性默認值爲true。
     d.[[Value]]:包含這個屬性的數據值。讀取屬性值的時候,從這個位置讀;寫入屬性值的時候,把新值保存在這個位置。這個特性的默認值爲undefined。
    2.訪問器屬性:
     a.[[Configurable]]:表示可否經過delete刪除屬性從而從新定義屬性,可否修改屬性的特性,或者可否把屬性修改成數據屬性。對於直接在對象上定義的屬性,這個特性的默認值爲true.
     b.[[Enumerable]]:表示可否經過for-in循環返回屬性。對於直接在對象上定義的屬性,這個特性的默認值爲true。
     c.[[Get]]:在讀取屬性時調用的函數。默認值爲undefined。
     d.[[Set]]:在寫入屬性時調用的函數。默認值爲undefined。

   2、建立對象
    1.經過new建立對象
    new 運算符建立並初始化一個新對象。關鍵字new後跟隨一個函數調用。這裏的函數稱作構造函數,構造函數用以初始化一個新建立的對象。JavaScript語言核心中的原始類型都包含內置構造函數。例如:

       

除了這些內置構造函數,用自定義構造函數來初始化新對象也是很是常見的。

    2.對象字面量
    建立對象最簡單的方式就是在JavaScript代碼中使用對象字面量。對象字面量是由若干名/值對組成的映射表,名/值對中間用冒號分隔,名/值對之間用逗號分隔,整個映射表用花括號括起來,結構爲:{屬性名1:屬性值1,屬性名2:屬性值2,……}。屬性名能夠是JavaScript標識符也能夠是字符串字面量(包括空字符串)。屬性的值能夠是任意類型的JavaScript表達式,表達式的值(能夠是原始值也能夠是對象值)就是這個屬性的值。請看示例:

       

    3.原型
    咱們建立的每一個對象都有一個prototype(原型)屬性,這個屬性是一個指針,指向一個對象,而這個對象的用途是包含能夠由特定類型的全部實例共享的屬性和方法。若是按照字面意思來理解,那麼prototype就是經過調用構造函數而建立的那個對象實例的原型對象。使用原型對象的好處是可讓全部對象實例共享它所包含的屬性和方法。換句話說,沒必要在構造函數中定義對象實例的信息,而是能夠將這些信息直接添加到原型對象中,請看示例:

        

    在此,咱們將sayName()方法和全部屬性直接添加到了Person的prototype屬性中,構造函數變成了空函數。即便如此,也仍然能夠經過調用構造函數來建立新對象,並且新對象還會具備相同的屬性和方法。但與構造函數不一樣的是,    
  3、基於對象屬性的各類操做
    1.對象屬性的獲取
    訪問對象屬性可使用點表示法和方括號表示法。對於點(.)來講,右側必須是一個以屬性名稱命名的簡單標識符。對於方括號來講([]),方括號內必須是一個計算結果爲字符串的表達式,這個字符串就是屬性的名字。請看示例:

       

    當使用方括號時,咱們說方括號內的表達式必須返回字符串。其實更嚴謹的說,表達式必須返回字符串或返回一個能夠轉換爲字符串的值(這個特色能夠用於處理不少狀況)。由此咱們能夠聯想到數組,這和數組獲取元素的方法極爲類似,其實數組也是對象,只是其屬性名爲數組下標而已。
    2.屬性訪問錯誤
 
       
    可是若是對象不存在,那麼試圖查詢這個不存在的對象的屬性就會報錯。null和undefined值都沒有屬性,所以查詢這些值的屬性會報錯,請看示例:
       

     


    固然,給null和undefined設置屬性也會報類型錯誤。給其餘值設置屬性也不老是成功,有一些屬性時只讀的,不能從新複製,有一些對象不容許新增屬性,但讓人頗感意外的是,這些設置屬性的失敗操做不會報錯:

       

    這是一個歷史遺留問題,這個bug在ECMAScript5的嚴格模式中已經修復。在嚴格模式中,任何失敗的屬性設置操做都會拋出一個類型錯誤異常。

    3.刪除屬性
    delete運算符能夠刪除對象的屬性。它的操做數應當是一個屬性訪問表達式。讓人感到意外的是,delete只是斷開屬性和宿主對象的聯繫,而不會去操做屬性中的屬性。

    delete運算符只能刪除自有屬性,不能刪除繼承屬性(要刪除繼承屬性必須從定義這個屬性的原型對象上刪除它,並且這會影響到全部繼承自這個原型的對象)
    當delete表達式刪除成功或沒有任何反作用(好比刪除不存在的屬性)時,它返回true。若是delete後不是一個屬性訪問表達式,delete一樣返回true:
       
    delete不能刪除那些可配置性爲false的屬性(儘管能夠刪除不可擴展的可配置屬性)。某些內置對象的屬性是不可配置的,好比經過變量聲明和函數聲明建立的全局對象的屬性。在嚴格模式中,刪除一個不可配置屬性會報一個類型錯誤。在非嚴格模式中,這些狀況下的delete操做會返回false:
       

在非嚴格模式中刪除全局對象的可配置屬性時,能夠省略對全局對象的引用,直接在delete操做符後跟隨要刪除的屬性名便可:
       

而後再嚴格模式中,delete後跟隨一個非法的操做數(好比x),則會報一個語法錯誤,所以必須顯式指定對象及其屬性:
       

    4.枚舉屬性
    for-in語句可用來遍歷一個對象中的全部屬性名。該枚舉過程將會列出全部的屬性——包括函數和你可能不關心的原型中的屬性——因此有必要過濾掉那些你不想要的值。最爲經常使用的過濾器是hasOwnProperty方法,以及使用typeof來排除函數:
       
    屬性名出現得順序是不肯定的,所以要對任何可能出現的順序有所準備。若是你想要確保屬性以特定的順序出現,最好的辦法就是徹底避免使用for-in語句,而是建立一個數組,在其中以正確的順序包含屬性名:
       
    經過使用for而不是for-in ,能夠獲得咱們想要的屬性,而不用擔憂可能發掘出原型鏈中的屬性,而且咱們按正確的順序得到了它們的值
 
 
    隱式類型轉化:                    a.除了+號以外(-  * / )的都是隱式類型轉化;                    b.==                                             var a = '12';                                            var b = 12;                                            alert(a == b);//true;          +的做用:                    a>.字符串拼接:                    b>.還能夠作計算;        顯式類型轉化[強制類型轉化]:                    a.parseInt(n,index);//取整數;碰到不是數字的就不在日後看了;index指進制數,默認十進制;                                            var a = '12asd353453';                                            var c = parseInt(a,10);                                            alert(c);//12;                                                                                        var num = 123;                                            alert(parseInt(num/60) + '分' + num%60 + '秒');                    b.parseFloat(n,index);//取小數,碰到不是數字的就不在繼續轉化;                                                                c.Number();    字符串裏面包含非數字的就轉化不了(NaN);                                            var str = '12asd43543';                                            var num = Number(str);                                            alert(num);//NaN   =: 賦值:右邊的賦值給左邊的;        ==: 比較: 會作隱式類型轉換,若是數據類型不相等,會先轉換數據類型以後在進行比較;        ===:嚴格的比較,若是數據類型不相等,那麼就不相等;
相關文章
相關標籤/搜索