值类型,引用类型
值类型也称基本类型string、number、array也就是除了object以外的类型
var a = 'aaaaa'
a.foo = 'bar'
console.log(a.foo)
输出:
undefined
这是因为js内部对基本类型a进行a.foo='bar'操作时,会在内部创建一个对应的包装类型(在上例中也就是一个String类型)的临时对象,对a的操作会有这个基本类型代理,不管是赋值还是调用成员函数(也就是变量a可以使用String的函数,也可以给自己添加属性),操作完后,这个临时对象就释放掉了(给自己添加的属性也一起释放掉了)。下次访问时,会重新创建一个新的临时对象(访问不到释放了的对象中的属性),
比如
a.foo = 'bar'
a.__proto__.foo2 = 'bar2'
console.log(a.foo, a.foo2)
输出:
undefined "bar2"
对__proto__操作起作用不是因为临时对象没有释放,而是临时对象是String,Sring是函数,函数的__proto__是他构造函数的prototype,跟这个函数创建出来的临时对象没关系了。这个临时对象只是引用了他的构造函数的prototype而已(构造函数的prototype不会因为临时对象被释放而被释放)。而所有同类型的对象的构造函数是同一个。也就是同一个prototype,所以可以修改到更深层。
再来看看例一:
var a = 'aaaaa'
var b = a
b = 'ccccc'
console.log(a, b)
输出:
aaaaa ccccc
如果是引用的话,a、b两个值应该一起改变。这是值类型,所以是两个无关的值。
例二:
var a = {name:'aaa'}
var b = a
b.name = 'bbbbb'
console.log(a, b)
输出:
{name: "bbbbb"} {name: "bbbbb"}
引用类型,一个修改,一起改变
例三:
var a = 'aaaaa'
var b = String('aaaaa')
console.log(a === b)
输出:
true
var c = new String('aaaaa')
a == c
true
a === c
false
即使类型不一样,值也是一样的,但是类型不一样