JavaScript中的字符串也像Python那样支持反斜杠的转移,并且字符集方面默认为Unicode,下面就来详细解析JavaScript中的字符串类型与字符编码支持

定义 字符串就是零个或多个排在一起的字符,放在单引号或双引号之中。

`'abc'`
`"abc"`
复制代码

单引号字符串的内部,可以使用双引号。双引号字符串的内部,可以使用单引号。

'key = "value"'
"It's a long journey"

上面两个都是合法的字符串。

如果要在单引号字符串的内部,使用单引号(或者在双引号字符串的内部,使用双引号),就必须在内部的单引号(或者双引号)前面加上反斜杠,用来转义。

`'Did she say \'Hello\'?'`
`// "Did she say 'Hello'?"`
`"Did she say \"Hello\"?"`
`// "Did she say "Hello"?"`
复制代码

由于HTML语言的属性值使用双引号,所以很多项目约定JavaScript语言的字符串只使用单引号,本教程就遵守这个约定。当然,只使用双引号也完全可以。重要的是,坚持使用一种风格,不要两种风格混合。

字符串默认只能写在一行内,分成多行将会报错。

`'a`
`b`
`c'`
`// SyntaxError: Unexpected token ILLEGAL`
复制代码

上面代码将一个字符串分成三行,JavaScript就会报错。
如果长字符串必须分成多行,可以在每一行的尾部使用反斜杠。

`var` `longString =` `"Long \`
`long \`
`long \`
`string"``;`
`logString`
`// "Long long long string"`
复制代码

上面代码表示,加了反斜杠以后,原来写在一行的字符串,可以分成多行书写。但是,输出的时候还是单行,效果与写在同一行完全一样。注意,反斜杠的后面必须是换行符,而不能有其他字符(比如空格),否则会报错。

连接运算符(+)可以连接多个单行字符串,将长字符串拆成多行书写,输出的时候也是单行。

`var` `longString =` `'Long '`
`+` `'long '`
`+` `'long '`
`+` `'string'``;`
复制代码

如果想输出多行字符串,有一种利用多行注释的变通方法。

`(``function` `() {` `/*`
`line 1`
`line 2`
`line 3`
`*/``}).toString().split(``'\n'``).slice(1, -1).join(``'\n'``)`
`// "line 1`
`// line 2`
`// line 3"`
复制代码

上面的例子中,输出的字符串就是多行。

转义 反斜杠(\)在字符串内有特殊含义,用来表示一些特殊字符,所以又称为转义符。

需要用反斜杠转义的特殊字符,主要有下面这些:

*   \0 null(\u0000)
*   \b 后退键(\u0008)
*   \f 换页符(\u000C)
*   \n 换行符(\u000A)
*   \r 回车键(\u000D)
*   \t 制表符(\u0009)
*   \v 垂直制表符(\u000B)
*   \' 单引号(\u0027)
*   \" 双引号(\u0022)
*   \ 反斜杠(\u005C)
复制代码

上面这些字符前面加上反斜杠,都表示特殊含义。

`console.log(``'1\n2'``)`
`// 1`
`// 2`
复制代码

上面代码中,\n表示换行,输出的时候就分成了两行。
反斜杠还有三种特殊用法。

  • (1)\HHH
    反斜杠后面紧跟三个八进制数(000到377),代表一个字符。HHH对应该字符的Unicode码点,比如\251表示版权符号。显然,这种方法只能输出256种字符。

  • (2)\xHH
    \x后面紧跟两个十六进制数(00到FF),代表一个字符。HH对应该字符的Unicode码点,比如\xA9表示版权符号。这种方法也只能输出256种字符。

  • (3)\uXXXX
    \u后面紧跟四个十六进制数(0000到FFFF),代表一个字符。HHHH对应该字符的Unicode码点,比如\u00A9表示版权符号。

下面是这三种字符特殊写法的例子。

`'\251'` `// "©"`
`'\xA9'` `// "©"`
`'\u00A9'` `// "©"`
`'172'` `===` `'z'` `// true`
`'\x7A'` `===` `'z'` `// true`
`'\u007A'` `===` `'z'` `// true`}//欢迎加入全栈开发交流圈一起学习交流:582735936]//面向1-3年前端人员}   //帮助突破技术瓶颈,提升思维能力复制代码

