js中的[object, Object]

今天照着敲一段代码,但是自己写的时候出现了一个错误:
Object.prototype.toString.call(prop) === '[object Object]' //书上的代码
我自己写的时候,把'[object Object]'写成了'[Object Object]' //两个object都大写了

这两个object代表什么呢?

关于toString()的,这个方法在Objet的原型上,而prop是一个对象,还要用call(),我为什么不直接prop.toString()这样写呢?

另外:
{}.toString() //报错
var obj = {};
obj.toString(); //"[object Object]"
为什么会这样呢?

阅读 5.3k
3 个回答

这两个object代表什么呢?
默认情况下,toString()方法被每个Object对象继承。如果此方法在自定义对象中未被覆盖,toString() 返回 "[object type]",其中type是对象的类型。

我为什么不直接prop.toString()这样写呢?
这个代码Object.prototype.toString.call(prop)是为了做类型判断的,不管prop是什么类型,返回肯定是"[object type]",但是prop不一定是Object,返回的不一定是类型,比如1.toString() 会报错,'aaa'.toString()返回的是'aaa'

{}.toString() //报错
是语法错误,大括号开头的js引擎会认为是代码块,所以会报错。改成({}).toString()就好了

这两个object代表什么呢?

object是告诉你基础类型是object,但是object包含了很多子类型比如Array/Boolean,而第二个Object则告诉你属于什么子类型。

我为什么不直接prop.toString()这样写呢?

因为prop是个不确定的东西,是一个参数,有可能是基础类型,也就没有toString,所以用Object.prototype.toString.call避免报错。

{}.toString() //报错

{}.toString()报错是因为{}被解析成代码块,你应该改成({}).toString()

https://developer.mozilla.org...
https://tc39.github.io/ecma26...
(19.1.3.6)
Object.prototype.toString的表现是标准规定的
根据标准你可以自定义后面那个Object

function Foo(){}
Foo.prototype[Symbol.toStringTag]='Foo'
Object.prototype.toString.call(new Foo)// "[object Foo]"
var Bar={[Symbol.toStringTag]:'Bar'}
Object.prototype.toString.call(Bar)// "[object Bar]"

{}.toString() 

这个报错是因为{}被认为是代码块而不是object

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