# typeof 详解
# typeof定义
typeof 操作符返回一个字符串,指出未经计算的操作数的类型
类型 | 结果 |
---|---|
Undefined | "undefined" |
Null | "object" |
Boolean | "boolean" |
Number | "number" |
String | "string" |
Symbol | "symbol" |
函数对象 | "function" |
任何其他对象 | "object" |
# 实例
typeof NaN === "number" // true
typeof (typeof 1) === "string" // true, typeof总是返回一个字符串
// Undefined
typeof undefined === 'undefined';
typeof declaredButUndefinedVariable === 'undefined';
typeof undeclaredVariable === 'undefined';
typeof new String("abc") === 'object';
// 函数
typeof function(){} === 'function';
typeof class C{} === 'function'
typeof Math.sin === 'function';
typeof new Function() === 'function';
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# null
typeof null === 'object'
1
这是JS出现就有的BUG
JS中的值是由一个表示类型的标签和实际的数据值表示的。对象的类型标签是0,由于null代表的是空指针(大多数平台下值为0x00),因此,null的类型标签也成为了0
# new 操作符号
let str = new String('str')
typeof str // 'object'
let func = new Function()
typeof func // 'function'
1
2
3
4
5
2
3
4
5
# 例外
typeof document.all === 'undefined'
1
# typeof 和 instanceof 的区别
用法:object instanceof constructor 解释:instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上。,如果A是B的实例,则返回true,否则返回false。 instanceof检测的是原型,下面是模拟内部执行过程
function instanceof (A,B) = {
return Object.getPrototypeOf(A) === B.prototype}
}
1
2
3
2
3
两者都可以用来判断变量,tyoeof会返回基本类型,instanceof只会返回一个bool值
下面是instanceof的一个知识点
// 注意
let str = "string"
console.log(str instanceof String) // false,查找不到原型
1
2
3
2
3
出现这个问题的原因是,str是String数据类型的值,但并不是String的实例对象
# 例题
# 如何判断这个变量是数组
因为typeof [] / {} 返回都是object,所以需要判断
// 原型方法
Array.prototype.isPrototypeOf(s) // []:true, {}:false
// 构造函数
s instanceof Array // true
// 根据toString方法检查类属性名
Object.prototype.toString.call([]) // [object Array]
// Array原生方法
Array.isArray([]) // true
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 如何判断对象为字符串
const str = 'good'
typeof str === 'string'
Object.prototype.toString.call(str)
// 注意不能使用instanceof
str instanceof string // false,因为str是string数据类型,但不是String的实例对象
1
2
3
4
5
6
7
2
3
4
5
6
7