周道长浅谈鸭式辩型

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()方法,

这个方法内部实现和周道长刚出的绝招应该是一样的.

原文地址:https://www.cnblogs.com/zhoudaozhang/p/4684207.html