请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

__proto__

var str1 = '123';

var str2 = new String('456');

str1.__proto__ === str2.__proto__

我记得老师在课上讲过,引用类型才有__proto__这个属性,为啥这里这个值类型会有__proto__这个属性呢?


正在回答

2回答

首先你应该先问:值类型有属性吗?

其实,这里有一个弯儿,就是访问值类型的属性时,js 会默默的将值类型转换为引用类型的形式,然后再去执行。例如 str1.length str1.replace 等等。

你说的 str1.__proto__ 也是一个道理

0 回复 有任何疑惑可以回复我~
  • 提问者 V金龙V #1
    你回答的太模糊,不过给了我一些提示。
    首先我问了谷歌:“javascript 值类型调用方法如何转换成引用类型”,然后找到了一个基本包装类型,再然后我又在高程3里面找到了关于包装类型的解说。值类型调用方法,它是这样的一个过程(这个都是后台自动创建):
    1. var str1 = new String('123');      创建一个String实例
    2. str2  = str1.substring(2) ;             调用实例方法
    3. str1 = null                                     销毁这个实例
    最后,这个字符串就变得跟对象一样了。只不过它们作为对象的生存周期是不一样的。真实使用new创建的引用类型的实例,它的生存周期是在执行流离开当前作用域之前一直保存在内存中,而值类型被包装成基本引用类型是在值类型调用属性执行时立刻被销毁,这意味着值类型调用虽然被包装成了基本引用类型,但是它无法给自己添加属性或者方法。
    回复 有任何疑惑可以回复我~ 2017-12-02 13:47:40
  • 兮漫天 回复 提问者 V金龙V #2
    是这么一回事!
    回复 有任何疑惑可以回复我~ 2019-04-26 23:43:36
兮漫天 2019-04-26 23:42:53

去理解下基本包装类型就明白了哈~因为  string number boolean 在使用一些方法的时候,会自动转为基本包装类型!基本包装类型也是一个对象,只不过是对象的实例,所以有__proto__,这也是ECMA里面对于js戏称万物皆对象的其中一个版本的由来......

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信