回顾js基础(一)关于一切皆对象

380 阅读2分钟

js一直有个说法,“一切皆对象”,但是总觉得这个说法很是站不住脚,而且对初学者很是误导,大家都知道最新的ECMAScript是定义了七种数据类型,在最新的ECMAScript 标准也定义Symbol类型之前,js也有六种数据类型。
温习下:

6 种原始类型:
Boolean
Null
Undefined
Number
String
Symbol (ECMAScript 6 新定义)
和 Object

关于js有多少数据类型这个问题,已经算是js的基础知识之一了,但是为何还会有一切皆对象这个说法呢,(注:对象作为数据类型之一)。
抛开typeOf instanceOf Object.prototype.tostring 这几个判断方法不谈,寻找其它突破口想这个问题。
包装对象
回顾下对象定义:对象简单来说就是一组“键值对”(key-value)的集合,是一种无序的复合数据集合。可以通过使用点运算符,和方括号运算符来读取自身的属性。
接下来看下面图内容中的执行判断:

为何原始类型值有自身的属性和方法呢?它也是对象? 原因是,js定义了3个包装对象,原始类型的数值、字符串、布尔值——在一定条件下,会自动当作包装对象调用,即调用包装对象的属性和方法。这时,JavaScript 引擎会自动将原始类型的值转为包装对象实例,并在使用结束后,包装对象实例会自动销毁。
特殊对象
第二个说法是:数组函数是特殊的对象,数组确实是对象为么,它是特殊对象? 原因是[], function(){}是其对应'类'的构造函数的实例对象,可以调用通过__porto__调用自己构造函数的prototype 对象里的方法属性。

这下真相大白了,原始值始终有着自身的数据类型,只是它在调用时被临时转化成了包装对象。而[],fucntion(){} 是由对应的"类",构造出的实例对象。 所以我想,一切皆对象,想表达的应该是一切的数据类型在原型链的机制下都和对象有着千丝万缕的联系罢了。而非真正的一切皆对象。