javascript - typeof 新字符串 ("aaa") === "object"?万物皆对象,却有原始类型?

标签 javascript function object prototype

会有很多问题需要澄清,所以我会尽量用数字标记它们,以便更容易回答。

最近我一直在研究javascript。有一个主题是“一切皆对象”。

  1. 在我的“javascript 解释”中,这意味着一切都在其原型(prototype)链的开头有“对象”。这是正确的吗?

  2. 但是原始类型(stringnumberbooleannull未定义)?他们是对象吗?例如,我可以调用 "aaa".length。它是如何工作的?

  3. 函数是实现 [[Call]] according to this 的对象.那是什么意思? (我想这是关于 fun.call(this, arg1) 的事情,但请帮助我理解这一点。

    还有 typeof 运算符。我之前从 MDN 链接过它, 但有些事情令人困惑。

  4. typeof "aaa"=== "string"typeof String("aaa") === "string"。这看起来很符合预期,但是 String("aaa") 返回什么?我猜它以某种方式解析输入并从中返回一个字符串原语。这是正确的吗?

  5. typeof new String("aaa") === "object" 什么?请给我解释一下它的原型(prototype)链。我在哪里以及在哪个原型(prototype)上有“aaa”原始字符串值?它与 typeof String("aaa") 有何不同?

我已经阅读和观看了很多关于该主题的内容,我认为我需要澄清这些内容。

此外,在您的回答中,如果您链​​接了外部资源,请总结其重要部分,并说明其含义,因为我一直在通读 ecmascript 规范,它们很长:)。

此外,如果 javascript 版本存在差异,请也说明。

最佳答案

1\ In my "interpretation of javascript" that means everything has the "object" in the beginning of it's prototype chain. Is this correct?

是也不是。默认情况下,所有对象都继承自 Object。使用 ES5 的 Object.create 有可能拥有一个不从 Object 继承的对象,但它仍然是一个对象。

2\ But what about the primitive types (string, number, boolean, null, undefined)? Are they objects? I can call "aaa".length for example. How does that work?

认为在 JavaScript 中一切都是对象是一种误解。基元不是对象,但可以将它们转换为对象。当使用 . 运算符时,左操作数将转换为对象 ( if possible )。

3\ Functions are objects implementing [[Call]] according to this. What does that mean? (I'm thinking it's something about fun.call(this, arg1), but help me understand this.

[[Call]] 是 ECMAScript 实现用来将对象标记为函数的内部方法。它与Function.prototype.call没有直接关系,它本身也是一个标有[[Call]]的函数。参见 13.2.1 [[Call]] .

4\ typeof "aaa" === "string" and typeof String("aaa") === "string". This seems quite expectable, but what does String("aaa") return? I guess it parses the input somehow and returns a string primitive from it. Is this correct?

String(),当不用作构造函数时,converts its argument to a string primitive .所以 String("aaa")"aaa".toString() 相同。在这种情况下,这是多余的和不必要的。

5\ typeof new String("aaa") === "object" What? Please explain it's prototype chain to me. Where and on which prototype do I have the "aaa" primitive string value on this? How does it differ from typeof String("aaa")?

用作构造函数的

String() 返回一个继承自 String() 的对象,如您所料。 string primitive 之间有区别和一个 string object .

当您对某事感到困惑时,几乎所有的问题都可以通过阅读规范得到解答。为了您的方便,这里有一个带注释的规范版本 available online .

关于javascript - typeof 新字符串 ("aaa") === "object"?万物皆对象,却有原始类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9110111/

相关文章:

javascript - 哪个更快 : input[type ="checkbox"] or :checkbox?

javascript - 如何循环遍历 foreach() 内的元素

减法期间的 Javascript 意外行为

javascript - 如何在 datatable.net 数据表中设置输入边框颜色并禁用数字微调器

Javascript循环创建函数并使用收到的基于PHP查询的id附加值

c++ - C++ 中的 ObjA = ObjB

c - 在不修改源代码的情况下在C中显示文件名、行号和函数

javascript - 使用 $.each() 清理传递给函数的变量

javascript - 使用 javascript 控制 .mov (<object>) 文件?

javascript - 获取对象属性