概述
字符串
-
字符串的内部格式始终是 UTF-16,它不依赖于页面编码
-
字符串是不可变的,只能通过拼接重新赋值
-
字符串的原型上暴露了一个
[Symbol.iterator]()
方法 -
es6之前只支持两字节的字符,不支持四字节的字符
-
es6提供了大括号可以解决
'u{1F680}' === 'uD83DuDE80' // true
-
-
charAt()
:返回给定索引位置的字符,功能同[]
-
charCodeAt()
:返回指定索引的字符编码- 四个字节由
codePointAt()
替换
- 四个字节由
-
fromCharCode()
:根据参数编码返回字符- 四字节由
fromCodePoint()
替换
- 四字节由
转义字符
转义 | |
---|---|
n | 换行 |
t | 制表 |
b | 退格 |
r | 回车 |
f | 换页 |
\ | 反斜杠 |
’ | 单引号 |
‘’ | 双引号 |
` | 反引号 |
xnn | 十六进制 nn 表示的字符 |
unnnn | 十六进制 nnnn 表示的 Unicode 字符 |
转换为字符串
- toString():几乎所有值都有的 toString() 方法( null 和 undefined 值没有)
- 返回对应的字符串,对于number,可以传参
- String() :将任何值都能转为字符串
- 如果值有 toString() 方法,则调用该方法(不传参数)并返回结果。
- 如果值是 null ,返回 “null” 。
- 如果值是 undefined ,返回 “undefined” 。
- 用加号操作符给值加上
""
模板字符串
-
与使用单引号或双引号不同,模板字符串保留换行字符,可以跨行定义字符串
-
插值:模板字符串可以在
${}
中使用表达式- 内部在将表达式转换为字符串时会调用 toString()
-
标签函数:和普通的函数有一些区别
- 参数不使用
()
传递,每个${}
都是一个参数 - 标签函数的第一个参数值为
${}
周围的其他字符,没有就是空字符
let a=1,b=2; function sum(string,a,b){ console.log(string); return a+b; } console.log(sum`${a}${b}`); //[ '', '', '' ] 两个变量,周围有三个位置 //3
- 参数不使用
-
原始字符串:使用标签函数
String.raw
,原样输出- 如果使用其他标签函数,第一个参数也可以使用raw属性原样输出
String.raw`${a}${b}`;
function fn(strings){ console.log(strings.raw); } fn`u00A9` //[ '\u00A9' ]
方法
方法 | 作用 | 返回 |
---|---|---|
concat() | 一次性拼接多个字符串 | 新字符串 |
indexOf(target,start) | 从字符串开头获取下标 | 下标|-1 |
lastIndexOf() | 从字符串结尾获取下标 | 下标|-1 |
startsWith(target,start) | 是否以参数字符串开头 | 布尔值 |
endsWith(target,end) | 是否以参数字符串结尾 | 布尔值 |
includes(target,start) | 是否包含参数字符串 | 布尔值 |
slice(start,end) | 截取字符串 | 新字符串 |
substring(start,end) | 截取字符串 | 新字符串 |
toUpperCase() |toLowerCase() | 改变大小写 | 新字符串 |
trim() | 去除字符串两端的空格 | 新字符串 |
trimLeft() 和 trimRight() | 去除前/后空格 | 新字符串 |
repeat(times) | 重复字符串 | 新字符串 |
padStart(最大长度,用于补齐的字符串) | 前面补齐字符串 | 新字符串 |
padEnd(最大长度,用于补齐的字符串) | 后面不起字符串 | 新字符串 |
match(正则|字符串) | 字符串|正则匹配 | 匹配结果|-1 |
search(正则|字符串) | 返回首次匹配的下标 | 下标|-1 |
replace(正则|字符串,替换内容|callback) | 替换目标字符串 | 新字符串 |
split(正则|字符串,数组个数) | 字符串分割成数组 | 数组 |
slice和substring
相同
- 范围:[start,end)
- 都返回新字符串(浅拷贝)
- 只有一个参数时,范围默认到末尾处
- 无参时,提取整个内容
不同
- slice:允许负索引(切片)
- substring:负数表示0
replace(正则|字符串,替换内容|callback)
-
正则表达式如果加
g
修饰符,就替换所有匹配成功的值。 -
参数二:替换字符串可以插入下面的特殊变量名:
变量名 代表的值 $` 当前匹配的字符串左侧的内容 $& 当前匹配的字符串 $’ 当前匹配的字符串右侧的内容 $n 第n个分组 $$ $
字符'hello world'.replace(/(w+)s(w+)/, '$2 $1') // "world hello" 'abc'.replace('b', "[$`-$&-$']") // "a[a-b-c]c"
-
参数二:如果为函数,其return后的公式作为替换字符串
变量名 代表的值 match
匹配的子串。(对应于上述的$&。) ...
有几个分组,就有几个参数 index
匹配字串的起始下标 string
被匹配的原字符串。 '3 and 5'.replace(/[0-9]+/g, function (match) { return 2 * match; }) // "6 and 10"
编码
Base64
有时,文本里面包含一些不可打印的符号,比如 ASCII 码0到31的符号都无法打印出来,这时可以使用 Base64 编码,将它们转成可以打印的字符
所谓 Base64 就是一种编码方法,可以将任意值转成 0~9、A~Z、a-z、+
和/
这64个字符组成的可打印字符。目的是为了不出现特殊字符,简化程序
btoa()
:任意值转为 Base64 编码,可打印atob()
:Base64 编码转为原来的值
var string = 'Hello World!';
btoa(string) // "SGVsbG8gV29ybGQh"
atob('SGVsbG8gV29ybGQh') // "Hello World!"
注意,这两个方法不适合非 ASCII 码的字符,会报错。
btoa('你好') // 报错
要将非 ASCII 码字符转为 Base64 编码,必须中间插入一个转码环节,再使用这两个方法。
function b64Encode(str) {
return btoa(encodeURIComponent(str));
}
function b64Decode(str) {
return decodeURIComponent(atob(str));
}
b64Encode('你好') // "JUU0JUJEJUEwJUU1JUE1JUJE"
b64Decode('JUU0JUJEJUEwJUU1JUE1JUJE') // "你好"
encodeURI()和encodeURIComponent()
都不会对 ASCII字母
数字
~!*()'
进行编码
-
encodeURI()更懒散一点,还不会对
@#$&=:/,;?+
进行编码 -
encodeURIComponent()更严格,对大部分特殊符号都进行编码(推荐)
encodeURIComponent('https://wangdoc.com/javascript/bom/cookie?名字=毕东宇&name=qweq')
//"https%3A%2F%2Fwangdoc.com%2Fjavascript%2Fbom%2Fcookie%3F%E5%90%8D%E5%AD%97%3D%E6%AF%95%E4%B8%9C%E5%AE%87%26name%3Dqweq"
//全编译了
encodeURI('https://wangdoc.com/javascript/bom/cookie?名字=毕东宇&name=qweq')
//"https://wangdoc.com/javascript/bom/cookie?%E5%90%8D%E5%AD%97=%E6%AF%95%E4%B8%9C%E5%AE%87&name=qweq"
//有些符号没进行编译
eval()
- 当解释器发现 eval() 调用时,会将参数解释为实际的 ECMAScript 语句,然后将其插入到该位置
- 通过 eval() 定义的任何变量和函数都不会被提升
- 这是因为在解析代码的时候,它们是被包含在一个字符串中的。它们只是在 eval() 执行的时候才会被创建。
- 在严格模式下,在 eval() 内部创建的变量和函数无法被外部访问
- 会存在xss隐患
最后
以上就是拼搏发带为你收集整理的【JS】String字符串转义字符转换为字符串模板字符串方法编码eval()的全部内容,希望文章能够帮你解决【JS】String字符串转义字符转换为字符串模板字符串方法编码eval()所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复