Javascript中的鸭式辩型(duck-type):会游泳,会嘎嘎叫,有两条腿的就是鸭子,比如你。
废话少说,直接上一段代码
var iframe=document.createElement("iframe");
document.body.appendChild(iframe);
var xArray=window.frames[window.frames.length-1].Array;
var arr=new xArray(1,2,3);
alert(arr instanceof Array); //false
alert(arr.constructor===Array); //false
what gui? arr 明明是一个数组,为什么两种方式检测都弹出false?
谷歌一下,哦,原来跨frame实例化的对象不共享原型链.
那么咱用鸭式辩型的思想来造一个方法isShuzu来看看他是不是数组。
废话少说,上代码(代码说:我好无辜啊啊啊)。
function isShuzu(object){
return object!=null&&typeof object=="object"&&
'splice' in object&&'join' in object;
}
alert(isShuzu(arr)); //true
因为arr有数组特有的方法splice和join,又也是一个object,
那么他就是一个数组,弹出了true。不明觉厉啊!!
但是,下面我们来造一个名字叫 “鸡" 的对象。
var ji={ name:"鸡" , splice:"我也有splice" , join:"我也有join" ,speak:"我是不是数组呢?"};
alert(isShuzu(ji)); //true
因为 ji 有数组特有的方法splice和join,又也是一个object,
那么他就是一个数组,弹出了true。额,鸭式辩型傻傻分不清真假数组了。
下面,周道长使出绝招,上代码
alert( Object.prototype.toString.call(ji) === '[object Array]' ); //false
哈哈哈,周道长一眼就看出 ji 不是数组。
总结一下,在Javascript中判断对象是不是数组推荐Array.isArray()方法,
这个方法内部实现和周道长刚出的绝招应该是一样的.