基本类型有没有属性?
答案是NO
那从上面图中,明显可看出s1的数据类型为‘string’,它就是基本类型啊,怎么还会有length属性呢?
为了解释这个问题,就得来看JS的设计者Brendan Eich他的设计思路了。
JS的设计思路
Brendan Eich在设计JS时,被要求抄袭Java,于是他从表面上抄袭了Java,他设计了两套初始化变量的方式。以字符串来说:1
2var s1 = '12345'
var s2 = new String('12345')
这两种声明方式是有区别的。
区别:类型不同,s1是基本类型,s2是复杂类型。从下面的图中可以更好的了解。

s2有六个属性,分别为0 1 2 3 4 length。JS之父为了让这个语言看上去更像Java,他用了一个小技巧,让不是对象的东西,也可以用对象的属性。当我们写s1.length时,JS引擎会创建一个临时的new String(s1),也就是一个临时的对象(tempObject),由于tempObject是个对象,那它自然会有length属性,只不过这种临时对象用了之后马上就会死,也就是说,在我们调用s1.length时,JS引擎当场给你包装一个有length属性的‘临时对象’。
为了证明这个观点,我们给s1添加一个属性s1.name = 'hello',我们看看控制台会打出什么,
第一次,我们添加这个属性值时,JS引擎会看成这样,tempObject.name = 'Allen',而我们第二次调用s1.name时,JS引擎也会看出这样,tempObject.name,没有传属性值,显然打出的值为undefined,也就是说,第一次我们传入的属性值,在控制台打出之后,就已经在内存中不存在了,所以第二次调用该属性的时候是没有值的。
基本类型不是对象