会有很多问题需要澄清,所以我会尽量用数字标记它们,以便更容易回答。
最近我一直在研究javascript。有一个主题是“一切皆对象”。
在我的“javascript 解释”中,这意味着一切都在其原型(prototype)链的开头有“对象”。这是正确的吗?
但是原始类型(
string
、number
、boolean
、null
、未定义
)?他们是对象吗?例如,我可以调用"aaa".length
。它是如何工作的?函数是实现 [[Call]] according to this 的对象.那是什么意思? (我想这是关于 fun.call(this, arg1) 的事情,但请帮助我理解这一点。
还有
typeof
运算符。我之前从 MDN 链接过它, 但有些事情令人困惑。typeof "aaa"=== "string"
和typeof String("aaa") === "string"
。这看起来很符合预期,但是 String("aaa") 返回什么?我猜它以某种方式解析输入并从中返回一个字符串原语。这是正确的吗?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/