为什么'abc'.hasOwnProperty('length')== true

sli*_*ype 2 javascript prototype prototypal-inheritance

在这种情况下,请帮助我理解原型继承:

为什么'abc'.hasOwnProperty('length')返回true但'length' in 'abc'会抛出错误?

Poi*_*nty 8

该表达式'abc'.hasOwnProperty('length')由JavaScript解释为

(new String('abc')).hasOwnProperty('length')
Run Code Online (Sandbox Code Playgroud)

每个(capital-S)String实例都有自己的length属性,它给出了字符串的长度.

JavaScript(小写s)字符串实例是基元,根本没有任何属性.使用字符串原语作为.运算符的左侧会导致字符串原语隐式包装在String对象中(至少在概念上;运行时实际上不必实例化瞬态对象),这就是.length属性的位置来自.

该表达式length in 'abc'抛出异常,因为没有使用运算符将原语 隐式提升为'abc'String实例in.因此,由于原语不能具有任何属性,并且该概念没有意义,因此它是一个例外.