谈谈JavaScript中的对象

JavaScript中有很多让人迷惑的地方,比如有人说JavaScript中一切皆对象,但又有一个Object类型,还有下面的代码:

1
2
3
4
> null.prototype
< TypeError: null is not an object (evaluating 'null.prototype')
> typeof null
< "object"

当我们试图去访问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
2
3
4
5
6
> typeof Object
< "function"
> typeof Array
< "function"
> typeof Date
< "function"

我们又惊奇的发现,这些所谓的Object,竟然是个function,那么它俩究竟是什么关系呢?其实,所有的引用类型都是通过构造函数来创建的,而构造函数的原型是Object。所以,如果你理解了下面的代码,你就能明白Object和Function的关系了:

1
2
3
4
5
6
> Object instanceof Function
< true
> Function instanceof Object
< true
> Object instanceof Object
< true

什么?还是感觉很混乱吗?那就要了解一下prototype了,请看下篇。