数组类型检测

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]');

 

posted @ 2015-08-22 09:41  半夏微凉ysy  阅读(138)  评论(0编辑  收藏  举报