javascript的toString深入探究

toString()方法是所有对象都有的一个方法,无论是字符串,数组,对象,都可以调用这个方法,但是,事实上,他们调用的并不是同一个函数哦! 看下面的代码:

var str = '123';

console.log(Object.prototype.toString===str.toString);    //false
console.log(String.prototype.toString===str.toString);    //true
console.log(Object.prototype.toString.call(str));         //'[object String]'
console.log(str.toString());                              //'123'

可以看到,这里的str.toString是调用了String.protype.toString方法,而不是Object.prototype.toString方法

再看下面这段代码:

var arr = [1,2,3];

console.log(Object.prototype.toString===arr.toString);    //false
console.log(Array.prototype.toString===arr.toString);     //true
console.log(Object.prototype.toString.call(arr));         //'[object Array]'
console.log(arr.toString());                              //'1,2,3'

可以看到,这里的arr.toString是调用了Array.prototype.toString方法,而不是Object.prototype.toString方法

var obj = {name:'bunny'};

console.log(Object.prototype.toString===obj.toString);    //true
console.log(Object.prototype.toString.call(obj));         //'[object Object]'
console.log(obj.toString());                              //'[object Object]'                         

可以看到,对于obj来说,它调用的toString方法就是Object.prototype.toString方法.

同样,数值类型,还有函数,都类似于这样...就不再举例了...

另外,null没有toString方法:

var nu = null;
console.log(nu.toString);   //报错

但是它可以调用其它的toString方法:

var nu=null;
Object.prototype.toString.call(nu)   //'[object Null]'

所以我们可以知道,在Array的原型,String的原型上,以及Number的原型,Function的原型上,都有自己的toString方法,不同类型的对象,会调用不同的toString方法,而不会去调用Object.prototype.toString.

当时,我们可以通过call函数来调用Object.prototype.toString函数,用这个方法,可以精确的获取对象的类型:

'[object Object]'
'[object Array]'
'[object String]'
'[object Number]'
'[object Function]'
'[object Undefined]'
'[object Null]'

比如一个判断对象是否为数组的函数:

  if(Array.isArray===undefined){
    Array.isArray = function(obj){
      return Object.prototype.toString.call(obj) === '[object Array]'
    }
  }
原文地址:https://www.cnblogs.com/liulangmao/p/4218327.html