美文网首页前端开发那些事儿
深入理解包装类及其所以常用方法和属性

深入理解包装类及其所以常用方法和属性

作者: 深度剖析JavaScript | 来源:发表于2020-08-13 12:30 被阅读0次

你是否想了解什么是包装类?
或者想了解包装类的原型上定义了哪些方法和属性?

这篇文章能帮助你梳理清楚,并且会手动封装常见的包装类方法

我们先来看一个现象:

var str = "hello" ;
console.log(str.length) ;//5

定义了一个字符串变量str,字符串调用了一个length属性,打印出字符串的长度!
你是否会奇怪?字符串属于原始值类型,原始值里头不应该有属性才对?
确实,对象身上才有属性和方法!
那上面是怎么回事?
你应该听说过这么一句话:“JavaScript语言一切皆是对象”。其实不仅仅数组和函数是对象,我们知道的原始值(数值、字符串、布尔值),在一定条件下,也会转成对象,这种对象被称为“包装类对象”
所以,上面代码能实现的原因在于:当调用原始值的属性和方法时,js发现原始值根本没有属性和方法,你怎么调用呢?为了不然程序报错,于是它偷偷地将原始类型的变成了包装类对象,在调用这个新创建好的包装类对象的属性和方法执行,执行完后 偷偷的delete此对象。
看个例子:

var num = 3;
num.len = 2;
//new Number(3).len =2; delete
console.log(num.len);//endefined  这里会重新new Number(3).len,跟之前的不一样

var str = "abcd";
str.length = 2;
//new String('abcd).length = 2; delete;
console.log(str);//abcd
console.log(str.length);//重新new String('abcd);注意:length是string系统自带的属性。所以返回4

上面例子可以看出,每次调用都会偷偷重新生成一个全新的对象,全新的对象跟之前的没有关系,因为它每次执行完就delete掉了。所以包装类对象的生命周期非常短暂,导致我们给包装类添加自定义属性和方法没有任何意义!

其实说白了包装类就是函数,当原始值在调用属性或方法时,会触发一个机制,这个机制会在你不知情的情况下,将原始类型的值传入对应的函数,然后构造出对应的对象!这个过程有包装、打包的意思,即你给我个原始值,我给你一个对象。所以大家把这类函数称为包装类。反正就是一个名称,大家记住就好了。

这下明白了吧!

那我们来看看都有哪些包装类?
其实也就三个,就是三个原始值对应的包装类,包括Number、String、Boolean

先来讲前面两个简单的:Number(){}和Boolean(){}
Number本身调用的话:是将传递的参数变成number类型,就算变成不了数字,也会变成number类型:NaN;

console.log(Number(true))//1
console.log(Number("hello"))//NaN

通过new Number()产生的包装对象能继承Number原型链上的属性和方法,包括Number.prototype上的和Object.prototype上的
这里主要是讲直接原型Number.prototype上的

看看都有哪些:
  1. constructor属性: 返回Number原型的构造函数,即返回Number(){}
  2. toExponential方法:返回一个数的科学计数法的形式
  3. toFixed方法:将一个数转为指定位数的小数,返回这个小数对应的字符串 如下:
  4. toLocaleString方法:返回一个数转换为本地字符串的形式
  5. toPrecision方法:用于将一个数转为指定位数的有效数字,返回字符串形式
  6. toString方法:返回一个数字的字符串形式;注意这里的toString不是Object身上的哦
  7. valueOf方法:用于返回一个 Number 对象的原始数字值

另外再来看Number这个构造函数本身有的静态属性(通过Number.直接调用的)有哪些:

  1. MAX_VALUE:可表示的最大的数
  2. MIN_VALUE:可表示的最小的数
  3. NEGATIVE_INFINITY:负无穷大,溢出时返回该值
  4. NaN:非数
  5. POSITIVE_INFINITY:正无穷大,溢出时返回该值
  6. prototype:原型属性;可以在原型上添加属性和方法

下面再来讲另外一个包装类:Boolean

Boolean函数本身调用的话:是将一个数据变成对应的布尔值,返回true或者false
Boolean的原型上也只有一个属性constructor和两个方法:
  1. toString方法: 返回一个布尔值的字符串形式
  2. valueOf:返回一个Boolean对象的原始布尔值

Boolean和Number都比较少东西。下面讲包装类中的老大哥:String(){}

我们常常说的字符串的方法,都是源于它String.prototype

首先来看String()本身的正常用法是:将任意类型数据转换为字符串

  1. 数值变成数字字符串
  2. 字符串任是字符串
  3. 布尔值true为”true”,false为”false”
  4. undefined、null变成对应的字符串“undefined”和“null”
再来看看,new String产生的对象继承自原型上的属性和方法有多少: 不要怀疑,不要惊讶,就是有这么多!不然怎么叫它老大哥呢 233...

