【问题标题】:Why [object Object] mentions "object" twice?为什么 [object Object] 两次提到“object”?
【发布时间】:2015-07-03 01:38:19
【问题描述】:

[object Object] 是 JavaScript 对象的默认字符串表示形式。

如果只是[Object] 或[object] 我会理解,但为什么是[object Object]?为什么第一个单词是小写,第二个是大写?它是 JSON 还是 JavaScript 的一部分?

【问题讨论】:

  • 如果自定义对象中没有重写此方法,toString() 将返回“[object type]”,其中 type 是对象类型。 (ref)
  • 与[object RegExp] 或[object Array] 中包含object 的原因相同:因为它是object。

标签: javascript json object


【解决方案1】:

所有对象都有一个toString 方法,该方法以[object type] 格式显示某些内容,其中type 是对象类型。

在null 上调用时会得到[object Null],在对象上调用时会得到字符串[object Object],因为它基于Object constructor(大写“O”),这就是它说object 两次的原因,它是一个类型的对象 Object.

MDN

JSON 是一种轻量级的数据交换格式,除了被命名为 “JavaScript Object Notation” 之外,它与 JavaScript 没有任何关系,因为它像 JavaScript 对象一样编写。

【讨论】:

  • @Oriol - 不,所有对象都有一个 toString 方法,唯一不会的方法是如果你专门用其他东西覆盖它(从技术上讲,它们仍然会),这不是真的相关的。第二个词是对象的类型,也称为类,和原语没有关系?
  • 我在想Object.create(null),它没有属性。关于第二个词:如果在原语上调用 Object.prototype.toString,它将是它的类型;如果在对象上调用它,它将是 [[Class]](例如 Object、Array、Date),而不是它的类型(始终是 Object)。只是吹毛求疵:)
  • Object.create(null) 是一个非常特殊的情况,它是创建类似对象的唯一方法,该对象不从任何地方继承,因此没有属性。 Object.prototype.toString 可能更特别,因为它是 Object 构造函数的原型,只能在对象上调用,除非你特意在原语上执行 Object.prototype.toString.call,你可能会仍然得到[object String] 等。这些都是牵强附会的边缘案例,甚至MDN 也决定将它们排除在外。
【解决方案2】:

如果只是[Object]或[object]我会理解,但为什么是[object Object]?

因为它是从基本的Object 类创建的一个对象。

来自the spec:

返回三个字符串“[object”、class 和“]”连接的结果字符串值。


它是 JSON 还是 JavaScript 的一部分?

它与 JSON 完全无关。

【讨论】:

    【解决方案3】:

    第一个object 表示被记录的事物的类型是一个对象。它也在语言规范here 中进行了硬编码。

    第二个Object表示构造函数属性,例如:

    Object.prototype.toString.call(""); // [object String]
    

    算法只是说:“获取对象的 [[class]] 属性,然后返回 '[object' + class + ']'。

    【讨论】:

      【解决方案4】:

      你基本上已经碰到了洞穴的柏拉图式墙端。如果一切都是对象,那么对象的超集是什么?在这里,答案体现在代码中,它只是对象。

      因此所有对象都是对象。

      欢迎来到循环。

      【讨论】:

        猜你喜欢
        • 2016-06-16
        • 1970-01-01
        • 2013-10-20
        • 2011-07-13
        • 1970-01-01
        • 2014-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多