问题:
如题

var obj=new Object();
Object.prototype.toString.call(obj);// "[object Object]"

var arr=new Array();
Object.prototype.toString.call(arr);// "[object Array]"

如此类推,输出的"[object Object]"这些字符串,第一个object代表的是什么?第二个Object代表的又是什么?开头还是大写。

答案:
核心:对象对象子类型

先看一段MDN解释:

If this method is not overridden in a custom object, toString() returns "[object type]", where type is the object type.
var o = new Object();
o.toString(); // returns [object Object]

https://developer.mozilla.org...

第一个object代表custom object(对象)。
第二个Object代表type(对象子类型)。

那么问题来了,什么是custom object?

不严谨的说,Javascript中的所有,都是由custom object(对象)衍生出来的type(对象子类型).

JavaScript包括DOM,BOM和EcmaScript。

DOM的div,本质上也是一个custom object,type是HTMLDivElement。
BOM的navigator,本质上也是一个custom object,type是Navigator。
EcmaScript的arguments,本质上也是一个custom object,type是Arguments。

再说说常见的简单和复杂数据类型

String,Number,Boolean,null,undefined
Array,Object,Function,RegExp,Data,Math...

用toString()时,同样也会返回

[object String] [object Number] [object Boolean]......

不想写了,都一样,后面都是各自的type(对象子类型)。

至于为什么Object.prototype.toString.call("foo")同样会返回[obejct String],因为"foo"和String("foo")是等价的,注意,此处没有new。

这时候可能比较晕了,那么再来想想什么是简单数据类型,什么是复杂数据类型。

我的理解是,所有的数据类型都是由custom object(对象)衍生出来的,所以他们都是对type(对象子类型)。

只不过简单数据类型没有继承那些原型链上的方法,这样更加轻量;若继承的话,需要使用new操作符,就彻底成一个复杂数据类型了。

几乎所有的对象子类型都会继承Obejct,不过我想Object.create(null)是所有其他对象子类型的最原始状态

至于Object是怎么来的,我想这是个迷了,等后面我知道了再来补充答案

也不知道对不对,反正我把所有已知都联系起来了,轻喷

期待和大家交流,共同进步,欢迎大家加入我创建的与前端开发密切相关的技术讨论小组:

努力成为优秀前端工程师!


趁你还年轻
4.1k 声望4.1k 粉丝