龙方德 發表於 2021-8-4 02:34:00

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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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]
查看完整版本: JavaScript中的包装类