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

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

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

我们先来看一个现象:

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类型转换规律(显示类型转换和隐式类型转换)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容