JavaScript Strings


JS String 是一系列 Unicode 字符,用引号或引号限制起来的 immutable UTF-16 code units。

每一个代码单元由一个 16-bit 数字表示。每一个 Unicode 字符由1到2个代码单元表示。

反斜杠

使用反斜杠输出特殊字符 backslash escape character turns special characters into string characters。

Strings Can be Objects

创建 String 变量的方法有:

var x = "John";
var y = new String("John");

最好不要用后者,减缓执行速度。且 x === y 是 false 的,因为后者的 type 是 object。 JavaScript objects cannot be compared。两者无法比较。

前者创建的是 primitive values,但是 in JavaScript, methods and properties are also available to primitive values.

属性

length 是 String 自带属性。除此之外还有 constructorprototype 两个属性。

方法

Find 查找

  • indexOf(searchvalue, start),返回 index of (the position of) the first occurrence(第一次出现的位置) of a specified text in a string。
  • lastIndexOf(searchvalue, start),返回一个字符串中指定文本 last occurrence (最后一次出现的位置),以 start 位置开始,从字符串的后面向前查找。
  • search(searchvalue),效果同 indexOf()

    因为字符串可以被自动转成一个正则表达式

    search() 的 searchvalue 是一个正则表达式,所以它比 indexOf() 有更强大的搜索能力。

1.字符串开始位置的索引为 0. 2.如果没有找到指定文本,则返回 -1。 3.前两者 searchvalue 是一个字符串start 默认是 0,表示开始查找的位置,该参数是可选的。

  • includes(searchString[, fromIndex]),用来判断一个字符串里是否含有另一个字符串,有则返回 true,无则返回 false。默认从 0 索引开始查。

Extract 抽取

  • slice(start, end),从 start 位置(包含 start 位的字符),到 end 位置(但不包含 end 位的字符)截取一段字符放置到新的字符串中。缺省 end,则认为一直到 end of the string。位置取值负数,表示从末尾开始。
  • substring(start, end),同上。但不接受负数。如果 start 小于0,则认为从 0 开始。如果 “start” is greater than “end”, this method will swap the two arguments 交换开始和结束位置参数, meaning str.substring(1,4) == str.substring(4,1).
  • substr(start, length),同 slice(),start 位置可取负值。但此处第二个参数表示长度,因此不能为负数。

    "hello world".substr(-4, 4); // 表示从倒数第四位开始,向后取四位字符,返回"orld"
    

    以上三个方法的共同点是缺省第二个参数,the method will slice out the rest of the string。

  • charAt(position),返回指定位置上的字符
  • charCodeAt(position),返回指定位置上字符的 UTF-16 代码单元值的数字;如果索引超出范围,则返回 NaN

注意:Accessing a String as an Array is Unsafe!不要使用数组形式接近一个字符串

Replace 替换

replace(regexp|substr, newSubstr|function) ,返回一个新字符串,其中第一个匹配项(或全部匹配项)被替换为 newvalue,不改变原 string。

var str = "Mr Blue has a blue house and a blue car";
var res = str.replace(/blue|house|car/gi, function myFunction(x){return x.toUpperCase();});

结果为 Mr BLUE has a BLUE HOUSE and a BLUE CAR.

默认只替换找到的第一个匹配。希望全部替换,使用 regular expression 作为搜索项。

没找到 match 则返回原 string。

字符大小写转换

使用 toUpperCase()toLowerCase() 方法。

Concate 拼接

使用 concat() 连接两个或多个字符串,效果同使用连接操作符 +

var text = "Hello" + " " + "World!";
var text = "Hello".concat(" ","World!");

所有字符串的方法将返回一个新的字符串,而不改变 original 字符串

根据 Unicode 输出对应字符

使用字符串对象的静态方法 String.fromCharCode(num1, ..., numN) ,其中参数是一组序列数字,表示 Unicode 值。该方法返回一个字符串,而不是一个 String 对象。

Converting a String to an Array 字符串转成数组

使用 split(separator, limit) 方法,把字符串转为数组。两个参数都是 optional 的。

  • 前者可以是一个字符,也可以是 regular expression
  • 缺省 separator,返回 an Array with only one item 整段字符串
  • 后者表示 split 个数,比如转换的数组包含10个item,但我只想要前3个,则设 limit 为 3

按单个字符分割, including white-space 包括空格,如下:

var str = "How are you doing today?";
var res = str.split("");

Match 匹配

使用 match(regexp) 方法查找指定字符。

如果 regexp 包含 g 标识,则方法返回 all matched 子字符串组成的数组;没有匹配项,返回 null

如果 regexp 不含 g 标识,则返回由第一个匹配项及它相关的 capturing groups、匹配项在字符串的索引、原始字符串,组成的数组。

下例将银行卡号以4个数字为一组展示:

"1005100510051005227".match(/.{1,4}/)
// ["1005", index: 0, input: "1005100510051005227"]
"1005100510051005227".match(/.{1,4}/g)
// ["1005", "1005", "1005", "1005", "227"]

下面举例从 url 读取指定名称的查询参数值:

function getQueryValue(queryName) {
  var reg = new RegExp("(^|&)" + queryName + "=([^&]*)(&|$)", "i");
  var r = window.location.search.substr(1).match(reg);
  if (r != null) {
    console.log(r)
    return decodeURI(r[2]);
  } else {
    return null;
  }
}

// console输出,数组2、3、4分别对应正则表达式()捕捉的未命名分组捕获的值
[
  "&test=u8uouo&", // 完整匹配
  "&",             // 第1分组
  "u8uouo",        // 第2分组
  "&",             // 第3分组
  index: 10,
  input: "domain=123&test=u8uouo&today=1",
  groups: undefined
]

trim 去空格

使用方法 trim(),删除字符串首尾的空格. 返回一个新的字符串。 Whitespace in this context is all the whitespace characters (space, tab, no-break space, etc.) and all the line terminator characters (LF, CR, etc.

localeCompare 排序

判断两个字符串在 sort 顺序中的先后位置。

referenceStr.localeCompare(compareString[, locales[, options]])

返回负数表示,reference string 在 compare string 前面;正数表示reference string排在后面;0表示相等。

重复

使用 repeat() 方法,重复一个字符串 n 次。

"hello ".repeat(5); // "hello hello hello hello hello"