Javascript中String类型详细介绍
在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键,具体可以参考相关文档。
字符串的长度
string有个内置的属性length,用来返回字符串的长度,例如:
alert( `my\n`.length ); // 3
这里要注意的是.length是一个数字类型的属性,并不是方法。
访问单个字符
为了访问字符串里的某个字符,我们可以使用str[pos]的形式,或则调用方法str.charat(pos),例如:
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) }
字符串是不可变的
字符串在javascript里面是不能改变的,我们不能改变字符串的某个字符,例如:
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
正确的字符串比较方案
由于不用的语言会有不同的编码集,不过好消息是所有的现代都支持国际编码集ecma 402,故我们可以使用str.localecompare(str2)来进行字符串比较,若大于返回1,小于返回-1,等于返回0,例如:
alert( '?sterreich'.localecompare('zealand') ); // -1
下一篇: JavaScript函数表达式实例讲解