變量聲明和賦值的幾種狀態
- 未聲明
- 已聲明,未賦值
- 未聲明,卻賦值 (不正常,會成為全局變量。嚴格模式下拋出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]