乐趣区

关于javascript:JavaScript中的String类型

JavaScript 中的 String 类型

String 类型是字符串的对象包装类型,能够像上面这样应用 String 构造函数来创立。

String 对象的办法也能够在所有根本的字符串值中拜访到。其中,继承的 valueOf()、toLocale- String()和 toString()办法,都返回对象所示意的根本字符串值。

String 类型的每个实例都有一个 length 属性,示意字符串中蕴含多个字符。

var stringValue = "hello world";
alert(stringValue.length); //"11"

这个例子输入了字符串 ”hello world” 中的字符数量,即 ”11″。应该留神的是,即便字符串中包 含双字节字符(不是占一个字节的 ASCII 字符),每个字符也依然算一个字符。

String 类型提供了很多办法,用于辅助实现对 ECMAScript 中字符串的解析和操作。

1. 字符办法

两个用于拜访字符串中特定字符的办法是:charAt()和 charCodeAt()。这两个办法都接管一个 参数,即基于 0 的字符地位。其中,charAt()办法以单字符字符串的模式返回给定地位的那个字符 (ECMAScript 中没有字符类型)。

var stringValue = "hello world";
alert(stringValue.charAt(1)); //"e"

字符串 ”hello world” 地位 1 处的字符是 ”e”,因而调用 charAt(1)就返回了 ”e”。如果你想得到 的不是字符而是字符编码,那么就要像上面这样应用 charCodeAt()了。

var stringValue = "hello world";
alert(stringValue.charCodeAt(1)); // 输入 "101" 

这个例子输入的是 ”101″,也就是小写字母 ”e” 的字符编码。

ECMAScript 5 还定义了另一个拜访个别字符的办法。在反对此办法的浏览器中,能够应用方括号加数 字索引来拜访字符串中的特定字符,

var stringValue = "hello world";
alert(stringValue[1]); //"e"

应用方括号表示法拜访个别字符的语法失去了 IE8 及 Firefox、Safari、Chrome 和 Opera 所有版本的 反对。如果是在 IE7 及更早版本中应用这种语法,会返回 undefined 值(只管基本不是非凡的 6 undefined 值)。

2. 字符串操作方法

第一个就是 concat(),用于将一或多个字符串拼接起来,返回拼接失去的新字符串。

var stringValue = "hello";
var result = stringValue.concat("world"); alert(result); //"hello world" alert(stringValue); //"hello" 

在这个例子中,通过 stringValue 调用 concat()办法返回的后果是 ”hello world”——但 stringValue 的值则放弃不变。实际上,concat()办法能够承受任意多个参数,也就是说能够通过它 9 拼接任意多个字符串。

var stringValue = "hello";
var result = stringValue.concat("world", "!");
alert(result); //"hello world!" alert(stringValue); //"hello" 

这个例子将 ”world” 和 ”!” 拼接到了 ”hello” 的开端。尽管 concat()是专门用来拼接字符串的方 11 法,但实际中应用更多的还是加号操作符(+)。而且,应用加号操作符在大多数状况下都比应用 concat() 办法要简便易行(特地是在拼接多个字符串的状况下)。

ECMAScript 还提供了三个基于子字符串创立新字符串的办法:slice()、substr()和 substring()。12 这三个办法都会返回被操作字符串的一个子字符串,而且也都承受一或两个参数。第一个参数指定子字 符串的开始地位,第二个参数 (在指定的状况下) 示意子字符串到哪里完结。具体来说,slice()和 substring()的第二个参数指定的是子字符串最初一个字符前面的地位。而 substr()的第二个参数指定的则是返回的字符个数。如果没有给这些办法传递第二个参数,则将字符串的长度作为完结地位。与 concat()办法一样,slice()、substr()和 substring()也不会批改字符串自身的值——它们只是 返回一个根本类型的字符串值,对原始字符串没有任何影响。

var stringValue = "hello world";
alert(stringValue.slice(3));
alert(stringValue.substring(3));
alert(stringValue.substr(3));
alert(stringValue.slice(3, 7));
alert(stringValue.substring(3,7));
alert(stringValue.substr(3, 7));
//"lo world"
//"lo world"
//"lo world"
//"lo w"
//"lo w"
//"lo worl"

