編程語言都具有內建的數(shù)據(jù)結構胡岔,JavaScript 也不例外摄乒。JavaScript 是一種弱類型或者說動態(tài)語言漓穿。它不用提前聲明變量的類型嗤军,在程序運行過程中,類型會被自動確定晃危。這點事非常關鍵的叙赚,可以說JS 靈活,沒有這么多限制,但是震叮,這常常是BUG出現(xiàn)的原因所在沿量。
因此,JS 變量的數(shù)據(jù)類型檢測就是十分重要的冤荆。
在最新的 ECMAScript 標準中定義了 7 種數(shù)據(jù)類型:
- 6 種基本數(shù)據(jù)類型:Boolean朴则、 Null、 Undefined钓简、 Number乌妒、 String、 Symbol(ECMAScript 6 新定義)
- 1 種復雜數(shù)據(jù)類型:Object
先來看 6 種基本數(shù)據(jù)類型:
- Undefined
Undefined 類型只有一個值外邓,就是特殊的 Undefined撤蚊。一個沒有被賦值的變量會有個默認值 undefined。
var message;
typeof message; // "undefined"
- Null
Null 類型是第一個只有只一個值得數(shù)據(jù)類型损话,這是特殊值就是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
根據(jù) ECMAScript 標準,JavaScript 中只有一種數(shù)字類型:基于 IEEE 754 標準的雙精度 64 位二進制格式的值(-(263 -1) 到 263 -1)拧烦。它并沒有為整數(shù)給出一種特定的類型忘闻。除了能夠表示浮點數(shù)外,還有一些帶符號的值:+Infinity恋博,-Infinity 和 NaN (非數(shù)值齐佳,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"
復雜數(shù)據(jù)類型:
ECMAScript 中的對象就是一組數(shù)據(jù)和功能的集合硅蹦。
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"
因此,可以看出隧土,我們在判斷基本數(shù)據(jù)類型時提针,可以用 typeof 檢測出來的,但是對于復雜的數(shù)據(jù)類型 typeof 就有其局限性了曹傀,它對于復雜數(shù)據(jù)類型總是返回 “object”辐脖。
在對復雜數(shù)據(jù)類型的檢測中,我們就應該用其他方法來判斷皆愉,這就是 instanceof/constructor嗜价。
使用 instanceof/constructor 可以檢測數(shù)組和正則表達式艇抠。
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;
嚴謹?shù)呐袛喾椒ǎ?/p>
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' &&
//判斷l(xiāng)ength屬性是否是可枚舉的 對于數(shù)組 將得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