会有很多问题需要澄清,所以我会尝试用数字标记它们,以便更容易回复。
最近我一直在研究javascript。有一个主题是“一切都是对象”。
在我的“javascript解释”中,这意味着一切都在其原型链的开头有“对象”。这是对的吗?
但原始类型(string
,number
,boolean
,null
,undefined
)呢?他们是对象吗?我可以打电话给"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"
什么?请向我解释其原型链。我在哪个原型和哪个原型上有“aaa”原始字符串值?它与typeof String("aaa")
有什么不同?
我已阅读并观看了很多有关此主题的内容,我认为我需要澄清这些内容。
同样在你的答案中,如果你链接一个外部资源,请总结其重要部分,并说明它的含义,因为我一直在阅读ecmascript规范并且它们很长:)。
此外,如果javascript版本有所不同,请说明。
答案 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 primitive和string 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对象。