js 中的字符串类似只读的数组,
因为只读,使用数组原型上的push,pop,sort,reverse,splice 等会修改字符串会导致错误

生成字符串

构造函数

  1. var s = new String(s)
  2. var s = String(s)

字面量

  1. var s= 'adf'

转义字符串

Code Output
\0 空字符
\' 单引号
\" 双引号
\\ 反斜杠
\n 换行
\r 回车
\v 垂直制表符
\t 水平制表符
\b 退格
\f 换页
\uXXXX unicode 码
\u{X}\u{XXXXXX} unicode codepoint
\xXX Latin-1 字符(x小写)
  1. console.log('\'hello\'\0\'world\'')

使用\拼接

可以在每行末尾使用反斜杠字符(“\”),以指示字符串将在下一行继续。确保反斜杠后面没有空格或c任何除换行符之外的字符或缩进; 否则反斜杠将不会工作。

  1. let longString = "This is a very long string which needs \
  2. to wrap across multiple lines because \
  3. otherwise my code is unreadable.";

获取字符串长度

length

中文和英文的长度都是1,所以这个长度不是字符数

  1. var text = 'Hello World!';
  2. text.length // 12
  3. var text = '你好!'
  4. text.length // 3

获取单个字符串

通过下标取

  1. var string = 'hello world';
  2. string[0] // output h

charAt

  1. charCodeAt://返回Unicode编码
  2. var str= '你好Hello world!'
  3. str.charAt(3) //H
  4. str.charAt(0) //你
  5. str.charAt(100) //“”
  6. str.charAt(-1) //“"

判断字符串是否包含其他字符串

  1. var s = 'hello';
  2. s.includes('he') // output true
  3. s.includes('ho') // output false

查找字符串

indexOf lastIndexof

lastIndexof 从最后往前找
大小写敏感

  1. var str ='Hello worlod';
  2. str.indexOf('H') // 0
  3. str.indexOf('lo') // 3 第一次出现的位置
  4. str.indexOf('Hee') // -1
  5. str.indexOf(' ') //5

拼接字符串

concat

  1. var str1 = hello ’;
  2. var str2 = world’;
  3. str1.concat(str2); // hello world
  4. //用+更加方便
  5. str1 + str2

字符串切片

substring

  1. str.substring(indexStart[, indexEnd])

方法用于提取字符串中介于两个指定下标之间的字符。
如果start>end 两个参数会互换,如果相等返回空字符串

slice

大小写转换

toLowerCase toUpperCase;

字符串分割成数组

