javaScript高级程序设计之基本包装类型疑惑

步于 2017-07-05 09:03:07
引用类型与基本包装类型的区别

引用类型与基本包装类型的主要区别就是对象的生存期。

使用 new 操作符创建的引用类型的实例,在执行流离开当前作用域之前,会一直保存在堆内存中。而后台自动创建的基本包装类型的对象,则只存在一行代码的执行瞬间,然后立即被销毁。这意味着我们不能为基本类型的值添加属性和方法。

看了上面的原理,再来看例子:

var str = "some text";
str.color = "red";
console.log(str.color); // undefined

在此,第二行代码试图为字符串str添加一个color属性。但是当第三行代码再次访问str时,其color属性又不见了。问题的原因就是第二行创建的String对象在执行第三行代码时已经被销毁。执行到第三行时,第三行代码又创建了自己的 String 对象,然而这个对象没有 color 属性。一切都显得那么清晰。
疑问1:“只存在一行代码执行瞬间”怎么理解,是指 var str="some text" 这行吗?立即被销毁后,str里还有引用吗?
疑问2:“问题的原因就是第二行创建....”这里说创建了String对象,是哪儿对象?color属性吗?此时的str是啥状态?
疑问3:"第三行代码又创建了自己的String对象.." 是指又创建了str?
望高手不吝指点
...全文
278 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
JavaTree2017 2017-07-21
  • 打赏
  • 举报
回复
二楼三楼已给出回复 每当读取一个基本类型值的时候,后台会创建相应基本包装类型的对象,调用了指定方法后销毁实例。 所以这里创建了两次String对象,并且也都销毁,所以第一次设置的值也就不会在第二次里得到。
ipqtjmqj 2017-07-06
  • 打赏
  • 举报
回复
你仔细看前面的话就应该明白,str是基本类型,本应该不能添加方法,之所以可以是临时创建了一个String对象。 若把str改成String类型,就可以输出了 var str = new String("some text"); str.color = "red"; console.log(str.color); // red
天际的海浪 2017-07-05
  • 打赏
  • 举报
回复
var str = "some text"; str.color = "red";//这个相当于,创建一个String对象赋值给一个临时地址(创建String对象的值与str一样,但两者间没有关联)。执行 临时地址.color = "red",之后立即销毁这个String对象,这就是“创建的String对象只存在这一行代码执行瞬间”。这期间str没有任何变化 console.log(str.color); // 再次创建一个String对象赋值给一个临时地址,获取临时地址.color,之后再次立即销毁这个String对象。这期间str还是没有任何变化

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