編程語言都具有內建的數據結構,JavaScript 也不例外。JavaScript 是一種弱類型或者說動態語言。它不用提前聲明變量的類型,在程序運行過程中,類型會被自動確定。這點事非常關鍵的,可以說JS 靈活,沒有這么多限制,但是,這常常是BUG出現的原因所在。
因此,JS 變量的數據類型檢測就是十分重要的。
在最新的 ECMAScript 標準中定義了 7 種數據類型:
- 6 種基本數據類型:Boolean、 Null、 Undefined、 Number、 String、 Symbol(ECMAScript 6 新定義)
- 1 種復雜數據類型:Object
先來看 6 種基本數據類型:
- Undefined
Undefined 類型只有一個值,就是特殊的 Undefined。一個沒有被賦值的變量會有個默認值 undefined。
var message;
typeof message; // "undefined"
- Null
Null 類型是第一個只有只一個值得數據類型,這是特殊值就是null。null值表示一個空對象指針。
var message = null;
typeof message; // "object"
- Boolean
Boolean 表示一個邏輯實體,可以有兩個值:true 和 false。
var found = true;
var lost = false;
typeof found; // "boolean"
typeof lost; // "boolean"
- Number
根據 ECMAScript 標準,JavaScript 中只有一種數字類型:基于 IEEE 754 標準的雙精度 64 位二進制格式的值(-(263 -1) 到 263 -1)。它并沒有為整數給出一種特定的類型。除了能夠表示浮點數外,還有一些帶符號的值:+Infinity,-Infinity 和 NaN (非數值,Not-a-Number)。
var num1 = 5;
var num2 = NaN;
var num3 = +Infinity;
typeof num1; // "number"
typeof num2; // "number"
typeof num3; // "number"
- String
String 類型用于表示由零或多個 16 位 Unicode 字符組成的字符序列,即字符串。
var name = "jack"
typeof name; // "string"
- Symbol
符號(Symbols)是ECMAScript 第6版新定義的。符號類型是唯一的并且是不可修改的, 并且也可以用來作為Object的key的值。
var sym = Symbol("foo");
typeof sym; // "symbol"
復雜數據類型:
ECMAScript 中的對象就是一組數據和功能的集合。
var arr = [1, 2, 3];
var o = new Object();
var reg = /\d/g;
var a = {};
typeof arr; // "object"
typeof o; // "object"
typeof reg; // "object"
typeof a; // "object"
因此,可以看出,我們在判斷基本數據類型時,可以用 typeof 檢測出來的,但是對于復雜的數據類型 typeof 就有其局限性了,它對于復雜數據類型總是返回 “object”。
在對復雜數據類型的檢測中,我們就應該用其他方法來判斷,這就是 instanceof/constructor。
使用 instanceof/constructor 可以檢測數組和正則表達式。
var arr = [1, 2, 3];
var reg = /\d/g;
arr instanceof Array; // true;
reg instanceof RegExp; // true;
arr.constructor == Array; // true;
reg.constructor == RegExp; // true;
嚴謹的判斷方法:
function isArray(object){
return object && typeof object==='object' &&
Array == object.constructor;
}
但是,instanceof/constructor 也有其局限性:
被判斷的 Array 必須在當前頁面聲明!
而在父頁面框架中引用子頁面,然后在子頁面中聲明一個 array,并賦值給父頁面變量,這時檢測返回值就是false。
因此,還需要更好的方法來進行檢測,查閱書籍和網上資料,還用兩種方法:
function isArray(object){
return object && typeof object==='object' &&
typeof object.length==='number' &&
typeof object.splice==='function' &&
//判斷length屬性是否是可枚舉的 對于數組 將得false
!(object.propertyIsEnumerable('length'));
}
function isArray(o) {
return Object.prototype.toString.call(o) === '[object Array]';
}
參考資料
《JavaScript 高級程序設計》(第三版)
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Data_structures