【前端面试小册】面试官:说说typeof和instanceof区别

88 阅读2分钟

1、 typeof

作用

可以用做类型判断,Demo如下

console.log(typeof 1) // 'number'
console.log(typeof '前端职场圈') // 'string'
console.log(typeof undefined) // 'undefined'
console.log(typeof true) // 'boolean' 
console.log(typeof Symbol()) // 'symbol'
console.log(typeof BigInt(1)); // 'bigint'
console.log(typeof function(){}); // 'function'

缺点

数组,对象,null,正则在typeof看来都属于object,无法区分是对象中的哪一种

console.log(typeof {})   // 'object'
console.log(typeof [])    // 'object'
console.log(typeof null)    // 'object'  
 console.log(typeof(/test/g)); // 'object'

typeof原理浅分析

js底层存储变量的时候,会用二进制前三位存储(表示)其类型信息

类型机器码
对象000
浮点数010
字符串100
布尔110
整数1

关于null和undefined

null : 二进制表示全为0
undefined :  用 −2^30 整数来表示

由于null的二进制表示全为0,那么前三位也是0,所以typeof在判断null的时候认为他是对象

假设js对象都是16位,那么

null:  0000000000000000
Array: 1000100010001000


typeof null  // "object"
typeof []   // "object"

2、instanceof

2.1、instanceof作用

2.1.1、判断一个实例是否属于某种类型


let person = function () {
}

let p = new person()
p instanceof person // true


let child = function () {
}
child.prototype = new person()
let c = new child()

console.log(c instanceof person); // true
console.log(c instanceof child); // true

2.1.2、区分引用数据具体类型


// 先看typeof
 console.log(typeof /test/g); // object
 console.log(typeof []); // object
 console.log(typeof {}); // object


// instanceof
 console.log(/test/g instanceof RegExp); // true
 console.log([] instanceof Array); // true
 console.log([] instanceof Object); // true
 console.log({} instanceof Object); // true

2.2、实现instanceof

简单来说就是利用原型链来判断,只要左边.proto等于右边.prototype就认为左边是右边的实例;所系按照这个思路我们可以得到下面demo

instanceof实现 demo

let person = function () {
}

let child = function () {
}
child.prototype = new person()
let c = new child()

function myInstanceof(left,right){
    let _left = left.__proto__
    let _right = right.prototype
    while(true){
       if(_left === null) return false
       if(_left === _right) return true
       _left = _left.__proto__
    }
}

console.log(myInstanceof(c,child)); // true
console.log(myInstanceof(c,person)); // true

2.3、instanceof缺点

从instanceof的原理我们知道他是利用原型链,判断一个实例是否属于某种类型;但是也有弊端:

// 数组既是Array实例,也是Object实例,可能存在误判
console.log([] instanceof Array); // true
console.log([] instanceof Object); // true

// 通过实例化的字符串判断正常
console.log(new String('test') instanceof String); // true

// 普通字符串判断有误(基本数据类型判断可能有问题)
console.log('test' instanceof String); // false

instanceof判断类型仍然

3、总结:

  • instanceof可以区分数引用数据类型,但是无法判断基本数据类型;

  • typeof可以判断基本数据类型,无法区分数引用数据类型

  • 二者都有弊端;所以判断数据还是要用Object.prototype.toString,参考上面第4点

4、思考

了解instanceof后,这里会涉及到原型链,而这个又是js非常重要的一个知识点,这个时候面试官可能就会展开让你说说原型链,看之前可以先自己先问问组,现在面试官如果问题你原型链,你能快速讲清楚吗? 下一节我们继续原型链