我们知道String()与 .toString()都是可以转换为字符串类型,但是String()与 .toString()的还是有区别的
1、.toString()可以将所有的的数据都转换为字符串,但是要排除null 和 undefined
例如将false转为字符串类型
- <script>
- var str = false.toString();
- console.log(str, typeof str);
- </script>
返回的结果为 false,string
看看null 和 undefined能不能转换为字符串javascript
- <blockquote style="margin-right: 0px;" dir="ltr"><pre class="html" name="code"><script>
- var str = null.toString();
- console.log(str, typeof str);
- </script>
结果程序报错
- <script>
- var str = undefined.toString();
- console.log(str, typeof str);
- </script>
程序也报错
.toString() 括号中的可以写一个数字,代表进制,对应进制字符串
二进制:.toString(2);
八进制:.toString(8);
十进制:.toString(10);
十六进制:.toString(16);
2、网页代码String()可以将null和undefined转换为字符串,但是没法转进制字符串
例如将null转换为字符串
- <script>
- var str = String(null);
- console.log(str, typeof str);
- </script>
返回的结果为 null,string
将undefined转换为字符串
- <script>
- var str = String(undefined);
- console.log(str, typeof str);
- </script>
返回的结果为 undefined,string
接下来的三个例子都是以重写的方式实现了toString()方法:
3.1Array类型:
var arr = ["tom",12,"rose",18]; console.log(arr.toString());//"tom,12,rose,18"
3.2RegExp类型
var patten = new RegExp("\\[hbc\\]at", "gi"); console.log(patten.toString());//"/\[hbc\]at/gi"
3.3Date类型
var date = new Date(2014,02,26);//注意这种格式创建的日期,其月份是3月 console.log(date.toString());//"Wed Mar 26 2014 00:00:00 GMT+0800"输出格式因浏览器不同而不同,此为firefox的输出格式;
3.4Number类型也是以重写的方式实现toString()方法的,请看以下例子:
3.4.1它可以接受一个整数参数,并将调用这个方法的数值转化成相应进制的字符串:
var num = 16; console.log(num.toString(2));//10000 二进制 console.log(num.toString(8));//20 八进制 console.log(num.toString(16));//10 十六进制 console.log(num.toString(5));//31 虽然没有五进制,但是这样传参是可以被toString()方法接受的
3.4.2再看下面的代码:
console.log(1.toString());//这种写法会报错语法错误,但是下面的写法都是合法的; console.log((1).toString());//"1" console.log(typeof (1).toString());//string console.log(1..toString());//"1" console.log(typeof (1).toString());//string console.log(1.2.toString());//"1" console.log(typeof (1).toString());//string
var num = 0.000006;//小数点后面有5个“0” console.log(num.toString());//"0.000006" var num = 0.0000006;//小数点后面有6个“0” console.log(num.toString());//"6e-7"
3.4.4浮点数整数部分的位数大于21时,输出时采用e表示法;
var num = 1234567890123456789012; console.log(num.toString());//"1.2345678901234568e+21"
三、toString方法到底定义在何处?
先看一下代码:
var pro = Object.prototype; var pr = pro.__proto__;//ie11之前版本不支持该属性 console.log(typeof pro);//"object" console.log(String(pro));//"[object Object]" console.log(pro.hasOwnProperty("toString"));//true console.log(typeof pr);//"object" console.log(String(pr));//"null" console.log(pr.hasOwnProperty("toString"));//报错
由此可见,toString()定义在Object.prototype上;所以所有对象均可用toString()方法。
【个人理解:但为什么当对象是object的时候,输出的是'[object object]',而其他类型输出的却是类似本身的值?因为其他类型的对象引用的是重写后的toString()方法】
1
2
3
4
|
Object
.prototype.toString( ) When the toString method
is
called, the following steps are taken:
1
. Get the [[Class]] property of
this
object.
2
. Compute a string value by concatenating the three strings “[object “, Result (
1
), and “]”.
3
. Return Result (
2
)
|
上面的规范定义了 Object.prototype.toString 的行为:首先,取得对象的一个内部属性[[Class]],然后依据这个属性,返回一个类似于 "[object Array]" 的字符串作为结果([[]]用来表示语言内部用到的、外部不可直接访问的属性,称为 "内部属性")。利用这个方法,再配合 call,我们可以取得任何对象的内部属性 [[Class]],然后把类型检测转化为字符串比较,以达到我们的目的。还是先来看看在 ECMA 标准中 Array 的描述吧:
1
2
|
new
Array([ item0[, item1 [,…]]])
The [[Class]] property of the newly constructed object is set to “Array”.
|
所以 Javascript 中判断数组的函数可以这样写:
1
2
3
|
function
isArray(a) {
Array.isArray ? Array.isArray(a) : Object.prototype.toString.call(a) ===
'[object Array]'
;
}
|
4.1.判断基本类型:
Object.prototype.toString.call(null);//”[object Null]” Object.prototype.toString.call(undefined);//”[object Undefined]” Object.prototype.toString.call(“abc”);//”[object String]” Object.prototype.toString.call(123);//”[object Number]” Object.prototype.toString.call(true);//”[object Boolean]”
4.2.判断原生引用类型:
4.2.1函数类型
Function fn(){console.log(“test”);} Object.prototype.toString.call(fn);//”[object Function]”
4.2.2日期类型
var date = new Date(); Object.prototype.toString.call(date);//”[object Date]”
4.2.3数组类型
var arr = [1,2,3]; Object.prototype.toString.call(arr);//”[object Array]”
4.2.4正则表达式
var reg = /[hbc]at/gi; Object.prototype.toString.call(arr);//”[object Array]”
4.2.5自定义类型
function Person(name, age) { this.name = name; this.age = age; } var person = new Person("Rose", 18); Object.prototype.toString.call(arr); //”[object Object]”
很明显这种方法不能准确判断person是Person类的实例,而只能用instanceof 操作符来进行判断,如下所示:
console.log(person instanceof Person);//输出结果为true
4.3判断原生JSON对象:
var isNativeJSON = window.JSON && Object.prototype.toString.call(JSON); console.log(isNativeJSON);//输出结果为”[object JSON]”说明JSON是原生的,否则不是;
注意:Object.prototype.toString()本身是允许被修改的,而我们目前所讨论的关于Object.prototype.toString()这个方法的应用都是假设toString()方法未被修改为前提的。