typeof new String(“aaa”)===“object”?一切都是对象,但有原始类型?

时间:2012-02-02 09:45:59

标签: javascript function object prototype

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

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

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

  2. 但原始类型(stringnumberbooleannullundefined)呢?他们是对象吗?我可以打电话给"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"什么?请向我解释其原型链。我在哪个原型和哪个原型上有“aaa”原始字符串值?它与typeof String("aaa")有什么不同?

  6. 我已阅读并观看了很多有关此主题的内容,我认为我需要澄清这些内容。

    同样在你的答案中,如果你链接一个外部资源,请总结其重要部分,并说明它的含义,因为我一直在阅读ecmascript规范并且它们很长:)。

    此外,如果javascript版本有所不同,请说明。

2 个答案:

答案 0 :(得分:13)

  

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

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

  

2 \但原始类型(字符串,数字,布尔值,空值,未定义)怎么样?他们是对象吗?我可以称之为“aaa”.length。这有什么作用?

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

  

3 \功能是根据此实现[[Call]]的对象。那是什么意思? (我认为这是关于fun.call(这个,arg1)的东西,但帮助我理解这一点。

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

  

4 \ typeof“aaa”===“string”和typeof String(“aaa”)===“string”。这看起来很令人期待,但String(“aaa”)又回归了什么?我猜它以某种方式解析输入并从中返回一个字符串原语。这是对的吗?

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

  

5 \ typeof new String(“aaa”)===“object”什么?请向我解释它的原型链。我在哪个原型和哪个原型上有“aaa”原始字符串值?它与typeof String(“aaa”)有什么不同?

用作构造函数的

String()返回一个继承自{{1}}的对象,正如您所期望的那样。 string primitivestring object之间存在差异。

当您对某些事情感到困惑时,几乎所有问题都可以通过阅读规范来解答。为方便起见,有一个注释版本的规范available online

答案 1 :(得分:3)

  

1 \在我的“javascript的解释”中,这意味着一切都有了   “对象”在它的原型链的开头。这是对的吗?

答案:不,正如您在问题2中所说,还有原始类型。

  

2 \但原始类型怎么样(字符串,数字,布尔值,null,   未定义)?他们是对象吗?我可以称之为“aaa”.length。怎么样   这有用吗?

答案:不,它们是原始类型,而不是对象。当您调用"aaa".length时,JavaScript会自动将字符串原语包装到String对象并调用该方法或执行属性查找。

  

3 \功能是根据此实现[[Call]]的对象。什么   这是什么意思? (我认为这是关于fun.call的事情(这个,   arg1),但帮助我理解这一点。

Ans:JavaScript中的每个函数实际上都是一个Function对象。

  

4 \ typeof“aaa”===“string”和typeof String(“aaa”)===“string”。   这看起来很令人期待,但String(“aaa”)又回归了什么?一世   猜测它以某种方式解析输入并从中返回一个字符串原语   它。这是对的吗?

Ans:String("aaa")返回一个原始字符串。

  

5 \ typeof new String(“aaa”)===“object”什么?请解释一下   原型链给我。我有哪些原型和原型   “aaa”这个原始字符串值?它与typeof有何不同?   字符串( “AAA”)?

Ans:new String("aaa")返回一个String对象。