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非常重要的一个知识点,这个时候面试官可能就会展开让你说说原型链,看之前可以先自己先问问组,现在面试官如果问题你原型链,你能快速讲清楚吗? 下一节我们继续原型链