如果在非特殊字符前面使用反斜杠,则反斜杠会被省略。

`'\a'`
`// "a"`
复制代码

上面代码中,a是一个正常字符,前面加反斜杠没有特殊含义,反斜杠会被自动省略。
如果字符串的正常内容之中,需要包含反斜杠,则反斜杠前面需要再加一个反斜杠,用来对自身转义。

`"Prev \\ Next"`
`// "Prev \ Next"`
复制代码

字符串与数组 字符串可以被视为字符数组,因此可以使用数组的方括号运算符,用来返回某个位置的字符(位置编号从0开始)。

`var` `s =` `'hello'``;`
`s[0]` `// "h"`
`s[1]` `// "e"`
`s[4]` `// "o"`
复制代码

// 直接对字符串使用方括号运算符
'hello'``[1] // "e"

如果方括号中的数字超过字符串的长度,或者方括号中根本不是数字,则返回undefined。

`'abc'``[3]` `// undefined`
`'abc'``[-1]` `// undefined`
`'abc'``[``'x'``]` `// undefined`
复制代码

但是,字符串与数组的相似性仅此而已。实际上,无法改变字符串之中的单个字符。

`var` `s =` `'hello'``;`
`delete` `s[0];`
`s` `// "hello"`
`s[1] =` `'a'``;`
`s` `// "hello"`
`s[5] =` `'!'``;`
`s  `// "hello"`
复制代码

上面代码表示,字符串内部的单个字符无法改变和增删,这些操作会默默地失败。

字符串之所以类似于字符数组,实际是由于对字符串进行方括号运算时,字符串会自动转换为一个字符串对象。

length属性 length属性返回字符串的长度,该属性也是无法改变的。

`var` `s =` `'hello'``;`
`s.length` `// 5`
`s.length = 3;`
`s.length` `// 5`
`s.length = 7;`
`s.length` `// 5`
复制代码

上面代码表示字符串的length属性无法改变,但是不会报错。

字符集 JavaScript使用Unicode字符集,也就是说在JavaScript内部,所有字符都用Unicode表示。

不仅JavaScript内部使用Unicode储存字符,而且还可以直接在程序中使用Unicode,所有字符都可以写成”\uxxxx”的形式,其中xxxx代表该字符的Unicode编码。比如,\u00A9代表版权符号。

`var` `s =` `'\u00A9'``;`
`s` `// "©"`
复制代码

每个字符在JavaScript内部都是以16位(即2个字节)的UTF-16格式储存。也就是说,JavaScript的单位字符长度固定为16位长度,即2个字节。

但是,UTF-16有两种长度:对于U+0000到U+FFFF之间的字符,长度为16位(即2个字节);对于U+10000到U+10FFFF之间的字符,长度为32位(即4个字节),而且前两个字节在0xD800到0xDBFF之间,后两个字节在0xDC00到0xDFFF之间。举例来说,U+1D306对应的字符为?,它写成UTF-16就是0xD834 0xDF06。浏览器会正确将这四个字节识别为一个字符,但是JavaScript内部的字符长度总是固定为16位,会把这四个字节视为两个字符。

`var` `s =` `'\uD834\uDF06'``;`
`s` `// "?"`
`s.length` `// 2`
`/^.$/.test(s)` `// false`
`s.charAt(0)` `// ""`
`s.charAt(1)` `// ""`
`s.charCodeAt(0)` `// 55348`
`s.charCodeAt(1)` `// 57094`
复制代码

上面代码说明,对于于U+10000到U+10FFFF之间的字符,JavaScript总是视为两个字符(字符的length属性为2),用来匹配单个字符的正则表达式会失败(JavaScript认为这里不止一个字符),charAt方法无法返回单个字符,charCodeAt方法返回每个字节对应的十进制值。

所以处理的时候,必须把这一点考虑在内。对于4个字节的Unicode字符,假定C是字符的Unicode编号,H是前两个字节,L是后两个字节,则它们之间的换算关系如下。

