Javascript之旅——第五站:说说那些所谓的包装类型
来源:互联网 发布:淘宝质量问题退货 编辑:程序博客网 时间:2024/04/29 00:16
一:String
说到String类型,蛮有意思,平时我们都是这样定义一个string类型,如下图:
但是在js中有一点非常特别,那就是string类型是属于基本类型,不属于引用类型,那就说明string的值是保存在“栈”上面的,而很多语言不是
这样,比如C#,我觉得js不作为引用类型也是情有可原,毕竟它玩不了多线程,而C#中一个线程栈空间只分配1M,如果string在C#中是值类
型的话,那就有爆栈的可能,而js却没有栈空间限制,所以也就不存在爆栈的情况了。
那么下一个问题来了,我们经常会对string进行一系列的操作,比如substring。如下图:
那刚才也说了,string的值是直接保存在栈上面的,那它怎么会有substring呢?按照官网的解释是这样的:这时候会使用String类型把s包装成
引用类型。然后使用String类型的内部实现,正好String内部定义了substring方法,所以其实上面的代码在js的内部应该是这样实现的。
1 var s=new String("hello")2 var r=s.substring(3)3 s="hello"
可以看到,其实包装类型只是在执行代码的一瞬间,将s包装成了String引用类型,然后再调用String引用类型下面的substring方法,继而重新将
“hello”值赋给s,最后的效果就是s="hello", r="lo",如果你仔细观察,你会发现,如果我给s动态的附一个属性,比如color,那么你再次读取color
的话,是不会读取color值的,比如下图:
如果你懂了上面我说的原理,那么你对console.log(s.color)等于undefined 就不足以为奇了,我们可以看到,当我使用s.color="red"的时候,
js引擎发现有调用属性的写法,会立即在后台动态让其包装成String类型,然后就给String下面新增了一个属性color=red,然后内部立刻会重
新设置s的值为“hello”(s="hello"),接下来当你console.log来输出s.color时,js引擎判断又有调用属性的写法,再次new String("hello")了
下,自然在这个新的String类型下面是没有color属性的,所以返回undefined了。
刚才我也说了,这种包装操作是js在后台动态追加和删除的,将基本类型转化为了引用类型,那么两者有多大的区别呢?
<1>:这个不用说,一个栈,一个堆,如果你对C#比较了解,可以认为是一个box和unbox的操作。
<2>: 我们知道所有的引用类型都是继承自object,注意是引用类型,不要被面向对象搞混了,比如在C#中,所有的类型都是object子类,在js
里面却不是这样,我们可以用instanceof看一下。
二:Boolean
如果你懂得了String这个包装类,那么其实Boolean包装类跟它是一个原理,只不过在Boolean类型的使用中,是有一个注意事项的,我们
知道一个引用类型,除非它是null或者undefined,否则它永远都是true,而这个Boolean类型正是做了这个box操作,如下图:
- Javascript之旅——第五站:说说那些所谓的包装类型
- Javascript之旅——第五站:说说那些所谓的包装类型
- 说说 JavaScript 基本包装类型
- 《Javascript高级程序设计》读书笔记之——基本包装类型
- Javascript之基本包装类型
- JavaScript之基本包装类型
- javascript类型系统——包装对象
- javascript基本包装类型学习笔记之----基本包装类型的基本特点
- Javascript之旅——第七站:说说js的调试
- Javascript之旅——第七站:说说js的调试
- javascript高级程序设计--第五章基本包装类型开始
- 浅谈JavaScript引用类型——基本包装类型
- 《JavaScript 闯关记》之基本包装类型
- 说说JavaScript那些事
- 说说JavaScript那些事
- 那些所谓的曾经
- 迎接2012之JavaScript所谓的“重载”
- javascript学习——基本包装类型总结
- A1 = ?
- 常见的6种传值 ------ 代理(delegate)传值 单例传值 Target-Action传值 属性传值 block传值 通知传值
- 定制keil开发环境
- maven常见问题问答
- 如何查找生成的dll出错原因
- Javascript之旅——第五站:说说那些所谓的包装类型
- Cocos2dx 使用Cocostudio导出文件支持.ttf格式字体
- 黑马程序员——java基础之薄弱点总结(三)
- 点击超链接调用javascript函数
- 机器视觉光源基础知识1
- 懒加载异常org.hibernate.LazyInitializationException: could not initialize proxy - no
- 自动化存储物流系统
- Android生命周期介绍
- Maven实战(二)构建简单Maven项目