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
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)
//将D的原型指向一个空对象
D.prototype = {}
let d1 = new D()
console.log(d instanceof D ) --->false
console.log(d1 instanceof D) ---> true
console.log(d1)
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是原型链的终点
3.Object.prototype.toString.call(): 检查对象类
题外话:字符串转会优先调用toString(), 但是数字转换和原始值转换会优先调用valueOf()