JS检测变量类型三剑客typeof instanceof toString

64 阅读1分钟

1. typeof: 返回类型的对象或基本类型的表达式

以下列出typeof检测变量的情况,注意特殊类型及其原因

类型typeof 检测
null'object'
Function'function'
Number'number'
String'string'
Boolean'boolean'
BigInt'bigint'
undefined'undefined'
Symbol'symbol'
其他对象'object'

1.1 生来如此的 typeof null === 'object'

最初JavaScript的中的值是由一个表示类型的标签和一个实际的值表示的。对象的类型标签是0,而null是空指针,因此代表null的标签是0,由此 typeof null === 'object'.

1.2 所有使用new构造函数返回的是‘object’|'function'

const num = new Number(123)
typeof num --> 'object'

// 需要注意的是 new Function 
const fun = new Function()
typeof fun ---> 'function'

1.3 typeof 优先级高于(+)等二进制操作符

let num = 23
// 本意是 num+'offer' --> 'numoffer'
// 由于typeof的优先级导致意外
typeof num + 'offer' -->  numberoffer

// 使用()来改变运算顺序
typeof (num + 'offer') ---> string

image.png

1.4 let & const 的typeof:不能在声明前调用,否则报错 ReferenceError

typeof beforelet -->ReferenceError

let beforelet;

2. instanceof: 检测构造函数的某个prototype属性是否出现在某个实例的原型链上

2.1 并不是 obj instanceof Foo会一直都返回 true,因为Foo.prototype可能会在某种情况改变后并不存在在obj的原型链上。

function D(){}

// d 是 D的实例
let d = new D()
console.log(d instanceof D ) --->true
console.log(d)

image.png

//将D的原型指向一个空对象
D.prototype = {}
let d1 = new D()
console.log(d instanceof D ) --->false
console.log(d1 instanceof D) ---> true
console.log(d1)

image.png

2.2 {} & Object.create(null) 与 instanceof Object

var NonObj = {}
var myNull = null;
// 以非Object实例创建
var myNonObj = Object.create(null)

console.log(NonObj instanceof Object) --->true
//null 是原型链的终点
console.log(myNull instanceof Object) ---> false
console.log(myNonObj instanceof Object) ---> false

null是原型链的终点 image.png

3.Object.prototype.toString.call(): 检查对象类

题外话:字符串转会优先调用toString(), 但是数字转换和原始值转换会优先调用valueOf()

image.png

image.png