Object.prototype.toString.call()输出的值是什么意思?

如题

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代表的又是什么?开头还是大写。

只是略微的知道,并不清楚其原理,大佬们指导一下。

阅读 4.4k
4 个回答

核心:对象对象子类型

先看一段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是怎么来的,我想这是个迷了,等后面我知道了再来补充答案

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

在js里,每个对象都有自己的toString方法,只是里面的处理方式会有些不同,印象中,也记得有一句,用Object.prototype.toString.call()来判断数据类型,是为了兼容不同的环境(找不到文章出处了,或者是我记错了。。)
这个方法内部做了什么,就不解释了。回答题主的问题。
第一个object代表都是object类型————代表这是一个复杂的数据类型(和Boolean、Number等基本数据类型区分),调用 typeof [],typeof {},都是返回这个;
第二个Object,Array就是在object再细分,代表它是ObjectArray这些构造函数构建的,Object、Array他们是不同的引用类型。
有些代码,是需要细分这些数据类型来做不同处理的,做不同的事情的,就比如对象的深度复制。jQuery中的extend就有不同的处理。

可以这么理解:比如[object Array],意思就是顶级对象Object下的子对象Array类型

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题