Javascript-基本包装类型

为了便于操作基本类型值,ECMAScript 还提供了3 个特殊的引用类型:Boolean、Number 和String。这些类型与本章介绍的其他引用类型相似,但同时也具有与各自的基本类型相应的特殊行为。实际上,每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象,从而让我们能够调用一些方法来操作这些数据

例子:

var s1 = "some text";
var s2 = s1.substring(2);
console.log(s2);  //"me text"

这个例子中变量s1包含了一个字符串,我们都知道字符串是基本类型的值,所以从逻辑上讲s1不应该有方法,但是例子中的第二行代码却调用了s1的substring()方法。这是因为在我们实现这种直观的操作,后台已经自动完成了一系列的处理。当第二行代码访问s1 时,访问过程处于一种读取模式,也就是要从内存中读取这个字符串的值。而在读取模式中访问字符串时,后台都会自动完成下列处理
1、创建String的一个实例
2、在实例上调用置顶的而方法
3、销毁实例
可以想象成以下代码:

var s1 = new String("some text");
var s2 = s1.substring(2);
s1 = null;

经过此番处理,基本的字符串值就变得跟对象一样了。而且,上面这三个步骤也分别适用于Boolean和Number 类型对应的布尔值和数字值。
引用类型与基本包装类型的主要区别就是对象的生存期。使用new 操作符创建的引用类型的实例,在执行流离开当前作用域之前都一直保存在内存中。而自动创建的基本包装类型的对象,则只存在于一行代码的执行瞬间,然后立即被销毁。这意味着我们不能在运行时为基本类型值添加属性和方法。来看下面的例子:

var s1 = "some text";
s1.color = "red";
console.log(s1.color); //undefined

在此,第二行代码试图为字符串s1 添加一个color 属性。但是,当第三行代码再次访问s1 时,其color 属性不见了。问题的原因就是第二行创建的String 对象在执行第三行代码时已经被销毁了。
第三行代码又创建自己的String 对象,而该对象没有color 属性。

  • 一般不建议显示的调用Boolean Number String 来创建基本包装类型的对象。因为这种做法很容易让人分不清自己是在处理基本类型还是引用类型的值。例子:
var s1 = new String("Tom");
console.log(s1);    //String {0: "T", 1: "o", 2: "m", length: 3, [[PrimitiveValue]]: "Tom"}
console.log(typeof s1); //"object"

var s2 = "jerry";
console.log(s2);    "jerry"
console.log(typeof s2); "string"

一、Boolean类型

Boolean 类型是与布尔值对应的引用类型。要创建Boolean 对象,可以像下面这样调用Boolean构造函数并传入true 或false 值

var booleanObject = new Boolean(true);

Boolean 对象在ECMAScript 中的用处不大

二、Number类型

toString()
toFixed() //会按照指定的小数位返回数值的字符串表示
toExponential() //该方法返回以指数表示法(也称e 表示法)表示的数值的字符串形式
toPrecision() //方法可能会返回固定大小(fixed)格式,也可能返回指数(exponential)格式;具体规则是看哪种格式最合适

不建议直接实例化Number 类型

三、String类型

属性

length

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

方法:

1、字符方法

两个用于访问字符串中特定字符的方法:
charAt() 参数是基于0的字符位置。以字符串的形式返回给定位置的那个字符
charCodeAt() 返回的是字符编码
str[2]使用[]加数字索引访问字符串中的特定字符

var str = "hello Tom";
var str1 = str.charAt(2);
console.log(str1); //l
var str2 = str.charCodeAt(2);
console.log(str2);  //108
var str3 = str[1]; 
console.log(str3);  //e

2、字符串操作方法

  • 拼接字符串
    concat
var str1 = "Tom";
var str2 = str1.concat(" and Jerry","!");
console.log(str2);  //"Tom and Jerry!"
console.log(str1);  //"Tom"

+ 通常情况下用加号操作符拼接。

ECMAScript 还提供了三个基于子字符串创建新字符串的方法:slice()、substr()和substring()。

