JavaScript检测类型的方法:typeof,instanceof运算符,对象的constructor属性,跨原型链调用toString()方法。
1.typeof方法可判断“string”,“number”,“object”,“function”,“boolean”,“undefined”(可用于判断变量是否存在),可是其能力有限的,对于于数组,日期,正则类型只能返回object。
2.instanceof运算符
其要求左边的左边的运算数是一个对象,右边的运算数是是对象类的名字或是构造函数 。如果左边对象是其对象类或是构造函数的实例,则返回true,若不是,则返回false。
[] instanceof Array; // true
new date instanceof Date; //true
[] instanceof RegExp;//false
3.对象的constructor属性
每一个对象都有一个construtor属性,这个属性引用了初始化该类型的构造函数,常用于判断位置对象的类型(前提是该类型需是对象),用typeog方法判断该类型是否是对象,然后利用constructor方法。
// 判断对象是否是数组类型
founction isArray(arr){
return typeof arr=="object"&& arr.constructor == Array;
}
// 判断对象是否是数组类型
function isArray(arr){
return Object.protoytpe.toString.call(arr) === "[object Array]";
}
编写arraysSimilar函数,实现判断传入的两个数组是否相似。具体需求:
1. 数组中的成员类型相同,顺序可以不同。例如[1, true] 与 [false, 2]是相似的。
2. 数组的长度一致。
3. 类型的判断范围,需要区分:String, Boolean, Number, undefined, null, 函数,日期, window.
// 判断是否为相似数组
function arraysSimilar(arr1, arr2){
// 判断是否都为数组
if(!(arr1 instanceof Array) || !(arr2 instanceof Array)){
return false;
}
// 判断数组长度是否相同
if(arr1.length!=arr2.length){
return false;
}
// 创建函数判断数组元素类型
function type_element(ele){
if(ele===null){
return "null";
}
else if(ele===window){
return "window";
}
else if(ele instanceof Date){
return "Date";
}
else if(ele instanceof Array){
return "Array";
}
else return typeof(ele);
}
var e_arr1=[];
var e_arr2=[];
for(var i=0;i<arr1.length;i++){
e_arr1.push(type_element(arr1[i]));
e_arr2.push(type_element(arr2[i]));
}
var a1=e_arr1.sort();
var a2=e_arr2.sort();
for(var i=0;i<arr1.length;i++){
if (a1[i]!=a2[i]){
return false;
}
}
return true;
}