为什么基本类型可以调用方法——以字符串为例
引用类型中的基本包装类型
对于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
为什么基本类型可以调用方法——以字符串为例相关推荐
- 对对象类型和调用方法属性进行存储以提升反射性能
反射的性能差是一个公认的事实.而最耗性能的还是根据程序集获取要调用的对象,而在对象里搜索要调用的方法所耗性能到不不是很多,如果对象里的方法不是特别的多,而去可以指定相关参数提高搜索的效率,比如Bind ...
- C#圆通快递电子面单api接口调用方法
快递电子面单支持多家快递物流公司单号获取.分拣码返回.面单打印.在线下单发货.通知快递员上门取件等功能,可用于电商平台.自营商城.打单工具.WMS仓储系统.APP等需要发货的场景,可有效提高商家的打印 ...
- 【Android NDK 开发】JNI 方法解析 ( 字符串数组参数传递 | 字符串遍历 | 类型强转 | Java 字符串与 C 字符串转换 | 字符串释放 )
文章目录 I . C/C++ 中的 Java 字符串数组类型 II . 获取字符串数组长度 III . 获取字符串数组元素 IV . 类型强转 ( jobject -> jstring ) V ...
- Java反射————Method根据方法名称字符串调用方法
引言 之前浏览廖雪峰老师的个人博客网站,无意间发现了关于在Java8中获取参数的方法,随手一转<Java 8中获取参数名称>,没想到今天遇到一个功能,非常符合这种反射调用的使用场景.回看了 ...
- C++调用Go方法的字符串传递问题及解决方案
摘要:C++调用Go方法时,字符串参数的内存管理需要由Go侧进行深度值拷贝. 现象 在一个APP技术项目中,子进程按请求加载Go的ServiceModule,将需要拉起的ServiceModule信息 ...
- c++代码转为go_C++调用Go方法的字符串传递问题及解决方案
摘要:C++调用Go方法时,字符串参数的内存管理需要由Go侧进行深度值拷贝. 现象 在一个APP技术项目中,子进程按请求加载Go的ServiceModule,将需要拉起的ServiceModule信息 ...
- 【转载】 C#中使用int.TryParse方法将字符串转换为整型Int类型
在C#编程过程中,将字符串string转换为整型int过程中,时常使用的转换方法为int.Parse方法,但int.Parse在无法转换的时候,会抛出程序异常,其实还有个int.TryParse方法可 ...
- python中字符串类型的encode()方法_第五章 Python字符串常用方法详解
5.1 Python字符串拼接(包含字符串拼接数字) 在 Python中拼接(连接)字符串很简单,可以直接将两个字符串紧挨着写在一起,具体格式为: strname = "str1" ...
- java int.tryparse_【转载】 C#中使用int.TryParse方法将字符串转换为整型Int类型
在C#编程过程中,将字符串string转换为整型int过程中,时常使用的转换方法为int.Parse方法,但int.Parse在无法转换的时候,会抛出程序异常,其实还有个int.TryParse方法可 ...
最新文章
- android 学习记录-----------android 活动 意图 碎片
- 【Qt开发】V4L2 API详解 Buffer的准备和数据读取
- 如何听节拍器_如何用节拍器卡节拍?节拍器的使用方法!
- 【深度学习】使用预训练模型
- 基于Hosted WebCore 方式部署Web Role
- 面试官:谈谈分布式一致性机制,我一脸懵逼。。
- Java学习(16-20天, 线性数据结构)
- 非平稳时间序列突变检测 -- Bernaola Galvan分割算法
- Linux上的Redis客户端软件G-dis3
- Functional JavaScript: 使用 Transducer 提升函数式性能
- GridView自带分页 1/总页数 首页 下一页 上一页 尾页 X 页 go 实现方法
- 转:我通过微软亚洲研究院面试的经历
- 如何云储存服务实现视频存储
- 一群阿里码农的公益实践:用技术禁毒、打拐
- 喜马拉雅下载器打赏页面
- 无需写代码,又一个数据动态图制作利器
- python中字符串输出乱码怎么解决_python字符乱码的解决小结
- 无屏幕有线情况下笔记本电脑连接树莓派
- Android 开发:(十四)NavigationBar篇-自定义顶部导航栏
- 谷歌浏览器显示oracle,css让table不显示边框的代码在火狐和谷歌浏览器中无效