JSstring方法

一.改变大小写:

toLowerCase()toUpperCase()方法可以改变大小写:

alert('Interface'.toUpperCase());    //INTERFACE

alert('Interface'.toLowerCase());    //interface

或者单独改变一个字符

alert('Interface'[0].toLowerCase());    //i


二.查找子字符串

在字符串中查找子字符串有很多种方法


//从给定位置pos开始,在str中查找substr,如果没有找到,则返回-1,否则返回匹配成功的位置

1.str.indexOf(substr,pos)

例如:

let str = 'Widget with id';

alert(str.indexOf('Widget'));    //0

alert(str.indexOf('widget'));    //-1,没有找到,检索是大小写敏感的

alert(str.indexOf("id"));           //1,"id"位置在1处(......idget 和 id)


可选的第二个参数允许我们从一个给定的位置开始检索。

例如,“id”第一次出现的位置是 1 。查询下一个存在位置时,我们从2开始检索:

let str = 'Widget with id';

alert(str.indexOf('id',2)    //12


如果我们对所有存在位置都敢兴趣,可以在一个循环中使用 indexOf 。每一次新的调用都发生在上一匹配位置之后:

let str = 'As sly as a fox, as strong as an ox';

let target = 'as';    //查找目标

let pos = 0;

while(true){

let foundPos - str.indexOf(target,pos);

if(foundPos == -1){break;}

alert(`Found at ${foundPos}`);

pos = foundPos + 1;    //继续从下一个位置查找

}

相同的算法可以简写:

let str = "As sly as a fox, as strong as an ox";

let target = "as";

let pos = -1;

while((pos = str.indexOf(traget,pos + 1)) != -1){

alert(pos);

}

还有一个类似的方法 str.lastIndexOf(substr, position),它从字符串的末尾开始搜索到开头。

它会以相反的顺序列出这些事件。


注意:

if 测试中 indexOf 有一点不方便。我们不能这样把它放在if中:

let str = "Widget with id"

if(str.indexOf("Widget")){

alert("We found it");    //不工作!

}    

不工作是因为 str.indexOf("Widget") 返回 0(它在起始位置就查到了匹配项)。 if 认为 0 表示为 false

因此我们应该检查-1,像这样:

let str = "Widget with id";

if(str.indexOf("Widget") != -1){

alert("We found it);    //现在工作了

}


2.按位(bitwise)NOT技巧

这里使用的一个老技巧是bitwis NOT ~运算符。它将数字转换为 32-bit 整数(如果存在小数部分,则删除小数部分),然后对其二进制表示形式中的所有位均取反。

实际上,这意味着一件很简单的事儿:对于 32-bit 整数, ~n 等于 -(n+1) 。

例如:

alert(~2);    //-3,和-(2+1)相同

alert(~1);    //-2,和-(1+1)相同

alert(~0);    //-1,和-(0+1)相同

alert(~-1);    //0,和-(-1+1)相同

正如我们看到这样,这又当 n == -1 时, ~n 才为 0 (适用于32-bit带符号的整数n).

因此仅当 indexOf 的结果不是 -1 时,检查 if(~str.indexOf("...")) 才为真。换句话说,当有匹配时,人们用它来简写 indexOf 检查:

let str = “Widget";

if(~str.indexOf("Widget")){

alert('Found it!');    //正常运行

}

通常不建议以非显而易见的方式使用语言特性,但这种特殊技巧在旧代码中仍被广泛使用,所以我们应该理解它。

只要记住:if (~str.indexOf(...)) 读作 “if found”。

确切地说,由于 ~ 运算符将大数字截断为 32 位,因此存在给出 0 的其他数字,最小的数字是 ~4294967295=0。这使得这种检查只有在字符串没有那么长的情况下才是正确的。

现在我们只会在旧的代码中看到这个技巧,因为现代 JavaScript 提供了 .includes 方法(见下文)。


3.includes,startsWith,endsWith

更现代的方法 str.includes(substr,pos) 根据 str 中是否包含 substr 来返回 true/flase

如果我们需要检测匹配,但不需要它的位置,那么这是正确的选择:

alert("Widget with id".includes("Widget"));    //true

alert("Hello".includes("Bye"));    //false

str.includes 的第二个可选参数是开始搜索的起始位置:

alert("Midget".includes("id"));    //true

alert("Midget".includes("id",3));    //false,从位置3开始没有”id"

方法 str.startsWithendsWith 的功能与其名称所表示的意思相同:

alert("Widget".startsWith("Wid"));    //true,“Widget”以“Wid”开始

alert("Widget".endsWith("get"));    //true,“Widget”以“get”结束


三.获取字符串

JavaScript 中有三种获取字符串的方法:substringsubstrslice。

1.str.slice(start , end)

返回字符串从 start 到(但不包括) end 的部分。

例如:

let str = “stringify”;

alert(str.slice(0,5));    //'strin',从0到5的子字符串(不包括5)

alert(str.slice(0,1);    //'s',从0到1,但不包括1,所以只有在0处的字符

如果没有第二个参数,slice 会一直运行到字符串末尾:

let str = "stringify";

alert(str.slice(2));    //从第二个位置开始直到结束

start/end 也有可能是负值。它们的意思是起始位置从字符串结尾计算:

let str = "strtingify";

//从右边的第四个位置开始,在右边的第一个位置结束

alert(str.slice(-4,-1));    //'gif‘


2.str.substring(start,end)

返回字符串在 start end 之间的部分。

这与 slice 几乎相同,但它允许 start 大于 end

例如:

let str = "stringify";

//这些对于 substring 是相同的

alert(str.substring(2,6));    //"ring"

alert(str.substring(6,2));    //"ring"

//但对于 slice 是不同的

alert(str.slice(2,6));        //"ring"

alert(str.slice(6,2));        //""(空字符串)

substring 不支持负参数,它们被视为 0


3.str.substr(start,length)

返回字符串从 start 开始到给定 length 的部分。

与以前的方法相比,这个允许我们指定 length 而不是结束位置:

let str = "stringify";

alert(str.substr(2,4));    //'ring', 从位置 2 开始,获取 4 个字符

第一个参数可能是负数,从结尾算起:

let str = "stringify";

alert(str.substr(-4,2));    //'gi',从第 4 位获取 2 个字符


四.比较字符串

所有的字符串都使用 UTF-16 编码。即:每个字符串都有对应的数字代码。有特殊的方法可以获取代码表示的字符,以及字符对应的代码。


1.str.codePointAt(pos)

返回在 pos 位置的字符代码:

//不同的字母有不同的代码

alert("z".codePointAt(0));    //122

alert("Z".codePointAt(0));    //90


2.String.fromCodePoint(code)

通过数字 code 创建字符

alert(String.fromCodePoint(90));    //Z

我们还可以用 \u 后跟十六进制代码,通过这些代码添加 Unicode 字符:

//在十六进制系统中 90 位 5a

alert('\u005a');    //Z


正确的比较

执行字符串比较的“正确”算法比看起来复杂,因为不同语言的字母都不相同。

因此浏览器需要直到要比较的语言。

幸运的是,所有现代浏览器(IE10-需要额外的库 Intl.JS)都支持国际化标准ECMA-402。

它提供了一种特殊的方法来比较不同语言的字符串,遵循它们的规则。

调用 str.localeCompare(str2) 会根据语言规则返回一个整数,这个整数能指示字符串 str 在排序顺序中排在 str2 前面、后面、还是相同:

如果 str 排在 str2 前面,则返回负数。

如果 str 排在 str2 后面,则返回正数。

如果它们在相同位置,则返回 0

例如:

alert( 'Österreich'.localeCompare('Zealand') );     // -1

这个方法实际上在文档中指定了两个额外的参数,这两个参数允许它指定语言(默认语言从环境中获取,字符顺序视语言不同而不同)并设置诸如区分大小写,或应该将"a" 和 "á" 作相同处理等附加的规则。

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

推荐阅读更多精彩内容