1、定义字符串
在JavaScript中定义字符串有多种形式。
1.1字符串直接量
使用双引号或单引号包含任意长度的字符文本。
var s="true";
var s="234";
var s="{x:1,y:2}";
var s="[2,3,4]";
说明:单引号中可以包含双引号,双引号中也可以包括单引号。
var s="alert('hello,word')";
var s='alert("hello,world")';
1.2构造字符串
使用String()构造函数可以构造字符串,该函数可以接收一个参数,并把它作为初始值来初始化字符串。
var s=new String();//创建空字符串
var s=new String("构造字符串");
构造字符串与字符串直接量的数据类型差异。
var s1=new String(1);
var s2="1";
alert(typeof s1);//object
alert(typeof s2);//string
var s=String(1,2,3,4);
alert(s);//1
alert(typeof s);//string
1.3使用字符编码
使用fromCharCode()方法可以把字符编码转换为字符串。该方法可以包含多个整数参数,每个参数代表字符的Unicode编码,返回值为字符编码的字符串表示。
var s=[35835,32773,24744,22909],b=[];
for(var i in s){
b.push(String.fromCharCode(s[i]));
}
alert(b.join(""));//读者您好
var s=[35835,32773,24744,22909],b=[];
var b=String.fromCharCode.apply(null,s);
alert(b);//读者您好
2、字符串的值和字符串长度
2.1字符串的值
使用字符串的toString()方法可以返回字符串的值。
var s="javascript";
var a=s.toString();
alert(a);//javascript
var s="javascript";
var a=s.valueOf();
alert(a);//javascript
2.2字符串的长度
使用字符串的length属性可以读取字符串的长度,以字符个数计算。
var s="javascript";
alert(s.length);//10
获取字符串的字节长度。
利用正则表达式把字符串中双字节字符临时替换为两个字符,然后调用length属性获取临时字符串的长度。
3、字符串连接
使用多个字符串连接在一起的最简单方法是使用加号运算符。
var s1="234";
var s2="jhi";
var c=s1+s2;
alert(c);//234jhi
var s1="234";
var s2=s1.concat("de","56","oo");
alert(s2);//234de56oo
4、字符串查找
4.1获取指定位置的字符
使用字符串的charAt()和charCodeAt()方法,可以根据参数返回指定下标位置的字符或字符编码。
使用charAt()把字符串中每个字符都装入一个数组中,从而可以为String对象扩展一个原型方法,用来把字符串转换为数组。
String.prototype.toArray = function(){
var l = this.length, a = [];
if( l ){
for( var i = 0; i < l; i ++ ){ // 遍历字符串,间接枚举每个字符
a.push( this.charAt( i ) ); // 把每个字符按顺序装入数组
}
}
return a;
}
var s = "abcdefghijklmn".toArray(); // 把字符串转换为数组
for(var i in s){ // 遍历被转换的字符串,并枚举每个字符
alert(s[i]);
}
var s = "http://www.mysite.cn/index.html";
var n = s.lastIndexOf( "." );
alert(n);// 返回值为26,即第三个字符.的下标位置
var s = "http://www.mysite.cn/index.html";
var n = s.lastIndexOf( "." , 11 );
alert(n);// 返回值为10,而不是15
4.2查找字符串的位置
indexOf()和lastIndex()方法可以根据指定字符串查找它的下标位置。
var s = "javascript";
var i = s.indexOf("a",-10);
alert(i); // 返回值为1,即字符串中第二个字符
var s = "http://www.mysite.cn/";
var a = s.indexOf( "www" );
alert(a);// 返回值为7,即第一个字符w的下标位置
var s = "http://www.mysite.cn/";
var b = s.indexOf( "." );
alert(b);// 返回值为10,即第一个字符.的下标位置
var e = s.indexOf( ".", b+1);
alert(e); // 返回值为17
var s = "http://www.mysite.cn/index.html";
var n = s.lastIndexOf( "." , 11 );
alert(n);// 返回值为10
var s = "http://www.mysite.cn/index.html";
var n = s.lastIndexOf( "www" );
alert(n);// 返回值为7
4.3匹配字符串
search()方法,仅有一个参数。
var s = "http://www.mysite.cn/index.html";
var n = s.search( "//" );
alert(n);// 返回值为5
与search()方法相比,match()方法要强大很多,它能够找出所有匹配的子字符串,并存储在一个数组中返回。
var s = "http://www.mysite.cn/index.html";
var a = s.match(/h/g); // 全局匹配所有字符h
alert( a ); // 返回数组[h,h]
var s = "http:// www.mysite.cn/index.html"; // 匹配字符串
var a = s.match( /(\.).*(\.).*(\.)/ ); // 执行一次匹配检索
alert( a.length ); // 返回4,说明返回的是一个包含4个元素的数组
alert( a[0] ); // 返回字符串".mysite.cn/index."
alert( a[1] ); // 返回第一个字符.(点号),由第一个子表达式匹配并存储
alert( a[2] ); // 返回第二个字符.(点号),由第二个子表达式匹配并存储
alert( a[3] ); // 返回第三个字符.(点号),由第三个子表达式匹配并存储
alert( a.index ); // 返回值11,说明第一个点号字符的起始下标位置
alert( a.input );// 返回被匹配字符串"http:// www.mysite.cn/index.html"
5、字符串截取
字符串方法 | 说明 |
---|---|
slice() | 根据指定长度来截取一个子串 |
substr() | 根据指定的起止下标位置来截止一个子串 |
substring() | 返回字符串的一个子串 |
5.1截取指定长度字符串
var s = "http:// www.mysite.cn/index.html";
var b = s.substr( s.lastIndexOf( "." )+1, 4 ); // 截取最后一个点号后4个字符
alert( b ); // 返回子字符串"html"
5.2截取起止下标位置字符串
var s = "http://www.mysite.cn/index.html";
var a = s.indexOf( "www" ); // 获取起始点下标
var b = s.indexOf( "/", a ); // 获取结束点后下标
var c = s.substring( a, b );
// 返回字符串www.mysite.cn,使用substring()方法
var d = s.slice( a, b );
alert(d);// 返回字符串www.mysite.cn,使用slice()方法
var s = "http://www.mysite.cn/index.html";
var a = s.indexOf( "www" ); // 获取起始点下标
var b = s.indexOf( "/", a ); // 获取结束点后下标
var c = s.substring( b, a ); // 返回字符串www.mysite.cn
var d = s.slice( b, a );
alert(d);// 返回空字符串
var s = "http:// www.mysite.cn/index.html";
var a = s.indexOf( "www" ); // 获取起始点下标
var b = s.indexOf( "/", a ); // 获取结束点后下标
var c = s.substring( -b, -a ); // 返回空字符串
var d = s.slice( -b, -a ); // 返回子字符串mysite.cn
alert(d);// 返回.mysite.cn/in
6、字符串替换
replace()方法能够实现字符串替换。该方法包含两个参数,第1个参数表示执行匹配的正则表达式,第2个参数表示准备代替匹配的字符串。
replace()方法第2个参数中特殊字符
约定字符串 | 说明 |
---|---|
$1、$2、……、$99 | 与正则表达式中的第1到99个子表达式相匹配的文本 |
$& | 与正则表达式相匹配的子字符串 |
$` | 位于匹配子字符串左侧的文本 |
$’ | 位于匹配子字符串右侧的文本 |
$$ | 表示$符号 |
var s = "http:// www.mysite.cn/index.html";
var b = s.replace( /html/, "htm" ); // 把字符串html替换为htm
alert( b ); // 返回字符串"http:// www.mysite.cn/index.htm"
var s = "http:// www.mysite.cn/index.html";
function f( x ){ // 替换文本函数
return x.substring( x.lastIndexOf(".")+1, x.length - 1 )
// 获取扩展名部分字符串
}
var b = s.replace( /(html)/, f(s)); // 调用函数指定替换文本操作
alert( b ); // 返回字符串"http:// www.mysite.cn/index.htm"
在replace()方法中约定了一个特殊的字符($),这个美元符号如果附加一个序号就表示对正则表达式中匹配的子表达式存储的字符串引用。
var s = "javascript";
var b = s.replace( /(java)(script)/, "$2-$1"); // 交换位置
alert( b ); // 返回字符串"script-java"
重复字符串。
var s = "javascript";
var b = s.replace( /.*/, "$&$&");
alert( b ); // 返回字符串javascriptjavascript
对匹配文本左侧的文本完全引用。
var s = "javascript";
var b = s.replace( /script/, "$& != $`");
alert( b ); // 返回javascript != java
对匹配文本右侧的文本完全引用。
var s = "javascript";
var b = s.replace( /java/, "$&$' is ");
alert( b ); // 返回javascript is script
7、字符串大小转换
String字符串大小写转换方法
字符串方法 | 说明 |
---|---|
toLocaleLowerCase() | 把字符串转换成小写 |
toLocaleUpperCase() | 把字符串转换成大写 |
toLowerCase() | 把字符串转换成小写 |
toUpperCase() | 把字符串转换成大写 |
var s = "javascript";
alert(s.toUpperCase()); // 返回字符串" JAVASCRIPT "
8、字符串比较
大于(>), 小于(<)运算符
(function(){
console.log('18'>'6'); // 输出:false
console.log(9>'8'); // 输出: true
console.log('f'>'ABDC') // 输出: true
console.log(19>'ssf') // 输出 false
console.log('A'>'abcdef') // 输出 false
})()
相等==,严格相等===运算符
(function(){
console.log('8'==8) // true
console.log('3'===3) // false
console.log(7===7) // true
console.log('abc'==6) // false
console.log('abc'=='abc') // true
console.log('abc'==='abc') // true
})()
9、字符串与数组转换
String()类型的join()方法能够把数组元素连接为字符串。
如果参数为空字符串,则split()方法能够按单个字符进行分切,然后返回与字符串等长的数组。
var s = "javascript";
var a = s.split(""); // 按字符空隙分割
alert( s.length ); // 返回值为10
alert( a.length ); // 返回值为10
如果参数为空,则split()方法能够把整个字符串作为一个元素的数组返回,它相当于把字符串转换为数组。
var s = "javascript";
var a = s.split(); // 空分割
alert( a.constructor == Array ); // 返回true,说明是Array实例
alert( a.length ); // 返回值为1,说明没有对字符串进行分割
如果参数为正则表达式,则split()方法能够以匹配文本作为分隔符进行切分。
var s = "a2b3c4d5e678f12g";
var a = s.split(/\d+/); // 把匹配的数字为分隔符来切分字符串
alert( a ); // 返回数组[a,b,c ,d,e, f,g]
alert( a.length ); // 返回数组长度为7
如果正则表达式匹配的文本位于字符串的边沿,则split()方法也执行分切操作,且为数组添加一个空元素。但是在IE浏览器中会忽略边沿空的字符串,而不是把它作为一个空元素来看待。
var s = "122a2b3c4d5e678f12g"; // 虽然字符串左侧也有匹配的数字
var a = s.split(/\d+/); // 把匹配的数字为分隔符来切分字符串
alert( a ); // 返回数组[,a,b,c ,d,e, f,g]
alert( a.length ); // 返回数组长度为8
split()方法支持第二个参数,该参数是一个可选的整数,用来指定返回数组的最大长度。如果设置了该参数,返回的数组长度不会多于这个参数指定的值。如果没有设置该参数,整个字符串都被分割,不考虑数组长度。
var s = "javascript";
var a = s.split("",4); // 按顺序从左到有,仅分切4个元素的数组
alert( a ); // 返回数组[j,a,v,a]
alert( a.length ); // 返回值为4
如果想使返回的数组包括分隔符或分隔符的一个或多个部分,可以使用带子表达式的正则表达式来实现。
var s = "aa2bb3cc4dd5e678f12g";
var a = s.split(/(\d)/); // 使用小括号包含数字分隔符
alert(a); // 返回数组[aa,2,bb,3,cc,4,dd,5,e,6,,7,,8,f,1,,2,g]
小写字母a的编码为97,大写字母A的编码为65,则比较时字符串"a"就大于"A"。
alert( "a" > "A" ); // 返回true
var s = "javascript"; // 定义字符串直接量
var a = s.split( "" ); // 把字符串转换为数组
var s1 = a.sort( function( a, b ) { // 对数组进行排序
return a.localeCompare( b ) // 将根据前后字符在本地的约定进行排序
});
a = s1.join( "" ); // 然后再把数组还原为字符串
alert( a ); // 返回字符串"aacijprstv"
10、字符串格式化
下面示例演示了如何使用上面字符串方法为字符串定义格式化显示属性:
var s = "abcdef";
document.write(s.bold()); // 定义加粗显示字符串"abcdef"
document.write(s.link("http:// www.mysite.cn/"));
// 为字符串"abcdef"定义超链接,指向mysite.cn域名
document.write(s.italics()); // 定义斜体显示字符串"abcdef"
document.write(s.fontcolor("red")); // 定义字符串"abcdef"红色显示
11、字符编码和解码
JavaScript编码和解码方法
方法 | 说明 |
---|---|
escape() | 使用转义序列替换某些字符来对字符串进行编码 |
unescape() | 对使用escape()编码的字符串进行解码 |
encodeURI() | 通过转义某些字符对URI进行编码 |
decodeURI() | 对使用encodeURI()方法编码的字符串进行解码 |
encodeURIComponent() | 通过转义某些字符对URI的组件进行编码 |
decodeURIComponent() | 对使用encodeURIComponent()方法编码的字符串进行解码 |
- escape()和unescape()方法
var s = "javascript中国";
s = escape(s);
alert(s);
var s = "javascript中国";
s = escape(s); // Unicode编码
alert(s); // 返回字符串"javascript%u4E2D%u56FD"
s = unescape(s); // Unicode解码
alert(s); // 返回字符串"javascript中国"
这种被解码的代码是不能够直接运行的,读者可以使用eval()方法来执行它。
var s = escape('alert("javascript中国");'); // 编码脚本
var s = unescape( s); // 解码脚本
eval(s); // 执行被解码的脚本
- encodeURI()和decodeURI()方法
encodeURI()方法能够把URI字符串进行转义处理。
var s = "javascript中国";
s = encodeURI(s);
alert(s); //javascript%E4%B8%AD%E5%9B%BD
var s = "javascript中国";
s = encodeURI(s); // URI编码
alert(s); // 返回字符串"javascript%E4%B8%AD% E5%9B%BD"
s = decodeURI(s); // URI解码
alert(s); // 返回字符串" javascript中国"
- encodeURIComponent()和decodeURIComponent()方法
var s = "http:// www.mysite.cn/navi/search.asp?keyword=URI";
a = encodeURI(s);
document.write(a);
document.write("<br />");
b = encodeURIComponent(s);
document.write(b);
对于encodeURIComponent()方法编码的结果进行解码,可以使用decodeURIComponent()方法来快速实现:
var s = "http:// www.mysite.cn/navi/search.asp?keyword=URI";
b = encodeURIComponent(s);
b = decodeURIComponent(b)
document.write(b);
12、Unicode编码和解码
var toUnicode = String.prototype.toUnicode = function(){
// 对字符串进行编码方法
var _this = arguments[0] || this;
function f(){ // 定义替换文本函数
return "&#" + arguments[0].charCodeAt(0) + ";";
// 以网页编码格式显示被编码的字符串
}
return _this.replace(/[^\u00-\uFF]|\w/gmi, f);
// 使用replace()方法执行匹配、替换操作
};
var s = "javascript中国"; // 定义字符串直接量
s = toUnicode(s); // 以静态方式调用toUnicode()方法
alert(s); // 返回Unicode编码字符串
var s = "javascript中国";
s = s.toUnicode(); // 以String对象的方法调用toUnicode()方法
alert(s);
document.write(s);//JavaScript中国
var fromUnicode = String.prototype.fromUnicode = function(){
// 对Unicode编码进行解码操作
var _this = arguments[0] || this;
// 判断是否存在参数,如果存在则使用静态方法调用参数值,
function f(){ // 定义替换文本函数
return String.fromCharCode(arguments[1]);
// 把第一个子表达式值(Unicode编码)转换为字符
}
return _this.replace(/&#(\d*);/gmi, f);
// 使用replace()匹配并替换Unicode编码为字符
};
var s = "javascript中国"; // 定义字符串直接量
s = s.toUnicode(); // 对字符串进行Unicode编码
alert(s); // 返回字符串
s = s.fromUnicode(); // 对被编码的字符串进行解码
alert(s); // 返回字符串“javascript中国”