Javascript字符串string
本文属于原创文章,转载请注明–来自桃源小盼聊技术
字符串是Javascript最常用的数据类型,是五种基本数据类型之一(其他是number, boolean, null, undefined)。
我们常用的是字符串字面量形式。
检测是否为字符串
typeof直接去检测是不准确的,通用的类型检测方法又太过繁琐。
而借助valueOf()方法,则可以返回一个字符串字面量。(此方式也适用于number与boolean)
var str1 = 'hello';
var str2 = new String('world');
typeof str1; // string
typeof str2; // object
typeof str2.valueOf(); // string
其他类型转换为字符串
大部分情况下调用toString()方法即可,然后null和undefined则需要使用String()方法。
var num = 1;
num.toString(); // '1'
var other = String(null) // 'null'
一元运算符和字符串
当一个字符串和其他类型相加时,其他类型会转换成字符串,再相加。
而如果是和其他类型做比较和减法运算时,字符串会转换成数字,再计算。
var str = '1';
var num = 5;
var boo = true;
num - str; // 4
str == boo; // true
str.concat()
将一个或者多个字符串参数附加到字符串对象末尾,拼接成一个字符串。
var str = 'Hello';
str.concat(' ', 'World'); // Hello World
然而最常用的还是’+’运算符。
var str = '5' '1'; // 51
var str2 = 5 + '1'; // 51
var num = 5 + (+'1'); // 6
当其他数据类型和字符串相加时,首先会被转换成字符串。
但是在数字字符串前面加入一个’+’运算符,将会把字符串转化为数字。
str.indexOf() 与 str.lastIndexOf()
在原始字符串中查找参数字符串,如果存在,则返回参数字符串索引位置。不存在返回-1。
第二个参数代表查找的起始位置。
var str = 'god is god';
str.indexOf('god'); // 0
str.indexOf('god', 4); // 7
str.indexOf('are'); // -1
lastIndexOf()则是从右向左搜索,第二个参数也是从右向左计数。
str.lastIndexOf('god'); // 7
str.lastIndexOf('god', 1); // 0
str.indexOf('god', 0); // 0
str.lastIndexOf('god', 0); // 0
Javascript从右向左计算时,通常遵循左包括右不包括。
str.search()
在字符串中查找符合正则表达式的匹配项,如果匹配成功,返回首次匹配项的索引,否则返回-1。
var str = 'hello 123 world';
str.search(/\d/); // 6
str.search(/china/); // -1
str.match()
参数为正则表达式对象,返回一个包含匹配结果的数组。
var str = '1 hello 2 world 3';
var arr = str.match(/\d/g); // [1, 2, 3]
str.replace()
语法
str.replace(regexp/substr, newstr/function)
用字符串替换匹配项,返回新字符串。
第一个参数可以是字符串或正则表达式对象。
第二个参数为替换字符串或者函数返回值。
var str = '1 hello 2 world 3';
var str2 = str.replace('world', 'china'); // '1 hello 2 china 3'
var str3 = str.replace(/\d/g, '88'); // '88 hello 88 china 88'
//函数四个参数分别为匹配项、p1正则表达式一个括号匹配项(p2为第二个括号匹配项,以此类推)、匹配项索引位置、原始字符串
//此方法将所有项打印出来看看
var str4 = str.replace(/(\d)/g, function(match, p1, offset, string){
return '(match:' + match + '-p1:' + p1 + '-offset:' + offset + '-string:' + string + ')';
})
// '(match:1-p1:1-offset:0-string:1 hello 2 world 3) hello (match:2-p1:2-offset:8-string:1 hello 2 world 3) world (match:3-p1:3-offset:16-string:1 hello 2 world 3)'
str.slice()
语法
str.slice(start, end);
提取字符串中的一部分,参数为索引位置,第二个参数可选(默认为字符串长度)。
如果参数为负,自动被加上字符串长度计算。
var str = 'God is god';
var str2 = str.slice(0, 3); // God
var str3 = str.slice(4); // is god
var str4 = str.slice(-3, -1); // go
str.substring()
语法
str.substring(start, end)
此方法和slice()相似。只是如果参数为负数,则按照0计算。如果参数大于字符串长度,则按照str.length计算。
var str = 'God is god';
var str1 = str.substring(0, 3); // God
var str2 = str.substring(-2, 3); // God
var str3 = str.substring(4); // is god
var str4 = str.substring(7, 10); // god
var str5 = str.substring(7, 20); // god
str.substr()
语法
str.substr(start, length)
提取字符串中指定长度的子字符串。
第一个参数为起始索引位置,如果为负数,则自动被加上字符串长度计算。
第二个参数为截取的长度,可选的(默认字符串长度),如果为0或者负数,则返回空字符串。
var str = 'God is god';
var str1 = str.substr(0, 3); // God
var str2 = str.substr(-3, 3); // god
var str3 = str.substr(3, -1); // ''
var str4 = str.substr(4); // is god
str.split()
语法
str.split(sep, limit)
将一个字符串按照给定分隔符,分割为一个数组。
第一个参数为字符串或正则表达式,第二个参数限制数组长度。
var str = '1,2,3,4,5';
var arr = str.split(','); // [1, 2, 3, 4, 5]
var arr2 = str.split(',', 3); // [1, 2, 3]
var arr3 = str.split(/,/); // [1, 2, 3, 4, 5]
str.trim()
去除字符串两端的空白。
var str1 = ' hello ';
var str2 = ' hello';
var str3 = 'hello ';
var str4 = 'he llo';
str1.trim(); // hello
str2.trim(); // hello
str3.trim(); // hello
str4.trim(); // he llo
trim()不存在时的兼容代码
if (!String.prototype.trim) {
String.prototype.trim = function () {
return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
};
}
str.charAt()
获取指定索引位置的字符。
var str = 'hello world';
str.charAt(0); // h
str.charAt(6); // w
str.charCodeAt()
获取指定索引位置字符的Unicode编码。
var str = 'hello wrold';
str.charCodeAt(0); // 104
str.charCodeAt(6); // 119
String.fromCharCode()
静态方法,根据指定的Unicode编码,返回响应的字符串。
String.fromCharCode(97,98,99); // abc
str.toUpperCase() 与 str.toLowerCase()
字符串大小写转换。
var str = 'hello china';
var str2 = 'HELLO WORLD';
str.toUpperCase(); // HELLO CHINA
str2.toLowerCase(); // hello world
str.localeCompare()
字符串比较函数,如果原始字符串在词法上比参数字符串大,返回1,相等的话返回0,否则返回-1。
一般情况下使用比较运算符即可。
var str = 'abcd';
str.localeCompare('efgh'); // -1;
str.localeCompare('ABCD'); // 1
JSON.parse()
语法
JSON.parse(str, function(prop, val){});
将一个json字符串解析成为一个javascipt值;
第一个参数是json字符串。
第二个参数是一个解析函数,会把返回值覆盖原属性值,如果返回为undefined,则此属性从对象中删除。
函数中的两个参数分别为属性名和属性值。
var str = '{"oo" : 1, "pp" : "2"}';
var obj = JSON.parse(str);
// Object {oo: 1, pp: "2"}
var obj2 = JSON.parse(str, function(p, v){
if( p === 'oo') {
v = undefined;
}
return v;
});
// Object {pp: "2"}
var obj3 = JSON.parse(str, function(p, v){
return v + 5;
});
// [object object]5
第三个例子明显不是我们想要的结果。因为在遍历到最顶层的时候,传入到函数中的参数是空字符串。
重新改写第三个例子。
var obj3 = JSON.parse(str, function(p, v){
if (p === '') {
return v;
}
return v + 5;
});
// Object {oo: 6, pp: "25"}
JSON.stringify()
语法
JSON.stringify(value, function()/array, space);
将js值序列化成json字符串。
第一个参数可以是任何类型,但是非数组中的undefined会被忽略,数组中的undefined转化为null。
第二参数可以是函数或者数组,如果是函数,用法类型JSON.parse()。如果是数组,那么最终结果是数组中存在的值。
第三个参数是控制结果字符串的间距,如果是数字,则缩进对应数量空格。如果是字符串,则每个级别插入该字符串。(最多十位)
var obj = {oo : 1, pp : 2};
var str = JSON.stringify(obj);
// '{"oo":1,"pp":2}'
var str2 = JSON.stringify(obj, ['oo']);
// '{"pp":2}'
var str3 = JSON.stringify(obj, null, 'bili');
/* '{
bili"oo": 1,
bili"pp": 2
}'
*/
var str4 = JSON.stringify(obj, null, 4);
/* '{
"oo": 1,
"pp": 2
}'
*/