JavaScript中的包装类
<h1 style="text-align: center">JavaScript中三个包装类</h1><p><span style="font-size: 14pt">JS数据类型分类:</span></p>
<p><span style="font-size: 14pt"> 基本数据类型:Stiring、Number、Boolean、Undefined、Null、<span style="color: rgba(255, 0, 0, 1)">Symbol、BigInt(ES6新增)</span></span></p>
<p><span style="font-size: 14pt"> 引用数据类型:Object</span></p>
<h2>前言</h2>
<p><span style="font-size: 18px">在学习JavaScript时,我们是否会有一个疑问,在JS中不仅引用类型(如Object、Array等)有属性和方法,而且连基本类型(如string、number)也有属性和方法,这是怎么回事呢?</span></p>
<p> </p>
<p><span style="font-size: 18px">其实啊,JS为我们提供了三个包装类,通过这三个包装类可以将基本数据类型的数据转换为对象</span></p>
<p><span style="font-size: 18px"> String()</span></p>
<p><span style="font-size: 18px"> - 可以基本数据类型字符串转换为String对象</span></p>
<p><span style="font-size: 18px"> Number()</span></p>
<p><span style="font-size: 18px"> - 可以基本数据类型数字转换为Number对象</span></p>
<p><span style="font-size: 18px"> Boolean()</span></p>
<p><span style="font-size: 18px"> - 可以基本数据类型布尔值转换为Boolean对象</span></p>
<p> </p>
<h2>创建基本数据类型的对象</h2>
<p><span style="font-size: 18px; color: rgba(255, 102, 0, 1)"> var str = new String('hello') <span style="color: rgba(255, 0, 0, 1)">// str是一个值为'hello'的对象 即:String{'hello'}</span></span></p>
<p><span style="font-size: 18px; color: rgba(255, 102, 0, 1)"> var str1 = 'hello'</span></p>
<p><span style="font-size: 18px; color: rgba(255, 102, 0, 1)"> var num = new Number(3) <span style="color: rgba(255, 0, 0, 1)">// num是一个值为3的对象 即:String{'hello'}</span></span></p>
<p><span style="font-size: 18px; color: rgba(255, 102, 0, 1)"> var num1 = 3</span></p>
<p><span style="font-size: 18px; color: rgba(255, 102, 0, 1)"> var bool = new Boolean(true) <span style="color: rgba(255, 0, 0, 1)">// bool是一个值为true的对象 即:String{'hello'}</span></span></p>
<p><span style="font-size: 18px; color: rgba(255, 102, 0, 1)"> var bool2 = true</span></p>
<p><span style="font-size: 18px; color: rgba(255, 102, 0, 1)"> console.log(str) <span style="color: rgba(255, 0, 0, 1)">// String {'hello'}</span></span></p>
<p><span style="font-size: 18px; color: rgba(255, 102, 0, 1)"> console.log(num) <span style="color: rgba(255, 0, 0, 1)">// Number {3}</span></span></p>
<p><span style="font-size: 18px; color: rgba(255, 102, 0, 1)"> console.log(bool) <span style="color: rgba(255, 0, 0, 1)">// Boolean {true}</span></span></p>
<p><span style="font-size: 18px; color: rgba(255, 102, 0, 1)"> console.log(typeof str) <span style="color: rgba(255, 0, 0, 1)">// object</span></span></p>
<p><span style="font-size: 18px; color: rgba(255, 102, 0, 1)"> console.log(str === str1) <span style="color: rgba(255, 0, 0, 1)">// false (str是对象,而str1是字符串)</span></span></p>
<p><span style="font-size: 18px; color: rgba(255, 102, 0, 1)"> </span></p>
<p><span style="font-size: 18px"> 但是啊,我们在实际应用中<span style="color: rgba(255, 0, 0, 1)">不会使用</span>基本数据类型的对象,</span></p>
<p><span style="font-size: 18px"> 如果使用基本数据类型的对象,在做一些比较时可能会带来一些不可预期的结果</span></p>
<p><span style="font-size: 18px"> 那么问题来了,既然实际开发中不用,JS为什么要提供这三个包装类呢?</span></p>
<p><span style="font-size: 18px"> 在回答这个问题之前,我们先来了解了解为什么基本类型String、Number、Boolean也有属性和方法呢?</span></p>
<p><span style="font-size: 18px"> 如字符串的 charAt() 方法</span></p>
<p><span style="font-size: 18px"> charAt 方法 接收一个参数,基于0的字符位置</span></p>
<p><span style="font-size: 16px"><span style="font-size: 18px"> charAt 方法 是以单字符串的形式返回给定位置的那个字符</span></span></p>
<p><span style="font-size: 18px; color: rgba(255, 153, 0, 1)"> var str = 'hello world'</span></p>
<p><span style="font-size: 18px; color: rgba(255, 153, 0, 1)"> console.log(str.charAt(1)) <span style="color: rgba(255, 0, 0, 1)">// e</span></span></p>
<p> </p>
<p><span style="font-size: 18px; color: rgba(0, 0, 0, 1)"> 这是为什么呢?好像有点有悖常理,那么现在我们就一探究竟,看看到底是怎么回事?</span></p>
<p><span style="font-size: 18px; color: rgba(0, 0, 0, 1)"> 说回上面,JS为我们提供了三个包装类,但是实际开发中,我们又不会使用基本类型的对象。</span></p>
<p><span style="font-size: 18px; color: rgba(0, 0, 0, 1)"> 其实,三个包装类的是给后台使用的,比如浏览器,当我们调用比如字符串的方法时,后台会<span style="color: rgba(255, 0, 0, 1)">临时</span>通过包装类来创建对象,然后通过对象调用方法,完成之后就会<span style="color: rgba(255, 0, 0, 1)">立即销毁</span>,</span></p>
<p> </p>
<p><span style="font-size: 18px; color: rgba(255, 153, 0, 1)"> 我们平常写程序的过程:</span></p>
<p><span style="font-size: 18px; color: rgba(255, 153, 0, 1)"> var str = 'sunwukong' <span style="color: rgba(255, 0, 0, 1)">// string 基本类型</span><br></span></p>
<p><span style="font-size: 18px; color: rgba(255, 153, 0, 1)"> var s2 = str.charAt(0)</span></p>
<p><span style="font-size: 18px; color: rgba(255, 153, 0, 1)"> console.log(s2) <span style="color: rgba(255, 0, 0, 1)">// s</span></span></p>
<p><span style="font-size: 18px; color: rgba(255, 153, 0, 1)"> console.log(str) <span style="color: rgba(255, 0, 0, 1)">// sunwukong</span></span></p>
<p> </p>
<p><span style="font-size: 18px; color: rgba(255, 153, 0, 1)"><span style="color: rgba(0, 0, 0, 1)">实际上在执行</span> var s2 = str.charAt(0) <span style="color: rgba(0, 0, 0, 1)">这行代码时,后台做了很多工作:</span></span></p>
<p><span style="font-size: 18px; color: rgba(255, 153, 0, 1)"> <span style="color: rgba(0, 0, 0, 1)">JavaScript高级程序设计里是这样描述的:</span></span></p>
<p><span style="font-size: 18px; color: rgba(0, 0, 0, 1)"> 1.创建 String 类的一个实例</span></p>
<p><span style="font-size: 18px; color: rgba(0, 0, 0, 1)"> 2.在实例上调用指定的方法</span></p>
<p><span style="font-size: 18px; color: rgba(0, 0, 0, 1)"> 3.销毁这个实例</span></p>
<p><span style="font-size: 18px; color: rgba(0, 0, 0, 1)"> 代码说明如下:</span></p>
<p><span style="font-size: 18px; color: rgba(255, 153, 0, 1)"> var _str = new String('sunwukong') <span style="color: rgba(51, 204, 204, 1)">// 1.找到对应的包装类,然后通过包装类临时创建一个和基本类型值相同的对象</span></span></p>
<p><span style="font-size: 18px; color: rgba(255, 153, 0, 1)"> var s2 = _str.charAt(0) <span style="color: rgba(51, 204, 204, 1)">// 2.然后这个对象就可以调用包装对象下的方法,并且返回给 s2</span></span></p>
<p><span style="font-size: 18px; color: rgba(255, 153, 0, 1)"> _str = null <span style="color: rgba(51, 204, 204, 1)">// 3.最后自动销毁这个临时创建的对象</span></span></p>
<p> </p>
<p><span style="font-size: 18px; color: rgba(0, 0, 0, 1)">所以,此刻我们也就深度理解了为什么基本类型能够调用方法和属性了,原来都是后台在默默的工作,也明白了JS中包装类的作用了,就是提供给后台使用的</span></p>
<p><span style="color: rgba(255, 0, 0, 1)"><span style="font-size: 18px">最后注意一点,</span></span></p>
<p><span style="color: rgba(255, 0, 0, 1)"><span style="font-size: 18px"> 虽然后台会将通过包装类,将基本数据类型转换为实例对象,但是,由于它也会自动销毁该实例,所以我们不能对基本数据类型添加属性和方法,这也符合常理</span></span></p>
<p><span style="font-size: 18px"> 如:</span></p>
<p><span style="font-size: 18px"> <span style="color: rgba(255, 153, 0, 1)">var dashixiong = 'sunwukong'</span></span></p>
<p><span style="font-size: 18px; color: rgba(255, 153, 0, 1)"> dashixiong.age = 18</span></p>
<p><span style="font-size: 18px; color: rgba(255, 153, 0, 1)"> console.log(dashixiong.age)</span><span style="color: rgba(255, 0, 0, 1)"><span style="font-size: 18px"> // undefined</span></span></p>
<p> </p>
<p><span style="color: rgba(0, 0, 0, 1)"><span style="font-size: 18px">执行到第二行代码属性赋值时,后台通过包装类创建了一个实例,这个age属性确实挂到这个临时的实例上去了,但是紧跟着,这个实例就被销毁了,执行到第三行时,又通过包装类重新创建了一个新的实例,这个新实例是没有 age 属性的。</span></span><span style="font-size: 18px"><br></span></p>
<pre><span style="font-size: 18px; color: rgba(255, 153, 0, 1)"><br><br></span></pre>
</div>
<div id="MySignature" role="contentinfo">
<!-- 版权保护 -->
<div style="background:#ffcccc; color:#0; font-size:small;">
<p >
作者: 默然晴天
博客地址:http://www.cnblogs.com/bryanfu/
</p>
<p >
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出,
原文链接
如有问题, 可邮件(fukangkobe@163.com)咨询.
</p>
</div><br><br>
来源:https://www.cnblogs.com/bryanfu/p/15092515.html
頁:
[1]