1、toString()方法和Object.prototype.toString.call()方法对比
var arr = [1,2];
//直接对一个数组调用toString()
arr.toString(); // "1,2"
//通过call指定arr数组为Object.prototype对象中的toString方法的上下文
Object.prototype.toString.call(arr); //"[object Array]"
Object.prototype.toString()本身是允许被修改的,数组的toString()方法实际上是Object.prototype.toString()重写后的方法,并不是Object.prototype中的toString(),Object.prototype.toString()方法使用来判断数据类型的,如:
Object.prototype.toString.call(arr); //"[object Array]" 判断是否是数组
而重写后的toString()方法可以把数组转换为字符串,如:
[1,2].toString(); // "1,2"
2、事实上只有Object.prototype上的toString才能用来进行复杂数据类型的判断,而数组的toString()方法是重写了Object.prototype的toString()方法,所以当使用arr.toString()时,不能进行复杂数据类型的判断,因为它调用的是Array.prototype.toString,虽然Array也继承自Object,但此时数组的toString()方法是js在Array.prototype上重写了toString(也就是为我们提供的现成的将数组转换为字符串的方法),而我们通过toString.call(arr)实际上是通过原型链调用了Object.prototype.toString,当然也可以直接使用 arr.toString()直接调用。如:
var arr = [1,2];
console.log(Object.prototype.toString.call(arr)); //[object Array]
console.log(Array.prototype.toString.call(arr)); "1,2"
3、原型链——js中的对象都继承自Object,所以当在某个对象上调用一个方法时,会先在该对象上进行查找,如果没找到则会进入对象的原型(也就是.prototype)进行查找,如果没找到,同样的也会进入对象的原型的原型进行查找,直到找到或者进入原型链的顶端Object.prototype才会停止。
网友评论