不要慌,下面常用的方法一个个都会讲到:

  1. length属性:返回字符串长度
  2. charAt方法:返回指定位置的字符;位置从0开始
  3. charCodeAt方法:返回指定位置的字符的Unicode编码
  4. concat方法:跟数组中的concat类似,用于连接两个字符串,返回新的字符串,不改变原字符串
  5. slice方法:跟数组中的slice也类似,用于返回从原字符串中截取的子字符串,不改变原字符串;传参规则跟数组中的slice方法一模一样:
    用于从原字符串截取子字符串并返回,不改变原字符串。
    当有两个参数时:第一个表示开始位,第二个是结束位(不含该位置)
    只有一个参数时:则表示从该位开始,截取到最后并返回
    不传参时:相当于是截取了整个字符串,可以理解为复制了一个一样的值
    如果参数是负值:表示从倒数位置
    如果第一个参数大于第二个参数:如slice(3,1),方法返回一个空字符串
  6. substring方法:也使用从原字符串中截取子字符串并返回,但有一些奇怪的规则,因此很多人不建议使用这个方法,优先使用slice。
  7. substr方法:也是从原字符串取出子字符串并返回;规则跟数组中的splice有点点相似:
    如果两个参数:第一个参数表示开始位,第二个参数表示截取的子字符串的长度
    当只有一个参数时:则表示从开始位开始,截取到原字符串最后
    如果第一个参数是负数:表示倒数计算的字符位置
    如果第二个参数是负数,将被自动转为0即截0位,因此会返回空字符串
  8. indexOf()和lastIndexOf():跟ES5中数组的indexOf和lastIndexOf类似,用于查找指定字符串在原字符串出现的位置,如果没有找到返回-1
    indexOf从字符串头部开始匹配,lastIndexOf从尾部开始匹配
    接受第二个参数时,indexOf第二个参数表示从该位置开始向后匹配;lastIndexOf第二个参数表示从该位置起向前匹配
  9. trim():用于去除字符串两端的空格,返回去除空格后的新字符串,不改变原字符串
  10. toLowerCase():用于将字符串全部转为小写形式的字符串返回,不改变原字符串
  11. toUpperCase():用于将字符串全部转为大写形式的字符串返回,不改变原字符串
  12. localeCompare():比较两个字符串Unicode编码大小,第一个大于第二个返回1,第一个小于第二个返回-1,相等返回0
  13. match():通过正则匹配原字符串是否有某个子字符串,返回一个数组,成员为匹配的第一个字符串。如果没有找到匹配,则返回null
  14. search():查找字符串中是否有某个字符串。返回值为匹配的第一个位置。如果没有找到匹配,则返回-1。
  15. replace():用于替换匹配的子字符串,一般情况下只替换第一个匹配(除非使用带有g修饰符的正则表达式)
  16. split():将字符串通过指定分隔符拆分成数组。按照什么拆分,什么就没有了
  17. includes:判断字符中是否包含什么,返回true或false
  18. startsWith:判断是不是以某字符串开头,返回true或false
  19. endsWith:判断是不是以某字符串结尾,返回true或false
  20. repeat():返回重复连接指定次数的字符串
  21. trimLeft()和trimStart():去除左边空格
  22. trimRight()和trimEnd():去除右边空格
  23. 有很多方法用于将字符串包含在相对应的 HTML 标签中返回。注意:可能在某些浏览器下不支持
最后再来看一眼,String身上的静态属性和方法。有兴趣的可以自己试试:

以上就是包装类的总结内容!

参考资料
数组去重,习题,答疑复习(下)-腾讯课堂渡一教育
JS对象、包装类—作者:陈皮KirinaChen
js 包装类
JavaScript toLocaleString() 方法—W3SCHOOL
JavaScript Number 对象
深度剖析JS类型转换规律(显示类型转换和隐式类型转换)

相关文章

  • 深入理解包装类及其所以常用方法和属性

    你是否想了解什么是包装类?或者想了解包装类的原型上定义了哪些方法和属性? 这篇文章能帮助你梳理清楚,并且会手动封装...

  • 数据存储(二)XML的存储与解析

    (一)XMl常用类及其常用属性和方法 XmlNode InnerText:获取或设置节点及其所有子节点的值(仅元素...

  • java基础类-6-反射

    常用类 获取类类型 创建对象 获取属性 获取特定属性 方法和构造方法

  • JAVA入门的进一步加深

    学习目的 深入了解Java语言里面的类、对象、数组的三种输出方式、属性、方法。 相关技术、及其使用 类和对象类:一...

  • 2020-01-08包装类

    一.什么是包装类 Java中的基本数据类型没有方法和属性,而包装类就是为了让这些拥有方法和属性,实现对象化交互。 ...

  • Java包装类 和 值传递机制

    一.什么是包装类 Java中的基本数据类型没有方法和属性,而包装类就是为了让这些拥有方法和属性,实现对象化交互。 ...

  • Android属性动画

    常用属性 常用的方法、类

  • Objective-C之NSDictionary学习笔记(IOS

    NSDictionary类简介 属性表(@property) 常用方法 常用类方法 词典对象的生成 常用实例方法 ...

  • 包装类

    [TOC] 包装类的存在意义 基本数据类型通过包装类包装后,可以获取对应类的属性和方法等。 对于数组,每个单位既可...

  • 3/7day05_常用API(BigInteger,BigDec

    回顾 今日内容 BigInteger类 BigDecimal类 Arrays类 包装类 String类的常用方法 ...

网友评论

    本文标题:深入理解包装类及其所以常用方法和属性

    本文链接:https://www.haomeiwen.com/subject/evmpdktx.html