isArray方法浅析

今天看到群里有人在讨论Array的isArray方法,学习的同时自己又查了查网上的资料,记录如下:

首先是这个方法的实现原理

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

简单理解就是运用对象原型的toString方法将Array转换为字符串,之后进行比对,下面我们来详细分析下各个部分的组成。
Object.prototype.toString代表这个toString方法本来是对象原型上面的,之后call方法将toString方法中的this转换为参数value,这样传进的参数value(实际上对于此方法应该是个数组[])就可以通过原型的方法来转换为字符串,这样说可能不容易理解,我们接着看下面的call方法解析。

文档中描述:调用一个对象的一个方法,以另一个对象替换当前对象。
Call([thisObj[,arg1[, arg2[, [,.argN]]]]])

thisObj
可选项。将被用作当前对象的对象。

arg1, arg2, , argN
可选项。将被传递方法参数序列。

看下面的例子:

function a(){  
    this.showName = function(){  
        document.write(this.name);  
    }  
}  
  
function Person(arg){  
    this.name = arg;    
};  
  
var a = new a();  
var alex = new Person("alex")  
    
a.showName.call(alex); 

在这段代码中, 函数a中有名为showName的方法,需要有this.name 参数,此时用call方法,传入实例alex.name, 用新对象alex替代this指针。

那么[object Array]是什么呢,它是toString方法返回值中的一种,我们先看下面的例子:

var a={a:1,b:"str"};
console.log(a.toString());

输出的结果是[object Object],a对象的{}相当于new Object(), 定义了一个对象的实例,而toString方法默认返回[object objectname],因此,小写的object是方法返回的值格式中默认的,大写的Object是对象的名字。
上面的[object Array]也是同样的道理,只是a对象此时是数组对象。

这样通过返回Object.prototype.toString.call(value) === '[object Array]'的判断结果就可以实现参数value是否为数组了。

posted @ 2016-08-04 17:35  willian232  阅读(1453)  评论(0编辑  收藏  举报