数组类型检测
1. instanceof
var arr = new Array(); alert(arr instanceof Array); //true
2. Object的constructor属性
var arr = new Array(); alert( arr.constructor==Array);//true
注:前两种方法在跨frame构建时返回false,因为每个iframe都有一套自己的执行环境,跨frame实例化的对象彼此是不共享原型链的。
var iframe=document.createElement("iframe"); document.body.appendChild(iframe); xArray=window.frames[window.frames.lenght-1].Array; var arr=new xArray(1,2,3); alert(arr instanceof Array); alert(arr.constructor==Array);
3. 数组对象的特性
例如有slice、splice方法
function isArray(arr){ return arr && typeof arr=='object'&& typeof arr.length=='number'&& typeof arr.splice=='function'&& !arr.propertyIsEnumerable('length'); }
但当arr对象也有length,splice属性,且length不可枚举,也会返回true.
所以前三种都不完美,第四种是目前完美的
4. Object.prototype.toString
ecmascript3中:在toString方法被调用时,会执行下面的操作步骤:
1. 获取this对象的[[Class]]属性的值.
2. 计算出三个字符串"[object ", 第一步的操作结果Result(1), 以及 "]"连接后的新字符串.
3. 返回第二步的操作结果Result(2).
this对象的[[class]]属性:Boolean,Number,String,Object,Function,Array,Date,RegExp,Math,Error
ecmascript5中,多个两步:
1. if this的值为null,返回[object Null]
2. if this值为Undefined,返回[object Undefined]
3. ecmascript3的3步
this对象的[[class]]属性多了两个:Arguments, Json
var arr=new Array(); alert(Object.prototype.toString.call(arr)=='[object Array]');