js中的装箱和拆箱操作

先介绍一下js的基本包装类型:

基本包装类型特殊的引用类型。每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象,从而可以调用属性、方法来进行后续操作。

ECMAScript还提供了三种基本包装类型:NumberStringBoolean

基本包装类型与引用类型的主要区别是对象的生命周期。使用new操作符创建的引用类型的实例,在执行流离开当前作用域之前都一直保存。而自动创建的基本包装类型的对象则只存在于一行代码。

今天来看一下两个概念:装箱和拆箱。

装箱:

将基本数据类型转换为对应的引用类型的操作。

这是什么意思呢?来看一段代码

var str='string'
console.log(str.substring(0,3))  //str

str作为一个值为什么能够调用方法呢?

根据概念可以知道装箱就是把str这个String类型的基本数据转换为String这个特殊的引用类型。因此才能够使用对象的方法。

上面的代码的解析步骤为:

  • 创建String类型的一个实例
  • 在实例中调用制定的方法
  • 销毁这个实例
var s1 = new String('string'); //创建实例
var s2 = s1.substring(0,3);//调用方法
s1 = null;  //销毁实例

就是临时创建了一个对象,调用方法后销毁。

拆箱:

看名称也知道就是与装箱的操作相反嘛,把引用类型转换成基本的数据类型
拆箱主要使用两个方法:valueOf()和toString()
valueOf()
如果对象存在任意原始值(undefined、null、布尔值、数字、和字符串),它就默认将对象转换为表示它的原始值,如果对象是复合值,而且大多数对象无法真正表示为一个原始值,因此默认的valueOf( )方法简单地返回对象本身,而不是返回一个原始值。
数组、函数、和正则表达式简单的继承了这个默认方法,调用这些类型的实例的valueOf( )方法只是简答返回对象本身.

toString()
返回对象的字符串表示。

对象 操作
默认 返回 “[object class]”,其中 class是对象类型的名称。其中class是该对象的类:值为”Object”、”String”、”Number”、”Function”、”Window”、”Document”、等。
Array 将 Array 的元素转换为字符串。结果字符串由逗号分隔,且连接起来
Boolean 如果 Boolean 值是 true,则返回 “true”。否则,返回 “false”。
Date 返回日期的文字表示法。
Error 返回一个包含相关错误消息的字符串。
Function 返回如下格式的字符串,其中 functionname 是被调用 toString 方法函数的名称:function functionname( ) { [native code] }
RegExp 返回正则表达式直接量的字符串
Number 返回数字的文字表示。
String 返回 String 对象的值。

根据不同的对象调用不同的方法进行拆箱操作,例如

var num=new Number(10)
var str=new String('string')

对num对象进行拆箱就需要用到valueOf,而不是toString,因为toString返回的是对象num对象的字符串,不是num对象的基本数据类型
console.log(typeof num.valueOf())  //number
console.log(typeof num.toString())  //string

而str对象是一个字符串对象,所以就直接用toString
console.log(typeof str.toString())  //string
发布了20 篇原创文章 · 获赞 33 · 访问量 3237

猜你喜欢

转载自blog.csdn.net/qq_42880714/article/details/104694199