`// 将大于U+FFFF的字符,从Unicode转为UTF-16`
`H = Math.floor((C - 0x10000) / 0x400) + 0xD800`
`L = (C - 0x10000) % 0x400 + 0xDC00`
`// 将大于U+FFFF的字符,从UTF-16转为Unicode`
`C = (H - 0xD800) * 0x400 + L - 0xDC00 + 0x10000`
复制代码

下面的正则表达式可以识别所有UTF-16字符。

`([\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF])`
复制代码

由于JavaScript引擎(严格说是ES5规格)不能自动识别辅助平面(编号大于0xFFFF)的Unicode字符,导致所有字符串处理函数遇到这类字符,都会产生错误的结果。如果要完成字符串相关操作,就必须判断字符是否落在0xD800到0xDFFF这个区间。

下面是能够正确处理字符串遍历的函数。

`function` `getSymbols(string) {`
`var` `length = string.length;`
`var` `index = -1;`
`var` `output = [];`
`var` `character;`
`var` `charCode;`
`while` `(++index < length) {`
`character = string.charAt(index);`
`charCode = character.charCodeAt(0);`
`if` `(charCode >= 0xD800 && charCode <= 0xDBFF) {`
`output.push(character + string.charAt(++index));`
`}` `else` `{`
`output.push(character);`
`}`
`}`
`return` `output;`
`}`
`var` `symbols = getSymbols(``'?'``);`
`symbols.forEach(``function``(symbol) {`
`//
`});`}//欢迎加入全栈开发交流圈一起学习交流:582735936]//面向1-3年前端人员}   //帮助突破技术瓶颈,提升思维能力复制代码

替换(String.prototype.replace)、截取子字符串(String.prototype.substring, String.prototype.slice)等其他字符串操作,都必须做类似的处理。

Base64转码 Base64是一种编码方法,可以将任意字符转成可打印字符。使用这种编码方法,主要不是为了加密,而是为了不出现特殊字符,简化程序的处理。

JavaScript原生提供两个Base64相关方法。

*   btoa():字符串或二进制值转为Base64编码
*   atob():Base64编码转为原来的编码
`var` `string =` `'Hello World!'``;`
`btoa(string)` `// "SGVsbG8gV29ybGQh"`
`atob(``'SGVsbG8gV29ybGQh'``)` `// "Hello World!"`
复制代码

这两个方法不适合非ASCII码的字符,会报错。

`btoa(``'你好'``)`
`// Uncaught DOMException: The string to be encoded contains characters outside of the Latin1 range.`
复制代码

要将非ASCII码字符转为Base64编码,必须中间插入一个转码环节,再使用这两个方法。

`function` `b64Encode(str) {`
`return` `btoa(encodeURIComponent(str));`
`}`
`function` `b64Decode(str) {`
`return` `decodeURIComponent(atob(str));`
`}`
`b64Encode(``'你好'``)` `// "JUU0JUJEJUEwJUU1JUE1JUJE"`
`b64Decode(``'JUU0JUJEJUEwJUU1JUE1JUJE'``)` `// "你好"`复制代码