slice() substring():接收两个参数。第一个参数是字符串开始的位置,第二个参数(可选)是子字符串最后一个字符后面的位置
substr()接收两个参数。第一个参数是字符串开始的位置,第二个参数(可选)是返回字符串的字符长度

var str = "hello world";
console.log(str.slice(3));  //"lo world"
console.log(str.substring(3)); //"lo world"
console.log(str.substr(3)); //"lo world"

console.log(str.slice(3.7));  //"lo w"
console.log(str.substring(3,7));  //"lo w"
console.log(str.substr(3,7));   //"lo worl";

在传递给这些方法的参数是负值的情况下,它们的行为就不尽相同了。其中,slice()方法会将传入的负值与字符串的长度相加,substr()方法将负的第一个参数加上字符串的长度,而将负的第二个参数转换为0。最后,substring()方法会把所有负值参数都转换为0

console.log(str.slice(-3));  //-3+11= 8   "rld";
console.log(str.substring(-3));  //负值转换成0  "hello world"
console.log(str.substr(-3));    // "rld";

console.log(str.slice(3,-4));   // = slice(3,7)  "lo w"
console.log(str.substring(3,-4)); // =substring(3,0) "hel"  如果 start 比 stop 大,那么该方法在提取子串之前会先交换这两个参数。
console.log(str.substr(3,-4);   // =substr(3,0); ""

3、字符串位置方法

indexOf(targetElement[, startIndex]) :从前往后搜索子字符串的位置
lastIndexOf(targetElement[, startIndex]) :从后往前搜索子字符串的位置

var str = "hello world";
console.log(str.indexOf("o")); //4
console.log(str.lastIndexOf("o")); //7
console.log(str.indexOf("o",6)); //7
console.log(str.lastIndexOf("o",6)); //4

//通过循环调用这两个方法来找到所有匹配的字符串
var str = "Lorem ipsum dolor sit amet, consectetur adipisicing elit";
var positions = [];
var pos = str.indexOf("e"); //3
while(pos > -1){
    positions.push(pos);
    pos = str.indexOf("e", pos + 1);
}
console.log(positions); // [3, 24, 32, 35, 52]

4、字符串trim()方法

这个方法会创建一个字符串的副本,删除前置及后缀的所有空格,然后返回结果。

var str = " hello world ";
var trimmedStr = str.trim();
console.log(str); //" hello world "
console.log(trimmedStr); "hello world"

5、字符串大小写转换方法

toLowerCase()
toLocaleLowerCase()
toUpperCase()
toLocaleUpperCase()

6、字符串的模式匹配方法

match()   
search()  search()方法返回字符串中第一个匹配项的索引  

这两个方法接收的参数都是一个字符串或者一个正则表达式

为了简化替换子字符串的操作,ECMAScript 提供了replace()方法。这个方法接受两个参数:第一个参数可以是一个RegExp 对象或者一个字符串(这个字符串不会被转换成正则表达式),第二个参数可以是一个字符串或者一个函数。如果第一个参数是字符串,那么只会替换第一个子字符串。要想替换所有子字符串,唯一的办法就是提供一个正则表达式,而且要指定全局(g)标志
replace()

7、localCompare()方法

与操作字符串有关的最后一个方法是localeCompare(),这个方法比较两个字符串,并返回下列值中的一个:
• 如果字符串在字母表中应该排在字符串参数之前,则返回一个负数(大多数情况下是-1,具体的值要视实现而定);
• 如果字符串等于字符串参数,则返回0;
• 如果字符串在字母表中应该排在字符串参数之后,则返回一个正数(大多数情况下是1,具体的值同样要视实现而定)。

8、 fromCharCode()方法

String 构造函数本身还有一个静态方法:fromCharCode()。这个方法的任务是接收一或多个字符编码,然后将它们转换成一个字符串。从本质上来看,这个方法与实例方法charCodeAt()执行的是相反的操作。
console.log(String.fromCharCode(104,101,108,108,111)); //"hello";

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

推荐阅读更多精彩内容