为什么Array.isArray算法是ES5执行类型检查?

时间:2016-03-16 15:51:53

标签: javascript arrays algorithm types ecmascript-5

在SO和Google中发现的每个问题都是关于检查某个对象是否是一个数组最有可能最终得到此解决方案

function isArray(obj) {
    return Object.prototype.toString.call(obj) === '[object Array]'
}

所有其他选择都有误报或不完全支持。

来源:

http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/

How to detect if a variable is an array

当我阅读15.4.3.2部分中的ES5规范时,发现所描述的函数Array.isArray的算法在IE9 +,Chrome 5 +,Firefox 4 +,Opera 10.5+和Safari 5+中执行相同的检查,但是这个算法有两个额外的步骤。

function isArray(obj) {
    if (typeof obj !== 'object') {
        return false;
    }
    // Here they check only against the [[Class]] part 
    // and of course they don't have to use the ugly Object.prototype.toString.call
    // but this is pretty much the same comparison
    if (Object.prototype.toString.call(obj) === '[object Array]') {
        return true;
    }
    return false;
}

现在我的问题是为什么他们先检查类型?是否存在特殊情况,对于仍具有[[Array]]内部类的对象,它将返回false?

1 个答案:

答案 0 :(得分:3)

让我们看一下算法:

  
      
  1. 如果Type(arg)不是Object,则返回false。
  2.   
  3. 如果arg的[[Class]]内部属性的值为" Array",则返回true。
  4.   
  5. 返回false。
  6.   

该算法包含此检查,因为非对象的值不具有internal properties。但由于该算法访问了值的内部属性[[Class]],因此必须声明该值是一个对象。

对于polyfills来说,这项检查确实是不必要的,因为它们无法访问该值的任何属性。但是,它确实使polyfill更接近规范。