split

  1. stringObject.split(separator,howmany可选)
  2. var str="How are you doing today?"
  3. str.split(“ “) //["How", "are", "you", "doing", "today?”]
  4. str.split(“”) //["H", "o", "w", " ", "a", "r", "e", " ", "y", "o", "u", " ", "d", "o", "i", "n", "g", " ", "t", "o", "d", "a", "y", "?”]
  5. str.split(“,”) //["How are you doing today?"]
  1. var s = 'test'
  2. Array.prototype.join.call(s) // => t,e,s,t
  3. Array.prototype.join.call(s', "") // => test

补白

padStart&padEnd

  1. for (let i = 1; i < 200; i+=50) {
  2. console.log(i.toString().padStart(4, '*#'))
  3. }
  4. /*
  5. *#*1
  6. *#51
  7. *101
  8. */

模板字符串

一般情况

  1. var name = 'moe'
  2. var txt=`hello ${name}`
  3. var firstName = 'jack'
  4. var lastName = 'ma'
  5. // 老的拼接
  6. var name = My name is + firstName + ' + lastName
  7. // 模板拼接
  8. var name = `My name is ${firstName} ${lastName}`

多行字符串

  1. console.log("string text line 1\n\
  2. string text line 2”);
  3. console.log("string text line 1\nstring text line 2");
  4. // 在模板字符串中,空格、缩进、换行都会被保留
  5. console.log(`string text line 1
  6. string text line 2`);
  7. // 输出都一样
  8. // "string text line 1
  9. // string text line 2"

嵌入表达式

  1. var a = 5;
  2. var b = 10;
  3. console.log("Fifteen is " + (a + b) + " and\nnot " + (2 * a + b) + ".");
  4. // "Fifteen is 15 and
  5. // not 20.”
  6. var a = 5;
  7. var b = 10;
  8. console.log(`Fifteen is ${a + b} and
  9. not ${2 * a + b}.`);
  10. // "Fifteen is 15 and
  11. // not 20."

嵌入三元表达式

  1. var b = true
  2. var s = `是 ${b ? '真': '假'}`

数组

  1. arr = [1,2,3]
  2. message = `${arr}`
  3. "1,2,3"

支持嵌套

  1. let arr = [{value: 1}, {value: 2}];
  2. let message = `
  3. <ul>
  4. ${arr.map((item) => {
  5. return `
  6. <li>${item.value}</li>
  7. `
  8. }).join('')}
  9. </ul>
  10. `;

String.raw:

是用来获取一个模板字符串的原始字符串的,比如说,占位符(例如 ${foo})会被处理为它所代表的其他字符串,而转义字符(例如 \n)不会。

  1. var text = String.raw`"\n" is taken literally. It'll be escaped instead of interpreted.`
  2. console.log(text)
  3. // "\n" is taken literally.
  4. // It'll be escaped instead of interpreted.

标签模板

模拟内部的默认实现

  1. // 调用
  2. tag`Hello, ${ name }. I am ${ emotion } to meet you!`
  3. // 转化为
  4. tag(
  5. ['Hello, ', '. I am ', ' to meet you!'],
  6. 'Maurice',
  7. 'thrilled'
  8. )
  9. function tag(parts, ...values) {
  10. // value[-1] + parts[0] + value[0] + parts[1] + value[1]
  11. return parts.reduce(
  12. (all, part, index) => all + values[index - 1] + part )
  13. }
  1. let x = 'Hi', y = 'Kevin';
  2. var res = message`${x}, I am ${y}`;
  3. console.log(res);
  4. // literals 文字
  5. // 注意在这个例子中 literals 的第一个元素和最后一个元素都是空字符串
  6. function message(literals, value1, value2) {
  7. console.log(literals); // [ "", ", I am ", "" ]
  8. console.log(value1); // Hi
  9. console.log(value2); // Kevin
  10. }
  11. function message(literals, ...values) {
  12. let result = '';
  13. for (let i = 0; i < values.length; i++) {
  14. result += literals[i];
  15. result += values[i];
  16. }
  17. result += literals[literals.length - 1];
  18. return result;
  19. }
  20. function message(literals, ...values) {
  21. let result = literals.reduce((prev, next, i) => {
  22. let value = values[i - 1];
  23. return prev + value + next;
  24. });
  25. return result;
  26. }
  1. let name = 'zbj'
  2. function strFunc (strings,name) {
  3. console.log(strings,name)
  4. let showName
  5. if (name === 'zbj') {
  6. showName = '帅哥'
  7. } else {
  8. showName = '垃圾'
  9. }
  10. return `${strings[0]} ${showName} ${strings[1]}`
  11. }
  12. let showTxt = strFunc`hello${name}?`

防止 XSS 攻击

可以用它来自动确保模板中插入表达式的安全性。
我们可以虚构一个 sanitize 库来移除 HTML 标签和类似的危 害,从而阻止用户在网站中注入恶意的 HTML,防止跨域脚本(XSS, cross-site scripting)攻击。

  1. function sanitized(parts, ...values) {
  2. return parts.reduce((all, part, index) =>
  3. all + sanitize(values[index - 1]) + part )
  4. }
  5. var comment = 'Evil comment<iframe src="http://evil.corp"></iframe>'
  6. var html = sanitized`<div>${ comment }</div>` console.log(html)
  7. // <- '<div>Evil comment</div>'

题目

  1. var str0 = 'yiifaa',
  2. str1 = new String(str0),
  3. str2 = String(str0)
  4. //请确认以下的判断是否准确
  5. str1 === str0
  6. //
  7. str2 === str0
  8. //
  9. typeof str1 === typeof str2

答案

  1. // 类型为string,为基本类型
  2. typeof str0
  3. // 类型为object,为引用类型
  4. typeof str1
  5. // 类型为string,为基本类型
  6. typeof str2
  1. // false, 因为str1为引用类型
  2. str1 === yiifaa
  3. // true, 因为都是基本类型,并且值相等
  4. str2 === yiifaa
  5. // false, 虽然都是字符串,但分别为object与string
  6. typeof str1 === typeof str2

总结:
很神奇的String对象,一方面可以作为基本类型,另一方面还可以作为引用类型,更神奇的是,为String.prototype添加方法,基本类型还可以引用到,怎么做到的?自动转为包装对象