一.改变大小写:
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.startsWith 和 endsWith 的功能与其名称所表示的意思相同:
alert("Widget".startsWith("Wid")); //true,“Widget”以“Wid”开始
alert("Widget".endsWith("get")); //true,“Widget”以“get”结束
三.获取字符串
JavaScript 中有三种获取字符串的方法:substring、substr 和 slice。
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" 和 "á" 作相同处理等附加的规则。