JavaScript标准库系列——三大包装对象(四)

目录

导语

1. 包装对象的理解

2. 三大包装对象的知识点

3. 小结


导语

包装对象是为了弥补基本数据类型的非对象特性而产生的,对于基本类型值而言,本来是不存在属性和方法的,但是我们可以在使用字面量创建字符串时,调用例如"hello".concat(" world")的方法,那么其内在原理究竟是什么呢?
阅读完本篇文章,相信你能找到答案。


1. 包装对象的理解

包装对象指的是数据类型为NumberStringBoolean的值对应的原生对象;
三大包装对象能力在于:

  • 能够将上述基本类型值包装成真正的对象,从而体现JavaScript语言一切皆对象的特点;
  • 是字面量使用对应包装对象的方法的内在原理;
  • 是进行数据类型转换的利器;

1.1 三大包装对象及其字面量

基本数据类型我们可以直接采用字面量的形式创建:

var num = 1,str = "hello",bool = true;

也可以采用对应包装对象的形式创建:

var num = new Number(1),str = new String("hello"),bool = new Boolean(true)

二者区别在于前者是基本数据类型,后者是属于对象的引用数据类型;

二者的联系在于:

  • 通过对象的valueOf()方法可以获取其基本类型值;


  • 字面量可直接调用包装对象的实例的方法;



    其原理在于每次基本类型字面量在调用包装对象实例的方法时,首先创建对于包装对象的实例,然后在实例上调用该方法,最后销毁该实例,即

var str = "hello world";
str.split(" ")
等价于
var str = new String("hello world")
str.split(" ")
str = null;

所以,每当为字面量赋属性值时是无效的,因为每次字面量调用完包装对象实例的方法后都会销毁实例;
关于更多包装对象的实例属性和方法详见下文;

1.2 Object对象与三大包装对象的关系

《JavaScript标准库系列——Object对象和Array对象(一)》一文中,小羊曾提到Object是其他一切对象的构造函数,所以三大包装对象的实例都可以由Object来构造;

var num = new Object(1);等价于 new Number(1)
var str = new Object('hello');new String('hello')
var bool = new Object(true);new Booleab(true)

Object构造函数根据传入参数的数据类型返回相应的基本包装类型的实例;


2. 三大包装对象的知识点

2.1 包装对象直接作为工具方法

包装对象直接作为工具方法实现到不同类型数据之间的类型转换作用,详见《JavaScript数据类型(四)》一文;

2.2 包装对象的实例方法
  • 继承自Object对象的valeOf()和toString()方法
    这两个方法继承自Object对象,经常在使用字面量与其他类型数据进行运算时调用,例如:

    这里顺带讲一下+运算符的原理:
  • 先自动转成原始类型的值(即先执行该对象的valueOf
    方法,如果结果还不是原始类型的值,再执行toString
    方法;如果对象是Date实例,则先执行toString
    方法);
  • 两个运算子都是原始类型的值以后,只要有一个运算子是字符串,则两个运算子都转为字符串,执行字符串连接运算;
  • 否则,两个运算子都转为数值,执行加法运算;
    来自阮一峰《JavaScript 标准参考教程》
    1+str1+obj1+bool为例:
    1+str加法运算符两侧的运算子包含字符串,采用字符串拼接方法;
    1+obj加法运算符两侧的运算子包含对象,先采用valueOf()方法,发现还是对象,在调用toString()方法得到"[object Object]",然后进行字符串拼接;
    1+bool发现其中一个运算子是布尔值直接使用Number()进行包装;
  • 源自包装对象实例的方法
    三大包装对象中String对象的实例方法相对来说比较重要,这里重点讲一下,其他两个可以参考阮一峰的教程;

字符方法

charAt():返回指定位置的字符;
charCodeAt():返回给定位置字符的Unicode码


类数组方法

length:返回字符串的长度;
concat:合并字符串,返回新字符串,不改变原字符串;
slice:提取字符串,第一个参数是子字符串的开始位置,第二个参数是子字符串的结束位置(不含该位置),返回子字符串,不改变原字符串;
substr:提取字符串,第一个参数是子字符串的开始位置,第二个参数是子字符串的长度,返回子字符串,不改变原字符串;

格式化方法

toUpperCase:将字符串变大写
toLowerCase:将字符串变小写
trim:去除字符串前后的空格

检索相关方法

match:传入一个参数,若原字符串匹配参数则返回匹配的符串数组;
replace:可传两个参数,第一个为检索表达式,第二个为替换值;
更多详见《JavaScript标准库系列——RegExp对象(三)》

var str = "hello world"
str.split(" ").map(function(ele){
  return ele.replace(/^\w/,function(match){
    return match.toUpperCase()
  })
}).join(" ")
//"Hello World"

split()方法

split:按照给定的参数去分割字符串,和数组的join是互为逆方法;


小结

通过全文的浏览,我们了解到:

  • 包装对象是三大原始类型数据Number、String和Boolean对于的原生对象;
  • 三大包装对象在JavaScript中的作用主要是能将三大基本数据类型也包装成对象,从而体现JavaScript一切皆对象的特性;是字面量调用对应实例方法的内在原理;是进行数据类型转换的利器;
  • 通过new+包装对象方法能够创建不同的包装对象实例,调用其valueOf()方法就可以得到对应的原始类型值;同时也可以通过Object对象去构造对应的包装对象;
  • 包装对象的使用既可以作为工具方法,起到数据类型转换作用;又可以创建实例,从而实例可以调用部署在对应包装对象原型上的方法;
  • valueOf()和toString()是三大包装对象实例的共有方法,在进行数据类型转换时会派上用场;
  • 本文主要讲解了关于String包装对实例的方法,包括字符方法、类数组方法、格式化方法、检索方法和split方法;

参考资料

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

推荐阅读更多精彩内容