问题:
如题
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是怎么来的,我想这是个迷了,等后面我知道了再来补充答案
也不知道对不对,反正我把所有已知都联系起来了,轻喷