编程语言都具有内建的数据结构,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
网友评论