一,基本数据类型不是对象
所以用instanceof Object检查,都是返回false
var b='这是一个字符串' //这是基本类型的字符串var c=new String('这是一个字符串') //这是字符串类的实例对象:一个字符串对象console.log(b instanceof Object) //falseconsole.log(b instanceof String) //falseconsole.log(c instanceof Object) //trueconsole.log(c instanceof String) //trueconsole.log(b) //这是一个字符串console.log(c) //String {"这是一个字符串"}console.log(c==b)//==会把字符串对象toString:这是一个字符串 //true //这个方法定义在String.prototype.toStringconsole.log(c===b) //===不会转化 //falseconsole.log(c.toString()) //这是一个字符串
也就是说,需要区分普通字符串,普通数值和字符串对象,数值对象,前者是基本数据类型,后则是引用数据类型:
var b='这是一个字符串' //这是基本类型的字符串var c=new String('这是一个字符串对象') //这是字符串类的实例对象:一个字符串对象var b1=bb1="这是修改后的字符串"var c1=cc1.name="增加一个属性"console.log(b) //这是一个字符串console.log(b1) //这是修改后的字符串//于是得出,它是基本数据类型,存储在栈中,存的是值console.log(c) //String {"这是一个字符串对象", name: "增加一个属性"}console.log(c1) //String {"这是一个字符串对象", name: "增加一个属性"}// 于是可以证明,c是一个字符串对象,在栈中存的是引用
二,基本数据类型不能添加属性,但除了undefined和null外,可以访问属性
在《javascript高级程序设计》的第69页有这么一句话:
我们不能给基本数据类型的值添加属性,尽管这样做不会导致任何错误,因为添加的属性会不见掉。我们只能给引用类型的值动态地添加属性。
var b='这是一个字符串' //这是基本类型的字符串b.name="字符串"//基本数据类型不能添加属性console.log(b.name) //undefined
然而,除了null和undefined却又可以顺着原型链访问原型链上的属性:
var a=1var b='这是一个字符串' //这是基本类型的字符串var c=falsevar d=nullvar e=undefinedObject.prototype.last="原型链最末尾的"console.log(a.last) //原型链最末尾的 console.log(b.last) //原型链最末尾的 console.log(c.last) //原型链最末尾的 console.log(d.last) //报错console.log(e.last) //报错
从这里看,另外三个又有了对象的特征,这是因为暂时js给他们伪装成对象了,其实还是基本数据类型。