typeof 的定义
typeof操作符返回一个字符串,表示未经计算的操作数的类型。
![17f0e8b293a3205c2fae94f243d59ae3.png](https://img-blog.csdnimg.cn/img_convert/17f0e8b293a3205c2fae94f243d59ae3.png)
返回值的解释
从上面的例子我们可以看出,typeof 操作符用于检测给定变量的数据类型。对于一个值使用 typeof 操作符,可能返回以下几个字符串:
- boolean -- 代表这个值是布尔值
- string -- 代表这个值是字符串
- number -- 代表这个值是数值
- symbol -- 代表这个值是Symbol
- undefined -- 代表这个值未定义
- object -- 代表这个值是对象或null
- function -- 代表这个值是函数
返回 boolean、string、number 的情况
对于布尔值、字符串、数字使用typeof 操作符,分别返回 "boolean"、"string"、"number"
![4a362a0dd1000618cafb88897c8c6ef7.png](https://img-blog.csdnimg.cn/img_convert/4a362a0dd1000618cafb88897c8c6ef7.png)
返回 symbol 的情况
对 Symbol 类型的值使用 typeof 操作符时,会返回 "symbol" Symbol 是 ECMAScript 6 新增的类型
![25481a1268c062c3a7c65787db44000f.png](https://img-blog.csdnimg.cn/img_convert/25481a1268c062c3a7c65787db44000f.png)
返回 undefined 的情况
![ef7ece93384684d5562f65e7dc48772e.png](https://img-blog.csdnimg.cn/img_convert/ef7ece93384684d5562f65e7dc48772e.png)
对 undefined 使用 typeof 操作符,返回 "undefined" 未赋值的变量,默认值为 undefined ,对未赋值的变量使用 typeof 操作符,返回 "undefined"
需要注意的问题
在 ECMAScript 6 之前,typeof总是保证为任何操作数返回一个字符串,所以当对未定义的变量使用 typeof 操作符时,也会返回 "undefined", 所以在 ECMAScript 6 之前,typeof 操作符时一个完全安全的操作,永远不会抛出错误。
但在 ECMAScript 6 中,引入了暂时性死区的概念,在变量声明之前,对块中的 let 和 const 变量使用 typeof 操作符时,会抛出一个 ReferenceError
看一个例子
![8ada7c0ae51f3ed2cc64b1e58556925c.png](https://img-blog.csdnimg.cn/img_convert/8ada7c0ae51f3ed2cc64b1e58556925c.png)
返回 function 的情况
当对函数使用 typeof 操作符的时候,会返回 "function"
![bcd2e3d6aef1499ae2fb02ad113914e5.png](https://img-blog.csdnimg.cn/img_convert/bcd2e3d6aef1499ae2fb02ad113914e5.png)
需要注意的问题
这里有一个历史遗留问题,需要我们考虑
当我们的浏览器环境是 Safari 5 及以前版本、Chrome 7 及以前版本 在对正则表达式对象使用 typeof 操作符时,也会返回 "function", 实际在 ECMAScript 的规范中,应该返回 "object"
返回 object 的情况
对于不是函数的引用类型的值,使用 typeof 操作符时,会返回 "object"
![298605514cf530ab2c9dda8b1b3c3065.png](https://img-blog.csdnimg.cn/img_convert/298605514cf530ab2c9dda8b1b3c3065.png)
对于 null 使用 typeof 操作符时,也会返回 "object"
![92d789f23cd605a6a3c60a2c51236cc6.png](https://img-blog.csdnimg.cn/img_convert/92d789f23cd605a6a3c60a2c51236cc6.png)
这是由于在 JavaScript 最初的实现中,JavaScript 中的值是由一个表示类型的标签和实际数据值表示的。对象的类型标签是 0。由于 null 代表的是空指针(大多数平台下值为 0x00),因此,null的类型标签也成为了 0,typeof null就错误的返回了"object"
例外情况
上面的所有内容,其实基本概括了所有使用 typeof 操作符的情况 但是在这其中有一个例外情况:
当前所有的浏览器都暴露了一个非标准的宿主对象 document.all
我们在对 document.all 使用 typeof 操作符时,会返回 "undefined"
![44077d9e1282d3efdc7dc698dddd0283.png](https://img-blog.csdnimg.cn/img_convert/44077d9e1282d3efdc7dc698dddd0283.png)
![84da055b82984a1fd318e4cf451b2bbe.png](https://img-blog.csdnimg.cn/img_convert/84da055b82984a1fd318e4cf451b2bbe.png)
原文链接:https://mp.weixin.qq.com/s/CI3lUTwY5wNqmSy6cRM7Yg
作者:前端小黑屋