谈谈JavaScript中的对象
JavaScript中有很多让人迷惑的地方,比如有人说JavaScript中一切皆对象,但又有一个Object类型,还有下面的代码:
1 | > null.prototype |
当我们试图去访问null的原型时,被提示null不是一个对象,但我们使用typeof判断其类型时,得到的却是object。
我觉得可以将JavaScript中的所有类型划分为3类:
- 第一类是null和undefined,这是两个比较特殊的类型,这里不做展开介绍;
- 第二类是String、Number、Boolean和Symbol,它们可以通过对象的形式被创建,如
Boolean(true), Number(3), String(9)
等,这时它们为对象类型。但通常我们不会也不推荐这么做,我们会使用字面量的方式创建,如let isShow = true; let num = 45
,这是它们属于基本类型,而非对象类型;- 第三类是我们通常所定义的Object类型,它们都是引用类型,原型都指向Object,有Object,Array,Function,Set,Map,RegExp,Date等。其中Object可以算作纯Object类型,根正苗红的那种,具体表现形式为一个大括号,里面包含了0或多个键值对,其他的可以算作是Object的子集。
接下来我们主要讲讲通常所定义的Object类型,即第三类,先看下面代码:
1 | > typeof Object |
我们又惊奇的发现,这些所谓的Object,竟然是个function,那么它俩究竟是什么关系呢?其实,所有的引用类型都是通过构造函数来创建的,而构造函数的原型是Object。所以,如果你理解了下面的代码,你就能明白Object和Function的关系了:
1 | > Object instanceof Function |
什么?还是感觉很混乱吗?那就要了解一下prototype了,请看下篇。