对js值类型和引用类型的一点理解

值类型,引用类型
值类型也称基本类型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


即使类型不一样,值也是一样的,但是类型不一样

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值