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