前言
类型判断是框架设计的基础之一,它很重要,并且掌握类型判断对JavaScript的深入是必不可少的,这也是我为什么记录下这里我所理解的 JS 类型判断。
数据类型
ES5中有5种简单数据类型(也称为基本数据类型):undefined、Null、Boolean、Number、String,还有一种复杂数据类型 Object,Object 本质上是由一组无序的名值对组成,ECMAScript不支持任何创建自定义类型的机制,在ES6中又新增了一种基本数据类型 Symbol 它的意思即表示独一无二的值,至于它的作用以及它能够来解决什么问题不是现在的重点。
1. typeOf
由于ECMAScript语言是松散类型的,因此需要有一种手段来检测给定变量的数据类型——typeOf就是负责提供这方面信息的操作符。
- “undefined”—— 如果这个值未定义
- “boolean”—— 如果这个值是布尔值
- “string”—— 如果这个值是字符串
- “number”—— 如果这个值是数字
- “object” —— 如果这个值是对象或者是null
- “function” —— 如果这个值是函数
下面是几个例子:
1 | let message = 'some message'; |
大部分的类型判定都显而易见,这里只需要注意一下 null,因为在typeOf null 它返回的是 object,前面说null是一种基本数据类型那为什么会出现这样的结果。首先 null 是一个特殊值这是规定也确实在计算机语言当中被用来表示一个空的对象引用。
除此之外 function 在变量经过 typeOf 后返回的结果之一它也稍显特殊,同时在考虑它特殊的情况下,先想一下它为什么会返回出来而不是其他什么。
从技术角度讲,函数在ECMAScript中是对象,有时候也被称为第一类对象,它不是一种数据类型,然而,函数也确实有些特殊的属性,因此通过typeOf操作符来区分函数和其他对象是有必要的。
Undefined 类型
Undefined 类型只有一个值,即特殊的undefined。在使用var声明变量但未对其加以初始化时,这个变量的值就是undefined。
这里只要注意这点,在ECMAScript中变量尚未声明和声明了但未初始化的变量它们的值默认都是undefined,从技术的角度上,它们有着本质的区别,相同点即是两者都不能执行真正的操作。
Null 类型
Null 类型是第二个只有一个值的数据类型,这个特殊的值是 null。从逻辑的角度上讲,null 值表示一个空对象指针,这也是typeOf后返回object的原因。
这里有一个比较 null == undefined 的操作返回值是true。这是规则,比较操作符会出于比较的目的会转换操作数。
那么 null 和 undefined 是怎样区分的呢或者说傻子都知道这两者的作用不同那怎么说呢?
有一句话是只要意在保存对象的变量还没有真正的保存对象,就应该明确让对象保存 null 值,这样做不仅可以体现 null 作为空对象的惯例,也进一步区分了 null 和 undefined。
Boolean 类型
这个类型没什么说的,不过这应该是用的比较多的一种类型,这里要了解的是这种类型有两个值 true 和 false。
Number 类型
Number 类型需要注意几点:
- 浮点数值
- 数值范围
- NaN
- 数值转换
1. 浮点数值
所谓浮点数值,就是该数值中必须包含一个小数点,并且小数点后至少有一位数字。例:
1 | let floatNum = 1.1; |
这里浮点计算在这门语言中会遇到一个小问题。
如1
2
30.1 + 0.2 == 0.3 // false
结果为0.30000000000000004
why?这不是我现在想了解的事情,其实大脑的处理事情的方式也是异步的,先把一件不太重要的事情存起来等下做,虽然有些事情可能真的不做了,这也是它被代替了而已。
2. 数值范围
由于内存的限制,ECMAScript表示的最小数值保存在Number.MIN_VALUE中,大多数浏览器这个值是5e-324,最大值Number.MAX_VALUE = 1.79…e+308,超过这个范围返回Infinity值。那么这里我为什么想知道这个👻鬼东西,有什么用?平时根本就遇不到这种情况,每天写写业务代码,怎么可能遇到这种问题,墨菲定律中只要有可能那这种可能就是百分之百。
3. NaN
NaN,即非数值(Not a Number)是一个特殊的值,这个数值用于表示一个本来要返回数值的操作数未返回数值的情况(这样做就不会抛出错误)即不会影响代码的执行。
首先 NaN 有两个特点,一、任何涉及 NaN 的操作都返回NaN。二、NaN 与任何值都不相等。例:
1 | isNaN(NaN); // true |
String 类型
这个类型可以说日常生活当中最常用的一种类型之一,我们经常需要操作字符串。其他我先不写,感觉要写能写很多。
Object 类型
ECMAScript中的对象其实就是一组数据和功能的集合。对象可以通过执行new操作符后跟要创建的对象类型的名称来创建。
1 | let o = new Object // 有效,但不推荐不使用圆括号 |
这里我们重点需要理解一个思想,Object类型是所有它的实例的基础,换句话说Object类型所具有的任何属性和方法同样存在于更具体的对象中。
Object的每个实例都具有下列属性和方法。
- constructor:保存着用于创建当前对象的函数。对于前面的例子而言,构造函数(constructor)就是 Object()
- hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中,不能检测到原型链上的属性。
- isPrototypeOf(object): 用于检测传入的对象是否是当前对象的原型。
- toLocalString(): 返回对象的字符串表示,与执行环境的地区所对应。
- toString():返回对象的字符串表示。
valueOf():返回对象的字符串、数值、布尔值表示,通常与上一个返回值相同。
有一点就是浏览器的对象和JavaScript环境中的对象不在统一环境中,如BOM,DOM对象它们不一定继承Object。