欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Javascript中String类型详细介绍

程序员文章站 2022-07-21 23:18:34
在javascript里,所有的文本数据都以string的类型存储,它没有单个的字符类型。string类型的数据默认以utf-16的格式存储,跟页面编码没有关系。 引号 jav...

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