判断数组的方法,请分别介绍它们之间的区别和优劣

1.Object.prototype.toString.call()

Object.prototype.toString.call(任意类型的值),返回一个字符串 '[object 类型]',这种方法对所有数据类型都能判断,即使是null或者undefined;

Object.prototype.toString.call('An') // "[object String]"
Object.prototype.toString.call(1) // "[object Number]"
Object.prototype.toString.call(Symbol(1)) // "[object Symbol]"
Object.prototype.toString.call(null) // "[object Null]"
Object.prototype.toString.call(undefined) // "[object Undefined]"
Object.prototype.toString.call(function(){}) // "[object Function]"
Object.prototype.toString.call({name: 'An'}) // "[object Object]"

instanceof

instanceof的内部机制是判断目标对象的原型链是不是能找到prototype.
使用instanceof判断一个对象是不是数组,instanceof会判断这个对象的原型链上有没有数组的原型,找到就返回true,否则返回false

[] instanceof Array //true
var x={}
x instanceof Array //false
x.__proto__=Array.prototype
x instanceof Array //true

instanceof 算法机制

    function instance_of(L,R){
        var O=R.prototype;
        L=L.__proto__;
        while(true){
            if(L===null){
                return false;
            }
            if(O===L){
                return true;
            }
            L=L.__proto__;
        }
    }

3.Array.isArray()

  • 功能主要是判读是否是数组
    Array.isArray()与Object.prototype.toString.call()
    Array.isArray()是es6新增的语法,当不存在Array.isArray()方法时,可以用Object.prototype.toString.call()实现,Array.isArray()的polyfill 通常如下
if(!Array.isArray){
  Array.isArray=function(arr){
  return Object.prototype.toString.call(arr)==='[object Array]';
  }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    余生动听阅读 11,006评论 0 11
  • 彩排完,天已黑
    刘凯书法阅读 4,548评论 1 3
  • 表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...
    Persistenc_6aea阅读 130,654评论 2 7

友情链接更多精彩内容