简单分析Object.prototype.toString.call(arr)判断数组类型

简单分析Object.prototype.toString.call(arr)判断数组类型
JavaScript判断数组的方法有:
①Array.isArray(arr)
②arr instanceof Array
③Object.prototype.toString.call(arr)
④arr.constructor === Array 或
arr. __ proto __.constructor===Array

比较难理解的是③,为了能够理解其原理,我进行了逐步打印验证:

let arr = [1,2,3,4];
console.log(Object.prototype);//完整的原型对象
console.log(Object.prototype.toString);//f toString() {[native code]} 代表这是一个函数
console.log(Object.prototype.toString());//[object Object] 执行了上面的函数
//通过Object.prototype.toString 这个函数作为父类,调用父类.call(子类)方法初始化子类
console.log(Object.prototype.toString.call(arr));//[object Array]

console.log(arr.constructor);//f Array() {[native code]}
console.log(arr.__proto__.constructor);//f Array() {[native code]}
console.log(arr.constructor());//[]
console.log(arr.__proto__.constructor());//[]

简单分析Object.prototype.toString.call(arr)判断数组类型_第1张图片

看到Object.prototype.toString可以发现,它是一个函数,用于转为字符串类型,MDN中对其的解释为:

每个对象都有一个 toString()方法,当该对象被表示为一个文本值时,或者一个对象以预期的字符串方式引用时自动调用。默认情况下,toString() 方法被每个 Object对象继承。如果此方法在自定义对象中未被覆盖,toString() 返回 “[object type]”,其中 type 是对象的类型。

可以通过 toString() 来获取每个对象的类型。为了每个对象都能通过 Object.prototype.toString() 来检测,需要以 Function.prototype.call() 或者 Function.prototype.apply() 的形式来调用,传递要检查的对象作为第一个参数,称为 thisArg。

Object.prototype的类型是Object,所以Object.prototype.toString()自然就返回[object Object]了。
这时候.call方法实现构造继承,也就是父类.call(子类), 父类是Object.prototype.toString这个函数(函数也是对象,万物皆对象),子类是arr,这样子类arr就继承了对应的方法,最终得到[Object Array]这个结果。
(后面几个是我顺便测试constructor打印结果的,理解前面的之后这个也就不难理解了)
以上均个人理解,如果有错误的地方欢迎指正

你可能感兴趣的:(JavaScript,javascript)