今天看到群里有人在讨论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是否为数组了。