1. 程式人生 > >JS的進階之路(一)

JS的進階之路(一)

JS中的資料型別
 JS中基本資料型別分為原始資料型別(5種)和物件型別(1種)。對應的分別是 String, Number, Boolean ,Null ,Undefined 和object。
  (1)  object型別包含一系列的物件型別(Function,Array,Date等,它們既是JS內建的物件,也是一個"類型別",即用來構造一系列該型別的例項)
  (2)  如果對undefined和null執行undefined==null操作會返回true(非嚴格等於),個人理解二者的主要區別是undefined是表示原始資料型別的變數沒有定義型別,而null表示一個變數指向一個空物件,即該變數沒有指向一個具體的引用資料型別(這個引用資料型別借鑑java中的類的概念)

  (3)   其中任意一個用var 宣告的沒有初始值的變數的預設型別都是undefined ,其中null型別的預設值只有一個那就是null,注意對null執行typeof操作時,其對應出現的型別是object.如果要定義一個變數,作為將來某個object型別變數的引用,則變數初始值最好設為null(畢竟將來是用來保留一個物件的引用)例如:

           var pointer = null;
           pointer= new Person();

 (4)object型別中包含Function,Date,Array等一些js內建的物件,object型別在程式中的具體體現形式是Object(Object是object型別的一個建構函式,也可以理解成object的一個具體例項)在犀牛書中有提到Function Date,Array是object型別的物件,但同時又是object型別的子型別(既是物件又是型別,真尼瑪會玩)。很明顯的一個證明:

      var a = new Date()
      Object.prototype.toString.apply(a)

返回的結果是"[object,Date]"。

JS中的型別檢測

 在js中的常用的型別檢測方式有typeof ,instanceof ,Object.prototype.toString.apply()constructor duck,由於constructor和duck的檢測方式比較靈活,後續再詳細總結。
        1.typeof

經常被用作對原始資料型別的檢測,但當對null和一些物件型別執行typeof操作時會返回object(打個比方,就像我問你前面走過來那個人是男人還是女人,你回答我是人,那不等於沒說嗎,所以當對物件操作時果斷放棄typeof方式)

        2.instanceof

 instanceof的用法大有對typeof補充之意,它的長處就是判斷某個物件是某個建構函式的例項,但注意在 不同的window和iframe之間會失效

        3.Object.prototype.toString.apply() (此處apply可以替換成call)

          這種方法用起來了很爽,因為它可以把整個之前的繼承關係都給你console出來,但是缺點是在IE6,7,8遇到null和undefined失效,會返回"[object,Object]"