显式转换为字符串可以使用toString方法,它的执行结果通常和String()方法一致。Number类型的toString方法还支持参数,可以指定需要转换的进制。下面的图是一些原始类型的toString(),null和undefined没有toString方法,调用会报错:
Number类型的toString方法支持进制:
转数值转为数值就很简单了,经常在用,就是这两个全局方法:parseInt和parseFloat。
对象转字符串对象转换为字符串和数值会稍微麻烦点,下面我们单独来探究下。对象转为字符串主要有三种方法:
value.toString()
这个前面讲过了
'' + value。这个是前面提到过的隐式转换,但是value是对象的话会按照下面的顺序进行转换:
先调用value.valueOf方法,如果值是原始值,则返回
否则调用value.toString方法,如果值是原始值,则返回
否则报错TypeError
String(value)。这个是前面提到的显式转换,流程跟前面类似,但是调用toString和valueOf的顺序不一样。
先调用value.toString方法,如果值是原始值,则返回
否则调用value.valueOf方法,如果值是原始值,则返回
否则报错TypeError
需要注意的是,Date对象有点特殊,他始终调用toString方法。
下面我们写一段代码来验证下:
Object.prototype.valueOf = function() { return 'aaa'; } Object.prototype.toString = function() { return 'bbb'; } let a = {}; let b = '' + a; let c = String(a); console.log(b); console.log(c);上述代码输出是,跟我们预期一样:
对象转数值对象类型转为数值主要有两种方法:
+value
Number(value)
这两种的执行逻辑是一样的:
先调用valueOf方法,如果值是原始值,就返回
否则,调用toString方法,然后将toString的返回值转换为数值
照例写个例子看下:
Object.prototype.valueOf = function() { return {}; } Object.prototype.toString = function() { return 'bbb'; } let a = {}; let b = +a; let c = Number(a); console.log(b); console.log(c);上述代码的输出都是NaN,这是因为我们toString方法返回的bbb没办法转化为正常数值,强行转就是NaN:
类型检测类型检测是我们经常遇到的问题,面试时也经常问到各种类型检测的方法,下面是几种常用的类型检测的方法。
typeof做类型检测最常用的就是typeof了:
let a; typeof a; // undefined let b = true; typeof b; // boolean let c = 123; typeof c; // number let d = 'abc'; typeof d; // string let e = () => {}; typeof e; // function let f = {}; typeof f; // object let g = Symbol(); typeof g; // symbol instanceoftypeof最简单,但是他只能判断基本的类型,如果是对象的话,没法判断具体是哪个对象。instanceof可以检测一个对象是不是某个类的实例,这种检测其实基于面向对象和原型链的,。下面来看个例子:
let a = new Date(); a instanceof Date; // true constructorconstructor的原理其实跟前面的instanceof有点像,也是基于面向对象和原型链的。一个对象如果是一个类的实例的话,那他原型上的constructor其实也就指向了这个类,我们可以通过判断他的constructor来判断他是不是某个类的实例。。还是用上面那个例子:
let a = new Date(); a.constructor === Date; // true