JS数据结构和类型检测

2017-07-27  本文已影响0人  胡小胖_

编程语言都具有内建的数据结构,JavaScript 也不例外。JavaScript 是一种弱类型或者说动态语言。它不用提前声明变量的类型,在程序运行过程中,类型会被自动确定。这点事非常关键的,可以说JS 灵活,没有这么多限制,但是,这常常是BUG出现的原因所在。
因此,JS 变量的数据类型检测就是十分重要的。
在最新的 ECMAScript 标准中定义了 7 种数据类型:

先来看 6 种基本数据类型:

var message;
typeof message; // "undefined"
var message = null;
typeof message; // "object"
var found = true;
var lost = false;
typeof found; // "boolean"
typeof lost; // "boolean"
var num1 = 5;
var num2 = NaN;
var num3 = +Infinity;
typeof num1; // "number"
typeof num2; // "number"
typeof num3; // "number"
var name = "jack"
typeof name; // "string"
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

上一篇 下一篇

猜你喜欢

热点阅读