在Javascript里,所有的文本数据都以String的类型存储,它没有单个的字符类型。String类型的数据默认以UTF-16的格式存储,跟页面编码没有关系。
引号
Javascript声明一个字符串有三种形式,分别是单引号、双引号和反引号,例如:
let single = 'single-quoted';
let double = "double-quoted";
let backticks = `backticks`;
单引号和双引号本质上是一样的,反引号主要用来在字符串里嵌套表达式,例如:
function sum(a, b) {
return a + b;
}
alert(`1 + 2 = ${sum(1, 2)}.`); // 1 + 2 = 3.
使用反引号的另外一个好处就是字符串内容可以跨越多行,例如:
let guestList = `Guests:
* John
* Pete
* Mary
`;
alert(guestList); // a list of guests, multiple lines
这样的话,输出内容的格式就和你声明的字符串格式一样,但如果使用单引号或者双引号来实现跨行的话就会报错,例如:
let guestList = "Guests: // Error: Unexpected token ILLEGAL
* John";
特殊字符
反引号可以轻松实现换行,当然单引号或则双引号也可以,只不过要是用一个特殊字符--换行符"\n",例如下面这两个例子运行的结果是一样的:
alert( "Hello\nWorld" ); // two lines using a "newline symbol"
// two lines using a normal newline and backticks
alert( `Hello
World` );
当然还有其他的特殊字符,例如"\b"表示空格,"\t"表示tab键,具体可以参考相关文档。
字符串的长度
alert( `My\n`.length ); // 3
这里要注意的是.length是一个数字类型的属性,并不是方法。
访问单个字符
let str = `Hello`;
// the first character
alert( str[0] ); // H
alert( str.charAt(0) ); // H
// the last character
alert( str[str.length - 1] ); // o
字符串的索引默认从0开始的,str[pos]的形式如果没有找到字符则会放回undefined,而str.charAt(pos)则会返回空字符串,例如:
let str = `Hello`;
alert( str[1000] ); // undefined
alert( str.charAt(1000) ); // '' (an empty string)
我们也可以使用迭代的方式来访问字符,如下:
for (let char of "Hello") {
alert(char); // H,e,l,l,o (char becomes "H", then "e", then "l" etc)
}
字符串是不可变的
let str = 'Hi';
str[0] = 'h'; // error
alert( str[0] ); // doesn't work
通常的办法是创建一个新的字符串然后将旧的字符串指向它,比如:
let str = 'Hi';
str = 'h' + str[1]; // replace the string
alert( str ); // hi
改变字符串的大小写
字符串的大小写可以使用toLowerCase()或者toUpperCase(),例如:
alert( 'Interface'.toUpperCase() ); // INTERFACE
alert( 'Interface'.toLowerCase() ); // interface
改变某个索引号的字符如下:
alert( 'Interface'[0].toLowerCase() ); // 'i'
查找子字符串
str.indexOf(substr,pos)
该方法substr表示要查找的子字符串,pos表示索引位置,若找到子字符串则返回它出现的索引号,如果没找到就返回-1,例如:
let str = 'Widget with id';
alert( str.indexOf('Widget') ); // 0, because 'Widget' is found at the beginning
alert( str.indexOf('widget') ); // -1, not found, the search is case-sensitive
alert( str.indexOf("id") ); // 1, "id" is found at the position 1 (..idget with id)
let str = 'Widget with id';
alert( str.indexOf('id', 2) ) // 12
str.lastIndexOf(substr,pos)
与indexOf()方法相似,只不过是从字符串的尾部向头部查找,例如:
'canal'.lastIndexOf('a'); // returns 3
'canal'.lastIndexOf('a', 2); // returns 1
'canal'.lastIndexOf('a', 0); // returns -1
'canal'.lastIndexOf('x'); // returns -1
'canal'.lastIndexOf('c', -5); // returns 0
'canal'.lastIndexOf('c', 0); // returns 0
'canal'.lastIndexOf(''); // returns 5
'canal'.lastIndexOf('', 2); // returns 2
includes, startsWith, endsWith方法
str.includes(substr, pos)用于查看是否包含子串,若包含则返回true,否则返回false
alert( "Widget with id".includes("Widget") ); // true
alert( "Hello".includes("Bye") ); // false
alert( "Midget".includes("id") ); // true
alert( "Midget".includes("id", 3) ); // false, from position 3 there is no "id"
startsWith, endsWith看例子:
alert( "Widget".startsWith("Wid") ); // true, "Widget" starts with "Wid"
alert( "Widget".endsWith("get") ); // true, "Widget" ends with "get"
截取子字符串
javascript有三个内置方法来实现子字符串的截取
str.slice(start [, end])
let str = "stringify";
alert( str.slice(0, 5) ); // 'strin', the substring from 0 to 5 (not including 5)
alert( str.slice(0, 1) ); // 's', from 0 to 1, but not including 1, so only character at 0
let str = "stringify";
alert( str.slice(2) ); // ringify, from the 2nd position till the end
let str = "stringify";
// start at the 4th position from the right, end at the 1st from the right
alert( str.slice(-4, -1) ); // gif
str.substring(start [, end])
let str = "stringify";
// these are same for substring
alert( str.substring(2, 6) ); // "ring"
alert( str.substring(6, 2) ); // "ring"
// ...but not for slice:
alert( str.slice(2, 6) ); // "ring" (the same)
alert( str.slice(6, 2) ); // "" (an empty string)
str.substr(start [, length])
let str = "stringify";
alert( str.substr(2, 4) ); // ring, from the 2nd position get 4 characters
let str = "stringify";
alert( str.substr(-4, 2) ); // gi, from the 4th position get 2 characters
字符串比较
javascript按照字符顺序对字符串进行比较,比较两个字符的大小是按编码集(UTF-16)的编码值为依据
alert( 'a' > 'Z' ); // true
alert( 'Österreich' > 'Zealand' ); // true
我们可以调用str.codePointAt(pos)来获取字符在编码集(UTF-16)的编码值,例如:
// different case letters have different codes
alert( "z".codePointAt(0) ); // 122
alert( "Z".codePointAt(0) ); // 90
也可以调用String.fromCodePoint(code)获取编码值对应的字符,例如:
alert( String.fromCodePoint(90) ); // Z
还有一种方式是使用"\u"字符来获取编码值对应的字符,\u后边写的是十六进制格式的编码值。例如:
// 90 is 5a in hexadecimal system
alert( '\u005a' ); // Z
正确的字符串比较方案
alert( 'Österreich'.localeCompare('Zealand') ); // -1