gpt4 book ai didi

javascript - 为什么 `Object.prototype.toString` 总是返回 `[object *]` ?

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:51:13 24 4
gpt4 key购买 nike

如果调用 Object.prototype.toString.call(anything),结果总是 [object Something],其中 Something 可能是几件事之一。我的问题是为什么“对象”部分在那里?总是把它放在那里似乎是多余的。它不会告诉您有关传入参数的任何信息。

Object.prototype.toString.call(null);
=> [object Null]

Object.prototype.toString.call(undefined);
=> [object Undefined]

由于 nullundefined 不是对象(并且 CheckObjectCoercible 失败),“对象”部分真的、真的看起来毫无意义。

我不得不认为最初有某种原因将“对象”部分放在那里,即使从那以后这个原因已经丢失,现在只是出于历史原因而被保留下来。

任何人都可以帮助阐明这一点吗?


明确地说,我已经知道如何使用 Object.prototype.toString 获取对象的 [[Class]](类型)。我的问题涉及返回字符串格式的原因——特别是开头的“对象”部分。我想知道这部分是否曾经有过原因,或者这部分将来是否有可能的原因。也许将来它可以返回“对象”以外的东西?我可以期望它总是返回“对象”吗?如果是这样,为什么它甚至返回它?谁希望无论输入是什么,函数总是返回相同的东西?

最佳答案

Annex F of the ES5.1 specification这是关于 Object.prototype.toString 的:

15.2.4.2: Edition 5 handling of undefined and null as this value caused existing code to fail. Specification modified to maintain compatibility with such code. New steps 1 and 2 added to the algorithm.

这是在 ES5.1 规范中进行的更正。在 ES5 之前,将 null 或 undefined 传递给 toString 总是导致传递全局对象。 ES5 中与严格模式相关的更改导致 null 和 undefined 不加修改地传递。按照 ES5 中的规定,将 null 或 undefined 传递给 Object.prototype.toString 会导致 TypeError 异常。此异常破坏了一些现有代码,因此我们必须修复规范以在这种情况下不抛出。

那么 toString 应该为 null 和 undefined 返回什么?事实证明,许多现有代码还期望 Object.prototype.toString 始终返回 "[object *]" 形式的字符串。因此,我们决定让 null 和 undefined 产生 "[object Null]""[object Undefined]"

这似乎奏效了,并且通常允许现有的基于 ES3 的代码在 ES5/5.1 中存在与严格模式相关的更改的情况下继续工作。

关于javascript - 为什么 `Object.prototype.toString` 总是返回 `[object *]` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13151809/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com