String作为JS里面最常用的数据类型,我好像没有好好地总结过,所以偶尔有些不常用的,细节的知识点还是不是100%的自信,希望写篇文章来巩固一下。文章主要分为一下几部分:
1:创建一个字符串的3种方法以及区别
2:字符串的常用属性
3:字符串的常用方法
4:一些易犯的错误
接下来就从前到后来梳理一下:
1:创建一个字符串的3种方法以及区别
创建一个字符串的常用方法有:
1: let a = 'x'; //字符串字面量的方式
2: let b = String('x'); //利用全局的String对象生成
3: let c = new String('x'); //创建一个String对象
以上的三种方法中,第三种是创建了一个对象,第一种和第二种都是创建一个string类型的数据,如果对a,b,c分别调用typeof结果为:
typeof a; //'string'
typeof b; //'string'
typeof b; //'object'
我们暂且把以上的第一种和第二种叫‘原始字符串’,把第三种叫做‘字符串对象’。原始字符串和字符串对象在遇到eval()方法的时候,也表现得不一样:
eval(new String('2 + 2')); // returns a String object containing "2 + 2"
eval('2 + 2'); // returns 4
当然我们可以对字符串对象调用valueOf方法,得到其对应的原始字符串:
eval(new String('2 + 2').valueOf()); // returns 4
2:字符串的常用属性
1: length
通俗地说,length属性返回一个字符串的字符个数,JavaScript采用UTF-16编码,实际上length属性就是返回一个字符串有多少个UTF-16编码。
‘abcd’.length; //4
3: 字符串的常用方法
1: 获取字符串特定位置的字符
1:string.charAt(index); //返回某位的字符
2:string.charCodeAt(index); //返回某位上的字符的utf-16编码
3:string.codePointAt(pos); //返回某位上的Unicode point值
example:
1: 'ABC'.charAt(0); // 65
2: 'ABC'.charCodeAt(0); //65
3: 'ABC'.codePointAt(0); //65
4: '\uD800\uDC00'.codePointAt(0); // 65536
2: 字符串拼接
1:string.concat(string1[, string2, ..., stringN]);
1: 返回一个新字符串,此方法对原字符串没有影响
2: 非string类型的参数会先转为string类型再拼接
example:
1: 'abc'.concat('xx'); //'abcxx'
2: ''.concat(...['a', 'b', 'c']); //'abc'
3: ''.concat([]): //''
4: ''.concat(true); // 'true'
5: ''.concat(4, 5); //'45'
2:string.padEnd(targetLength, padString)
用padString拼在string的后面达到targetLength的长度,如果有必要的话会重复padString
参数:
targetLength: 目标长度。如果小于string的长度,那返回string
padString: 拼接的字符串
example:
1: 'abc'.padEnd(1); // 'abc'
2: 'abc'.padEnd(7, 'foo'); 'abcfoof'
3: string.padStart(targetLength, padString)
用padString拼在string前面以达到targetLength的长度,如果必要的话,重复padString
参数:
targetLength: 目标长度。如果小于string的长度,那么返回string
padString: 用来拼接的字符串。如果省略,则用空字符串。
example:
1: 'abc'.padStart(7, 'foo'); //'foofabc'
2: 'abc'.padStart(1);// 'abc'
3: 'abc'.padStart(7); ' abc'
4: string.repeat(count)
对string重复count次数之后返回一个新字符串
参数:
count: 重复的次数
count必须是0到正无穷之间的有限的次数,负数或者无穷大的数会抛出exception;如果count是0,则返回空字符串
example:
1: 'abc'.repeat(2); // 'abcabc'
2: 'abc'.repeat(0); //''
3: 'abc'.repeat(-1);// Uncaught RangeError: Invalid count value
4: 'abc'.repeat(1/0);//Uncaught RangeError: Invalid count value
3: 逻辑判断的方法
1:string.endsWith(subString, length); //是否以xx结束?
参数:
subString: 子字符串
length: 原字符串某个位置作为尾部(字符串第一位是1,不是0)。length可以省略。
example:
1: 'abcd'.endsWith('d'); //true
2: 'abcd'.endsWith('b'); //fasle
3: 'abcd'.endsWith('b', 2); //true
2: string.includes(subString, index); //是否包含xx?
参数:
subString: 是否包含的子字符串
index: 从元字符串的那个位置开始(第一位是0, 不是1)
example:
1: 'abcd'.includes('a'); // true
2: 'abcd'.includes('a', 1); // false
3: 'abcd'.includes('a', 0);// true
4: 返回数字的方法
1:string.indexOf(subString, fromIndex);
返回第一次遇到substring的位置,如果找不到,返回-1
参数:
subString:要查找的子字符串
fromIndex:从原字符串哪个位置开始找,默认从0开始
example:
1: 'abcdefg'.indexOf('d'); // 3
2: 'abcdefg'.indexOf('d', 3); // 3
3: 'abcdefg'.indexOf('d', 4); // -1
2: string.lastIndexOf(subString, fromIndex)
返回最后一次遇到subString的坐标,找不到的话返回-1
参数:
subString:要查找的子字符串
fromIndex:从哪个坐标开始往后(backwards)找,默认为最后一位的坐标(string.length -1).
example:
1: '012345'.lastIndexOf('3', 2); // -1
2: '012345'.lastIndexOf('3', 3); // 3
3: '012345'.lastIndexOf('3', 5); // 3
5:比较
1:string.localeCompare(string2[,locales[, options]])
string与string2比较,如果string在string2前面则返回负数,后面则返回正数,相等返回0。
locale是场所,区域的意思,所以localeCompare是在特定场合(不同的语言等)下的比较。这些特定的场合可以由参数locales和options设置。
关于localeCompare请参考MDN
6:匹配
1:string.match(regexp);
参数:
regexp: 正则表达式。
如果没有此参数的话,match()会返回一个空Array([])。
如果给了此参数,string有匹配的话,会返回一个Array, 第一个元素是匹配到的完整字符串,接下来的项是匹配大括号里面的内容得到到的结果。
example:
var str = 'For more information, see Chapter 3.4.5.1';
var re = /see (chapter \d+(\.\d)*)/i;
var found = str.match(re);
found的值为:["see Chapter 3.4.5.1", "Chapter 3.4.5.1", ".1", index: 22, input: "For more information, see Chapter 3.4.5.1", groups: undefined]
7: 统一化
1:string.normalize([form])
这个方法把给定的string,统一为特定的某种Unicode格式。
背景:Unicode允许你对同一个字符采用不用的字节来编码,如果遇到某些需要根据字节来比较的情况,那对于不同编码方式的字符,那这时候就会出问题。所以,对于这种情况,可以先把字符都转为统一的编码方式再比较。
参数:form
form可选的值有: 'NFC', 'NFD', 'NFKC', 'NFKD', 分别的意思是:
NFC: Normalization Form Canonical Composition
NFD: Normalization Form Canonical Decomposition
NFKC: Normalization Form Compatibility Composition
NFKD: Normalization Form Compatibility Decomposition
其中:
Composition(NFC和NFKC)用尽可能少的字节来代表字符
Decomposition(NFD和NFKD)用字符拆开,用每一部分来代码字符。例如á被分解为a和´
Canonical (NFC和NFD)把连字作为单个字符,比如œ
Compatibility (NFKC和NFKD)把连字拆分开,比如œ被拆分为o+e
example:
var str = '\u1E9B\u0323';
str.normalize('NFD'); // '\u017F\u0323\u0307'
str.normalize('NFKC'); // '\u1E69'
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。