谈到“toString”,大多都不陌生,有人说是对象转为字符串的,也有人总会把它和valueOf作区分和比较。在本文中,只是简单说说“toString”的用法,不涉及valueOf的部分。
首先,我们先要了解的是:
toString在系统对象下面都是自带的,自己写的对象都是通过原型链找Object下面的。
我们知道hasOwnProperty是挂载在Object.property下面的,所以它是共享的,无论是系统对象还是自定义的对象,都可以通过原型继承使用hasOwnProperty方法,而只有constructor在当前对象下的原型下面才会有。那么toString究竟在哪里呢? 具体例子如下:
由此可以看出,不管是系统对象还是自己写的面向对象,都可以找到toString,但是系统对象下arr.toString == Object.prototype.toString为false,自己写的对象a1.toString == Object.prototype.toString为true。因此,如果是系统对象toString就是系统对象自带的;如果是自己写的对象,则是通过原型链查找Object下面的原型获得的。
其次,我们来简单谈一下“toString”的作用:
简单来说,toString的第一个作用就是把对象转为字符串。
var arr = [1,2,3];
console.log(arr.toString()); // '1,2,3'
console.log(typeof arr.toString()); //string
有时候我们会遇到对象转字符串的情况,比如要把数组里的元素,转化为字符串,那么我们就可以利用toString方法完成。比如arr = [1,2,3],那么toString之后的字符串就为1,2,3,这样就很轻松地解决了。但是如果我们最终转换的字符串不是以逗号连接呢,假如是以“+”或者“%”连接呢,那么此时我们就可以对toString方法进行扩展,满足我们的需求。例如:
Array.prototype.toString = function(){
return this.join('+');
}
这样就可以了,so easy so good.....,要注意的话这样自带的toString就被悄悄的篡改了,这里不再赘述,只是说说toString的这方面的作用。
toString的第二个作用则是进行数字的进制转换。
var num = 255;
console.log(num.toString(16)); //进行十六进制的转换,结果为ff
console.log(num.toString(2)); //进行二进制的转换,结果为11111111
利用这一点,我们可以完成常见的颜色值的转换,例如从rgba格式转为十六进制格式,或者从十六进制格式转为rgba格式。
toString还有一个作用就是进行类型的判断。
从上面例子可以看出,如果是数组的话,我们可以通过和Object.prototype.toString.call(arr) 和 '[object Array]' 相比较,看他们的布尔值是否为true判断类型。如果看过jq源码的话,可以发现jq中的type的方法实现原理也是toString+call.
下面以数组为例,说一个关于如何判断数组的例子来更好的体现toString判断类型的作用。我们知道constructor和instanceof都可以判断是否为数组类型,toString也可以判断,那么那个好呢?实际应用中应该采用那个呢?一般来说,constructor和instanceof来判断数组类型也是没有问题的,但有一些特殊情况除外,比如在跨iframe操作中,判断就不准确了,而toString却是好使的。故而推荐toString作为判断数据类的方法。示例如下: