语法》第四章 字符串

时间:2023-01-07 15:38:50

(本文为阮一峰js标准教程的学习笔记,旨在总结该教程中涉及的知识点大纲及个人所做的一些拓展,方便作为“目录”或者“大纲”复习和查漏补缺,详细内容请参见阮一峰教程原文)

 

第二部分 语法

 

*************第四章 字符串***************

一.概述
1.定义:零个或者多个字符,放在单引或双引之中。
2.单引套双引,双引套单引。
3.单套单,双套双,前面加斜杠转义。
'\' xxxxx\''
4.js字符串建议单引,因为html属性是双引,不要各种风格代码混写。
5.字符串默认只能写在一行内,分成多行将会报错。

'a
b
c'
// SyntaxError: Unexpected token ILLEGAL

6.字符串多行写的方法
*可以在每一行的尾部使用反斜杠。

var longString = "Long \
long \
long \
string";

longString
// "Long long long string"

注意,反斜杠的后面必须是换行符,而不能有其他字符(比如空格),否则会报错。上面代码表示,加了反斜杠以后,原来写在一行的字符串,可以分成多行书写。但是,输出的时候还是单行,效果与写在同一行完全一样。
*连接运算符(+)可以连接多个单行字符串,将长字符串拆成多行书写,输出的时候也是单行。
var longString = 'Long '
  + 'long '
  + 'long '
  + 'string';


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

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

 


二、转义
1.反斜杠(\)在字符串内有特殊含义,用来表示一些特殊字符,所以又称为转义符。网页最后渲染时会把\加后面的特殊字符组成的转义字符翻译成相应的普通字符或者功能字符并呈现在页面上。

    \0 null(\u0000)
    \b 后退键(\u0008)
    \f 换页符(\u000C)
    \n 换行符(\u000A)
    \r 回车键(\u000D)
    \t 制表符(\u0009)
    \v 垂直制表符(\u000B)
    \' 单引号(\u0027)
    \" 双引号(\u0022)
    \ 反斜杠(\u005C)
(上面这些字符前面加上反斜杠,都表示特殊含义。)



2.反斜杠还有三种特殊用法。
(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


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

'\a'
// "a"

4.字符串正常内容需要“\”则“\\”对自身转义

三、字符串与数组
1.字符串可以被视为字符数组,因此可以使用数组的方括号运算符,用来返回某个位置的字符(位置编号从0开始)。
var s = 'hello';
s[4] // "o"

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

2.方括号中的数字超过字符串的长度,或者方括号中根本不是数字,则返回undefined。
'abc'[3] // undefined
'abc'[-1] // undefined
'abc'['x'] // undefined

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

var s = 'hello';

delete s[0];
s // "hello"

s[1] = 'a';
s // "hello"
4.字符串内部的单个字符无法改变和增删,这些操作会默默地失败。
5.字符串也无法直接使用数组的方法,报错
var s = 'hello';

s.join(' ') // TypeError: s.join is not a function


6.通过call方法可以让字符串间接使用数组的方法。
var s = 'hello';
Array.prototype.join.call(s, ' ') // "h e l l o"

由于字符串是只读的,那些会改变原数组的方法,比如push()、sort()、reverse()、splice()都对字符串无效,只有将字符串显式转为数组后才能使用

7.length属性
*返回字符串长度,无法改变。
*var str="abc" str.length=7 不报错会默默的失败。



三、字符集
1.js使用unicode字符集,也就是说,在JavaScript引擎内部,所有字符都用Unicode表示。
2.允许直接在程序中使用unicode编号表示字符,即将字符写成\uxxxx的形式,xxxx表示该字符的unicode编码。
比如:\u00a9 代表©
3.var s='\u00a' s//"©"
4.解析代码的时候,JavaScript会自动识别一个字符是字面形式表示,还是Unicode形式表示。输出给用户的时候,所有字符都会转成字面形式。

var f\u006F\u006F = 'abc';
foo // "abc"

第一行的变量名foo是Unicode形式表示,第二行是字面形式表示。JavaScript会自动识别。
5.每个字符在JavaScript内部都是以16位(即2个字节)的UTF-16格式储存。也就是说,JavaScript的单位字符长度固定为16位长度,即2个字节。
6.字符内部储存用2个字节和4个字节带来的问题【不理解】

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

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

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

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

btoa('你好')
// //// Uncaught DOMException:报错

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

function b64Encode(str) {
  return btoa(encodeURIComponent(str));
}

function b64Decode(str) {
  return decodeURIComponent(atob(str));
}

b64Encode('你好') // "JUU0JUJEJUEwJUU1JUE1JUJE"
b64Decode('JUU0JUJEJUEwJUU1JUE1JUJE') // "你好"