js 判斷數據類型,以及undefined和null的理解


變量聲明和賦值的幾種狀態

  • 未聲明
  • 已聲明,未賦值
  • 未聲明,卻賦值 (不正常,會成為全局變量。嚴格模式下拋出ReferenceError錯誤)
  • 已聲明,再賦值 (正常)

數據類型的分類

  • 基本數據類型
    - Boolean
    - Number
    - String
    - Undefined
    - Null
  • 復雜數據類型
    - Object(本質上是由一組無序的名值對組成,引用類型)

typeof和數據類型

  • "undefined"表示這個值未定義
  • "boolean"表示這個值是布爾值
  • "string"表示這個值是字符串
  • "number"表示這個值是數值
  • "object"表示這個值是對象或者null
  • "function"表示這個值是函數
    小結typeof null 返回 "object",可以認為null是空對象;函數在ECMAScript中是對象,不是一種數據類型,但也是一種特殊存在,可以通過typeof進行區分

未聲明和未賦值狀態下的undefined值

var message;      // 這個變量聲明后默認取得 undefined 值
// 下面這個變量沒有聲明
// var age;
alert(message);      // "undefined"
alert(age);          // 產生錯誤

小結: 對於未聲明的變量執行alert會報錯(因為對於未聲明的變量,只能執行typeof檢測數據類型這一項操作。當然delete也行,但沒有意義,而且嚴格模式也報錯)


var message;      // 這個變量聲明后默認取得 undefined 值
// 下面這個變量沒有聲明
// var age;
alert(typeof message);      // "undefined"
alert(typeof age);          // "undefined"

小結: 對於未聲明的變量 和 未賦值的變量 執行 typeof 操作都返回undefined值


判斷數據類型的幾種方式

typeof

  • 可以判斷的類型: number、boolean、symbol、string、object、undefined、function
  • 優點: 可以區分function和object
  • 缺點:
    - type null 返回 object,可以理解為空對象,但其實我們想要的是Null
    - 數組(Array),日期(Date),正則(RegExp)都會返回object,但其實我們想要更加詳細的區分

instanceof

  • 功能: 用於判斷兩個對象是否屬於實例關系(可以借此判斷數據類型)
  • 缺點: 無法判斷某一對象具體屬於哪種類型
  [] instanceof Array; // 返回true
  [] instanceof Object;// 返回true

constructor

  • 功能: constructor是原型prototype的一個屬性,可以通過一個對象的constructor屬性比對對象的數據類型
  • 缺點: null 和 undefined 沒有constructor
   false.constructor == Boolean;           // true
   "123".constructor == String;            // true
   new Number(123).constructor == Number;  // true
   [].constructor == Array;                // true
   new Function().constructor == Function; // true
   new Date().constructor == Date;         // true
   document.constructor == HTMLDocument;   // true
   window.constructor == Window;           // true
   new Error().constructor == Error;       // true

Object.prototype.toString.call()

  • 功能: toString() 是 Object 的原型方法,調用該方法,默認返回當前對象的 [[Class]]
   Object.prototype.toString.call('123') ;   // [object String]
   Object.prototype.toString.call(123) ;     // [object Number]
   Object.prototype.toString.call(false) ;   // [object Boolean]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM