一,基本数据类型不是对象
所以用instanceof Object检查,都是返回false
var b='这是一个字符串' //这是基本类型的字符串
var c=new String('这是一个字符串') //这是字符串类的实例对象:一个字符串对象
console.log(b instanceof Object) //false
console.log(b instanceof String) //false
console.log(c instanceof Object) //true
console.log(c instanceof String) //true
console.log(b) //这是一个字符串
console.log(c) //String {"这是一个字符串"}
console.log(c==b) //==会把字符串对象toString:这是一个字符串 //true //这个方法定义在String.prototype.toString
console.log(c===b) //===不会转化 //false
console.log(c.toString()) //这是一个字符串
也就是说,需要区分普通字符串,普通数值和字符串对象,数值对象,前者是基本数据类型,后则是引用数据类型:
var b='这是一个字符串' //这是基本类型的字符串
var c=new String('这是一个字符串对象') //这是字符串类的实例对象:一个字符串对象
var b1=b
b1="这是修改后的字符串"
var c1=c
c1.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=1
var b='这是一个字符串' //这是基本类型的字符串
var c=false
var d=null
var e=undefined
Object.prototype.last="原型链最末尾的"
console.log(a.last) //原型链最末尾的
console.log(b.last) //原型链最末尾的
console.log(c.last) //原型链最末尾的
console.log(d.last) //报错
console.log(e.last) //报错
从这里看,另外三个又有了对象的特征,这是因为暂时js给他们伪装成对象了,其实还是基本数据类型。