JavaScript的typeof运算符

原文:The typeof Operator in JavaScript

typeof运算符可以判断一个值的类型——number、string、object等。

typeof运算符返回变量的类型。

1
2
3
4
5
6
7
8
9
10
11
12
typeof 42; // 'number'
typeof 'test'; // 'string'
typeof true; // 'boolean'
typeof (void 0); // 'undefined'
typeof BigInt('1234'); // 'bigint'
typeof Symbol('foo'); // 'symbol'
typeof ({ answer: 42 }); // 'object'
typeof function() {}; // 'function'

// 对`typeof`而言,所有的对象都返回object
class MyClass {}
typeof (new MyClass()); // 'object'

一般而言:typeof运算符返回给定的值是JavaScript的8种数据类型的哪一种。有一个很关键的例外:null

null

typeof一个很容易出错的地方,就是typeof null === 'object'这种情况有一些历史原因,修正这一问题的提案也被否决了,目前看起来JavaScript是无法摆脱这个奇怪的语法了。

typeof检查一个值是否真的是对象的方法,可以判断一下它的类型是不是'object',它是否严格不等于null

1
2
3
function isObject(v) {
return typeof v === 'object' && v !== null;
}

错误场景

对未定义的块级作用域变量使用typeof运算符,会抛出错误。

1
2
3
4
// 抛出错误 'ReferenceError: v is not defined'
console.log(typeof v);

let v;

这个错误只会在块级作用域变量出现。例如,如果完全不定义v变量,以上代码运行正常。

1
2
3
console.log(typeof v); // 'undefined'

//let v;

块级变量是typeof唯一可能报错的场景,其他场景typeof总是可以正常运行。