引用类型中的基本包装类型

对于str.substring(2)这种方法我们经常使用,

var str = "hello world";

var s1 = str.substring(2);

可是str明明是个字符串(基本类型),又不是对象,为什么可以调用方法呢。。。。

解释说明:

当我们用str这个字符串调用方法时,后台已经为我们做了一系列操作,让我们来看看究竟都做了哪些操作呢

当第二行代码访问str时,访问过程处于一种读取模式(即从内存中读取这个字符串的值),而在读取模式下访问字符串时,后台会做如下处理

a.创建String类型的一个实例

b.在实例上调用指定的方法

c.销毁这个实例

针对此处代码,可以想象是后台进行了如下处理

var str = new String("hello world");

var s1 = str.substring(2);

str = null;

到此就解释了为什么字符串这个基本类型可以调用方法了。

———————————————分割线——————————————————

接下来我们了解下基本包装类型,即用到的new String("hello world")

为了便于操作基本类型,ECMAScript提供了三个特殊的引用类型:Boolean、Number和String。

实际上,每当读取一个基本类型的值时,后台就会创建一个对应的基本包装类型的对象,就如上面的例子所示。

引用类型和基本包装类型的区别

主要是对象生存周期的不同

a.使用new创建的引用类型的实例,在执行流离开当前作用域之前都一直保存在内存中,

b.自动创建的包装类型的对象只存在于一行代码的执行瞬间,然后被立即销毁

举个栗子

var str = “hello world”;

str.color = "red";

alert(str.color);  //undefined

第二行代码创建的String对象在执行第三行代码时已经被销毁,第三行代码又创建了自己的String对象,而该对象没有color属性。

当然可以显示的调用String、Boolean和Number来创建基本包装类型的对象,但是再不是绝对必要的情况下不建议使用,这样很容易让人分不清楚是在处理基本类型还是引用类型的值。

Object构造函数也会像工厂方法一样,根据传入值的基本类型返回相应基本包装类型的实例。例如

var obj = new Object("hello world");

alert(obj instanceof String ) ;   //true

需要注意的是:

使用new 调用基本包装类型的构造函数,与直接调用同名的转型函数是不一样的

var value = “25”;

var number = Number(value);   //转型函数

alert(typeof number);   // "number"

var obj = new Number(value);

alert( typeof obj );    // "object"

此处number中保存的是基本类型的值25

obj中保存的是Number的实例

——参考《javascript 高级程序设计》第五章的第六节的基本包装类型

转载于:https://www.cnblogs.com/xue6666/p/9174995.html

为什么基本类型可以调用方法——以字符串为例相关推荐

  1. 对对象类型和调用方法属性进行存储以提升反射性能

    反射的性能差是一个公认的事实.而最耗性能的还是根据程序集获取要调用的对象,而在对象里搜索要调用的方法所耗性能到不不是很多,如果对象里的方法不是特别的多,而去可以指定相关参数提高搜索的效率,比如Bind ...

  2. C#圆通快递电子面单api接口调用方法

    快递电子面单支持多家快递物流公司单号获取.分拣码返回.面单打印.在线下单发货.通知快递员上门取件等功能,可用于电商平台.自营商城.打单工具.WMS仓储系统.APP等需要发货的场景,可有效提高商家的打印 ...

  3. 【Android NDK 开发】JNI 方法解析 ( 字符串数组参数传递 | 字符串遍历 | 类型强转 | Java 字符串与 C 字符串转换 | 字符串释放 )

    文章目录 I . C/C++ 中的 Java 字符串数组类型 II . 获取字符串数组长度 III . 获取字符串数组元素 IV . 类型强转 ( jobject -> jstring ) V ...

  4. Java反射————Method根据方法名称字符串调用方法

    引言 之前浏览廖雪峰老师的个人博客网站,无意间发现了关于在Java8中获取参数的方法,随手一转<Java 8中获取参数名称>,没想到今天遇到一个功能,非常符合这种反射调用的使用场景.回看了 ...

  5. C++调用Go方法的字符串传递问题及解决方案

    摘要:C++调用Go方法时,字符串参数的内存管理需要由Go侧进行深度值拷贝. 现象 在一个APP技术项目中,子进程按请求加载Go的ServiceModule,将需要拉起的ServiceModule信息 ...

  6. c++代码转为go_C++调用Go方法的字符串传递问题及解决方案

    摘要:C++调用Go方法时,字符串参数的内存管理需要由Go侧进行深度值拷贝. 现象 在一个APP技术项目中,子进程按请求加载Go的ServiceModule,将需要拉起的ServiceModule信息 ...

  7. 【转载】 C#中使用int.TryParse方法将字符串转换为整型Int类型

    在C#编程过程中,将字符串string转换为整型int过程中,时常使用的转换方法为int.Parse方法,但int.Parse在无法转换的时候,会抛出程序异常,其实还有个int.TryParse方法可 ...

  8. python中字符串类型的encode()方法_第五章 Python字符串常用方法详解

    5.1 Python字符串拼接(包含字符串拼接数字) 在 Python中拼接(连接)字符串很简单,可以直接将两个字符串紧挨着写在一起,具体格式为: strname = "str1" ...

  9. java int.tryparse_【转载】 C#中使用int.TryParse方法将字符串转换为整型Int类型

    在C#编程过程中,将字符串string转换为整型int过程中,时常使用的转换方法为int.Parse方法,但int.Parse在无法转换的时候,会抛出程序异常,其实还有个int.TryParse方法可 ...

最新文章

  1. android 学习记录-----------android 活动 意图 碎片
  2. 【Qt开发】V4L2 API详解 Buffer的准备和数据读取
  3. 如何听节拍器_如何用节拍器卡节拍?节拍器的使用方法!
  4. 【深度学习】使用预训练模型
  5. 基于Hosted WebCore 方式部署Web Role
  6. 面试官:谈谈分布式一致性机制,我一脸懵逼。。
  7. Java学习(16-20天, 线性数据结构)
  8. 非平稳时间序列突变检测 -- Bernaola Galvan分割算法
  9. Linux上的Redis客户端软件G-dis3
  10. Functional JavaScript: 使用 Transducer 提升函数式性能
  11. GridView自带分页 1/总页数 首页 下一页 上一页 尾页 X 页 go 实现方法
  12. 转:我通过微软亚洲研究院面试的经历
  13. 如何云储存服务实现视频存储
  14. 一群阿里码农的公益实践:用技术禁毒、打拐
  15. 喜马拉雅下载器打赏页面
  16. 无需写代码,又一个数据动态图制作利器
  17. python中字符串输出乱码怎么解决_python字符乱码的解决小结
  18. 无屏幕有线情况下笔记本电脑连接树莓派
  19. Android 开发:(十四)NavigationBar篇-自定义顶部导航栏
  20. 谷歌浏览器显示oracle,css让table不显示边框的代码在火狐和谷歌浏览器中无效

热门文章

  1. System.Threading.Timer类的TimerCallback 委托
  2. 使用BIOS以及直接写显存绘制图形
  3. Spring配置文件applicationContext.xml的两种拆分方式
  4. hadoop1.2.1伪分布模式安装教程
  5. 01背包java 源码
  6. ACM 模板--邻接表 有向图 拓扑排序
  7. 图 深度优先遍历 广度优先遍历 非递归遍历 图解算法过程
  8. Java动态调用方法
  9. 初识OSGI.NET插件框架
  10. 操作系统经典书籍--现代操作系统