解析JavaScript中的字符串类型与字符编码支持相关推荐

  1. 全面解析JavaScript中对于字符串子串的查询方法

    一.基本应用场景 Q1:给定字符串a="xxx",给定字符串b="xxxxxx",判定a是否为b的子串.(基础手写实现方法) function checkHas ...

  2. 解析java中的字面量和字符类型

    解析java中的字面量和字符类型 1.字面量含义 固定不变的量,我们人为所给的一些数据.例如77和88都是整型字面量,1.88和1.99F是浮点型字面量,'中'是字符型字面量,"dfguyf ...

  3. python 测试字符串类型_【教程】如何用Python中的chardet去检测字符编码类型

    [背景] 之前已经使用过chardet了,也算用了不少次了. 之前也写过和chardet相关的: 但是没写教程,举例说明如何使用. 现在去举例解释解释. [python示例代码演示如何用chardet ...

  4. 如何在 JavaScript 中的字符串的字符之间添加空格

    在今天的文章中,我们将学习如何轻松地在 JavaScript 中的字符串字符之间包含空格. 1.String split() 和 Split join() 方法 要在字符串的字符之间添加空格,请对字符 ...

  5. php查找以xx结尾的的字符串单词,Javascript中查找不以XX字符结尾的单词示例代码_javascript技巧...

    首先,让我声明一下,我在写这篇文章之前花了2个多小时在弄正则表达式.悲~悲~悲~ 按照一般的思路,先来看看其他几个插找方式: 我以字符串 var str = "eattd gebcat ge ...

  6. javascript递归遍历文件夹下面的所有文件并返回所有文件全路径名称数组以及解析JavaScript方法体字符串的结束位置

    一.前端脚本经常需要用到遍历指定文件夹下面的所有文件(包含子文件夹)的内容并做特定的逻辑处理,下面给出同步遍历的方式,开箱即用. const fs = require('fs');main()func ...

  7. 为什么要在JavaScript中使用静态类型? (使用Flow进行静态打字的4部分入门)

    by Preethi Kasireddy 通过Preethi Kasireddy 为什么要在JavaScript中使用静态类型? (使用Flow进行静态打字的4部分入门) (Why use stati ...

  8. javascript优缺点_为什么要在JavaScript中使用静态类型? 优缺点

    javascript优缺点 by Preethi Kasireddy 通过Preethi Kasireddy 为什么要在JavaScript中使用静态类型? 优缺点 (Why use static t ...

  9. 创建健壮的isArray()函数(JavaScript中判断对象类型的种种方法)

    我们知道,JavaScript中检测对象类型的运算符有:typeof.instanceof,还有对象的constructor属性: 1) typeof 运算符 typeof 是一元运算符,返回结果是一 ...

最新文章

  1. chrome java插件_selenium启动Chrome配置参数问题
  2. input 默认样式的修改
  3. hadoop分布式搭建
  4. #161: 给定n*n由0和1组成的矩阵,如果矩阵的每一行和每一列的1的数量都是偶数,则认为符合条件。 你的任务就是检测矩阵是否符合条件...
  5. 2019~2020年IDC行业发展趋势预测
  6. python selenium post_python爬虫 selenium标记信息修改
  7. 不同的二叉搜索树 IIPython解法
  8. 用回车键实现MFC对话框中TAB键控件输入焦点在控件中跳转的效果(转)
  9. Qt中修改应用程序和标题栏的图标
  10. 人脸识别代码_10行代码实现人脸识别
  11. mysql5.5java安装_配置非安装版的mysql 5.5
  12. 如何产生cpk图形_真正把Cp、Cpk、Pp、Ppk讲清楚!
  13. linux 项目文件管理,VS2017开发Linux程序之管理已有的makefile工程
  14. php laypage,ThinkPHP5、内容管理系统、前端框架layui、layPage模块
  15. matlab 正则化表达式_MatLab归一化(正则化)函数
  16. Vim学习笔记一:Vim对文本操作
  17. 针对Informer中时序数据ETT油温数据分析
  18. 取消和卸载Office 2010默认安装的微软拼音输入法的方法
  19. 门诊地图导航怎么做,零成本的医院室内导航解决方案
  20. grasscutter 使用指南——Android/Windows/IOS端均已支持

热门文章

  1. Mysql数据库(三)——mysql数据库高级操作
  2. C语言中static用法大全
  3. JFreeChart 1.0.6 用户开发指南(中文)
  4. python面向对象作业_python面向对象编程作业
  5. filegee为啥没变动也更新_2020/10/07|02=下一步行动|evernote更新以及后续影响
  6. 河海大学2019计算机考研分数线,河海大学2019年硕士研究生复试分数线
  7. java 二叉树的高度_Java实现二叉树的建立、计算高度与递归输出操作示例
  8. mysql 每条记录大小_计算数据库中各个表的数据量和每行记录所占用空间
  9. (2) 用java实现一个简易编译器1-词法解析入门
  10. liferay 点击build service 出现Cloud not reserve enough space for object heap