这个例子比拟了以雷同形式调用 slice()、substr()和 substring()失去的后果,而且少数情 况下的后果是雷同的。在只指定一个参数 3 的状况下,这三个办法都返回 ”lo world”,因为 ”hello” 中的第二个 ”l” 处于地位 3。而在指定两个参数 3 和 7 的状况下,slice()和 substring()返回 ”lo w” (“world” 中的 ”o” 处于地位 7,因而后果中不蕴含 ”o”),但 substr()返回 ”lo worl”,因为它的第二 个参数指定的是要返回的字符个数。

在传递给这些办法的参数是负值的状况下,它们的行为就不尽相同了。其中,slice()办法会将传 入的负值与字符串的长度相加,substr()办法将负的第一个参数加上字符串的长度,而将负的第二个 参数转换为 0。最初,substring()办法会把所有负值参数都转换为 0。

var stringValue = "hello world";
alert(stringValue.slice(-3));
alert(stringValue.substring(-3));
alert(stringValue.substr(-3));
alert(stringValue.slice(3, -4));
alert(stringValue.substring(3, -4));
alert(stringValue.substr(3, -4));
//"rld" //"hello world" //"rld"
//"lo w" //"hel" //""(空字符串) 

这个例子清晰地展现了上述三个办法之间的不同行为。在给 slice()和 substr()传递一个负值 参数时,它们的行为雷同。这是因为 -3 会被转换为 8(字符串长度加参数 11+(3)=8),实际上相当 于调用了 slice(8)和 substr(8)。但 substring()办法则返回了全副字符串,因为它将 -3 转换 成了 0。

当第二个参数是负值时,这三个办法的行为各不相同。slice()办法会把第二个参数转换为 7,这 就相当于调用了 slice(3,7),因而返回 ”lo w”。substring()办法会把第二个参数转换为 0,使调 用变成了 substring(3,0),而因为这个办法会将较小的数作为开始地位,将较大的数作为完结地位,因而最终相当于调用了 substring(0,3)。substr()也会将第二个参数转换为 0,这也就意味着返回 蕴含零个字符的字符串,也就是一个空字符串。

3. 字符串地位办法

有两个能够从字符串中查找子字符串的办法:indexOf()和 lastIndexOf()。这两个办法都是从 一个字符串中搜寻给定的子字符串,而后返子字符串的地位 (如果没有找到该子字符串,则返回 -1)。这两个办法的区别在于:indexOf() 办法从字符串的结尾向后搜寻子字符串,而 lastIndexOf()办法 是从字符串的开端向前搜寻子字符串。

var stringValue = "hello world";
alert(stringValue.indexOf("o")); //4
alert(stringValue.lastIndexOf("o")); //7

子字符串 ”o” 第一次呈现的地位是 4,即 ”hello” 中的 ”o”; 最初一次呈现的地位是 7,即 ”world” 中的 “o”。如果 ”o” 在这个字符串中仅呈现了一次,那么 indexOf()和 lastIndexOf()会返回雷同的地位值。

这两个办法都能够接管可选的第二个参数,示意从字符串中的哪个地位开始搜寻。换句话说,indexOf()会从该参数指定的地位向后搜寻,疏忽该地位之前的所有字符; 而 lastIndexOf()则会从 指定的地位向前搜寻,疏忽该地位之后的所有字符。

var stringValue = "hello world";
alert(stringValue.indexOf("o", 6)); //7
alert(stringValue.lastIndexOf("o", 6)); //4

在将第二个参数 6 传递给这两个办法之后,失去了与后面例子相同的后果。这一次,因为 indexOf()是从地位 6(字母 ”w”)开始向后搜寻,后果在地位 7 找到了 ”o”,因而它返回 7。而 last- IndexOf()是从地位 6 开始向前搜寻。后果找到了 ”hello” 中的 ”o”,因而它返回 4。在应用第二个 参数的状况下,能够通过循环调用 indexOf()或 lastIndexOf()来找到所有匹配的子字符串,如下 面的例子所示:

var stringValue = "Lorem ipsum dolor sit amet, consectetur adipisicing elit"; var positions = new Array();
var pos = stringValue.indexOf("e");
while(pos > -1){positions.push(pos);
 pos = stringValue.indexOf("e", pos + 1);
}
alert(positions); //"3,24,32,35,52"

这个例子通过一直减少 indexOf()办法开始查找的地位,遍历了一个长字符串。在循环之外,首 先找到了 ”e” 在字符串中的初始地位; 而进入循环后,则每次都给 indexOf()传递上一次的地位加 1。这样,就确保了每次新搜索都从上一次找到的子字符串的前面开始。每次搜寻返回的地位顺次被保留在 数组 positions 中,以便未来应用。

退出移动版