typeof与instanceof
# typeof
typeof 是一个运算符,使用:typeof(表达式)、typeof 变量名,返回值是一个字符串,用来说明变量的数据类型。
可以用来判断number、string、object、boolean、function、undefined、symbol这七种类型。
提示
typeof方法有一定局限性:对于对象、数组、null返回的值都是object。
因为在JS地层存储变量的时候,会在变量的机器码的低位1-3位存储其类型信息:
- 000:对象
- 010:浮点数
- 100:字符串
- 110: 布尔值
- 1:整数
- 特例:
- null的所有机器码均为0
- undefined:用-2^30整数来表示
而typeof则是用机器码来判断类型,故null也会被判断为对象。
console.log(typeof('lili'))
console.log(typeof(1))
console.log(typeof(false))
console.log(typeof(undefined))
console.log(typeof(null))
console.log(typeof({}))
console.log(typeof([]))
console.log(typeof(()=>{}))
console.log(typeof(Symbol()))
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# instanceof
instanceof 运算符用于检测构造函数的prototype
属性是否出现在某个实例对象的__proto__
上,返回值为布尔值,用于判断一个变量是否属于某个对象的实例。
原理: instaceof右边变量的prototype
在左边变量的__proto__
上即可。因此instanceof在查找过程中会遍历左边遍历的__proto__
,直到找到右边变量的prototype
,如果查找失败,则返回false。
可以通过Object.getPrototypeof()来获取变量的隐式原型。
const arr = [1, 2];
console.log(arr instanceof Object)
const proto1 = Object.getPrototypeOf(arr)
console.log(proto1);
const proto2 = Object.getPrototypeOf(proto1)
console.log(proto2);
console.log(Object.prototype)
console.log(proto1 === Object.prototype)
console.log(proto2 === Object.prototype)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
instanceof 手动实现:
function myInstanceof(left, right) {
let leftVal = Object.getPrototypeOf(left);
const rightVal = right.prototype;
while (leftVal !== null) {
if (leftVal === rightVal) {
return true;
}
leftVal = Object.getPrototypeOf(leftVal);
}
return false;
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
编辑 (opens new window)
上次更新: 2022/04/26, 21:54:00