typeof
操作符返回一个字符串,指示未经计算的操作数的类型。
语法
typeof operand
operand
是一个表达式,表示对象或原始值,其类型将被返回。
再来看一下有哪些原始值.
原始值: null,undefined,boolean,number,string,symbol (ECMAScript 6 新定义)
typeof 的所有返回值除了原始值还有Object,function,Implementation-dependent
Object很好了解,除了直接量,都是对象,甚至在浏览器端的 null,也是源自 window.null 也是个对象.
function 是 ECMA-262条款中实现的
Implementation-dependent 表示该对象时由js环境提供的宿主对象
优点:
可以有效区分 undefined , function , symbol 和 object
缺点:
由于 1 和 new Number(1) 的存在,typeof无法准确判断对象的类型
typeof 正则表达式 === 'function'
例子:
// Numbers
typeof 37 === 'number';
typeof 3.14 === 'number';
typeof Math.LN2 === 'number';
typeof Infinity === 'number';
typeof NaN === 'number'; // 尽管NaN是"Not-A-Number"的缩写
typeof Number(1) === 'number'; // 但不要使用这种形式!
// Strings
typeof "" === 'string';
typeof "bla" === 'string';
typeof (typeof 1) === 'string'; // typeof总是返回一个字符串
typeof String("abc") === 'string'; // 但不要使用这种形式!
// Booleans
typeof true === 'boolean';
typeof false === 'boolean';
typeof Boolean(true) === 'boolean'; // 但不要使用这种形式!
// Symbols
typeof Symbol() === 'symbol';
typeof Symbol('foo') === 'symbol';
typeof Symbol.iterator === 'symbol';
// Undefined
typeof undefined === 'undefined';
typeof declaredButUndefinedVariable === 'undefined';
typeof undeclaredVariable === 'undefined';
// Objects
typeof {a:1} === 'object';
// 使用Array.isArray 或者 Object.prototype.toString.call
// 区分数组,普通对象
typeof [1, 2, 4] === 'object';
typeof new Date() === 'object';
// 下面的容易令人迷惑,不要使用!
typeof new Boolean(true) === 'object';
typeof new Number(1) === 'object';
typeof new String("abc") === 'object';
// 函数
typeof function(){} === 'function';
typeof class C{} === 'function'
typeof Math.sin === 'function';
typeof new Function() === 'function';