介绍
-
String()
与.toSting()
都是转化为字符串类型
区别
-
.toString()
可以将所有的的数据都转换为字符串,但是要排除null
和undefined
,可接受一个参数,参数为2~36之间的数字
var a = false
a.toString() // 'false'
typeof a.toString() // String
var b = null
b.toString() // Cannot read property 'toString' of null
-
String()
可以将null和undefined转换为字符串,但是没法转进制字符串
var a = null
String(a) // 'null'
typeof String(a) // String
使用
- date类型
var a = new Date(2018,09,12)
a.toString() // Fri Oct 12 2018 00:00:00 GMT+0800 (中国标准时间)
String(a) // Fri Oct 12 2018 00:00:00 GMT+0800 (中国标准时间)
- 数组类型
// null和undefined都为空元素,所以打印时为空
var a = ['haha',1,null,undefined,false,true]
a.toString() // "haha,1,,,false,true"
String(a) // "haha,1,,,false,true"
- 正则类型
var a = new RegExp("\\[hbc\\]at", "gi");
a.toString() // "/\[hbc\]at/gi"
String(a) // "/\[hbc\]at/gi"
- Number类型
var a = 32
a.toString(2) // 100000 二进制
a.toString(8) // 40 八进制
a.toString(10) // 32 十进制,默认就是十进制
a.toString(16) // 20 十六进制
String(a) // '32'
重点
1.toString();//Invalid or unexpected token,无效或意外的标记
(1).toString();//"1"
1..toString();//"1"
1.2.toString();//"1.2"
上面例子当中1.toString()
报语法错误,是由于JavaScript在进行编译是,把1.
后面的这个.
解释编译成了浮点数的小数点的原因造成的。
// js编译是,当小数点后超过6个0时,使用e-Number来指示从多少位开始
var num = 0.000006;//小数点后面有5个“0”
num.toString();//"0.000006"
var num = 0.0000006;//小数点后面有6个“0”
num.toString();//"6e-7"
// 浮点数整数部分的位数大于21时,输出时采用e表示法;
var num = 1234567890123456789012;
num.toString() // "1.2345678901234568e+21"
var a = Object.prototype
var b = a.__proto__
typeof a // 'object'
String(a) // "[Object,Object]"
a.hasOwnProperty('toString') // true
typeof b // "object"
String(b) // "null"
b.hasOwnProperty('toString') // 报错
从上面的代码中,我们可以看出,toString
方法定义在Object.prototype
上,所有对象均可以使用该方法。但是请看下面:
- 对象类型
// 为什么对象的toString()和String()返回的却是“[object Object]”呢?
//而上面的其他类型都是返回的对应的字符串呢,那是应为其他类型的原型上都有改写对应的toString()方法
var a = {b:1,c:'haha',e:null,f:undefined,g:false,h:true}
a.toString() // "[object Object]"
String(a) // "[object Object]"
var b = Array.prototype
var c = b.__proto__
typeof b // Object
b.hasOwnProperty('toString') // true
typeof c // Object
c.hasOwnProperty('toString') // true
toString()
方法的解释
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]],
然后把类型检测转化为字符串比较,以达到我们的目的。
- 利用以上特性,我们可以使用Object.prototype上的原生toString()方法判断数据类型
// 判断基本类型
var a = Object.prototype
a.toString.call(null);//”[object Null]”
a.toString.call(undefined);//”[object Undefined]”
a.toString.call(“abc”);//”[object String]”
a.toString.call(123);//”[object Number]”
a.toString.call(true);//”[object Boolean]”
// 判断函数类型
var b = function () {console.log(1111)}
a.toString.call(b) // ”[object Function]”
// 日期类型
var date = new Date()
a.toString.call(date) // "[Object Date]"
// 数组类型
var array = [1,2,3,4]
a.toString.call(array) // "[Object Array]"
// 正则表达式
var reg = /[abc]/g
a.toString.call(reg) // "[object RegExp]"
小技巧
- 由于toString()方法可以转化成不同进制,我们可以利用这个来生成随机的字母和数字的组合
Math.random().toString(30).substr(2)