问题:
如题
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是怎么来的,我想这是个迷了,等后面我知道了再来补充答案
也不知道对不对,反正我把所有已知都联系起来了,轻喷
期待和大家交流,共同进步,欢迎大家加入我创建的与前端开发密切相关的技术讨论小组:
- SegmentFault技术圈:ES新规范语法糖
- SegmentFault专栏:趁你还年轻,做个优秀的前端工程师
- 知乎专栏:趁你还年轻,做个优秀的前端工程师
- Github博客: 趁你还年轻233的个人博客
- 前端开发QQ群:660634678
- 微信公众号: 人兽鬼 / excellent_developers
努力成为优秀前端工程师!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。