JS做类型检测到底有几种方法?看完本文就知道了! (2)

显式转换为字符串可以使用toString方法,它的执行结果通常和String()方法一致。Number类型的toString方法还支持参数,可以指定需要转换的进制。下面的图是一些原始类型的toString(),null和undefined没有toString方法,调用会报错:

image-20200506113217062

Number类型的toString方法支持进制:

image-20200506113346662

转数值

转为数值就很简单了,经常在用,就是这两个全局方法: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);

上述代码输出是,跟我们预期一样:

image-20200506160225229

对象转数值

对象类型转为数值主要有两种方法:

+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:

image-20200506160750545

类型检测

类型检测是我们经常遇到的问题,面试时也经常问到各种类型检测的方法,下面是几种常用的类型检测的方法。

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 instanceof

typeof最简单,但是他只能判断基本的类型,如果是对象的话,没法判断具体是哪个对象。instanceof可以检测一个对象是不是某个类的实例,这种检测其实基于面向对象和原型链的,。下面来看个例子:

let a = new Date(); a instanceof Date; // true constructor

constructor的原理其实跟前面的instanceof有点像,也是基于面向对象和原型链的。一个对象如果是一个类的实例的话,那他原型上的constructor其实也就指向了这个类,我们可以通过判断他的constructor来判断他是不是某个类的实例。。还是用上面那个例子:

let a = new Date(); a.constructor === Date; // true

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsxggj.html