语法》第四章 字符串

(本文为阮一峰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)
(上面这些字符前面加上反斜杠,都表示特殊含义。)

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

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‘) // "你好"

时间: 2024-07-30 07:27:04

语法》第四章 字符串的相关文章

第四章.字符串和字符

String 是一个有序的字符集合,例如 "hello, world", "albatross".Swift 字符串通过 String 类型来表示,也可以表示为 Character 类型值的集合. 字符串字面量 字符串字面量可以用于为常量和变量提供初始值. let someString = "Some string literal value" 注意:someString 常量通过字符串字面量进行初始化,Swift 因此推断其为 String 类

第四章 字符串操作与正则表达式(5)

******** 4.6 正则表达式的介绍 (from book < PHP & MySQL Web Development>)PHP 支持两种格式的正则表达式语法:POSIX 和 Perl.用途:完成复杂的模式匹配.难度:难******** 4.6.1 基础知识 ****** 定义:正则表达式是一种描述一段文本模式的方法. 类比:strstr()函数,是在一个字符串的某个位置(如果不指明则可能在字符串中的任何位置)匹配另一个字符串. 例子:字符处"shop"匹配正

C Primer Plus (第五版) 第四章 编程练习

第四章    字符串和格式化输入/输出 编程练习 编写一个程序,要求输入名字和姓氏,然后以"名字,姓氏"的格式打印. #include <stdio.h> #define LEN 21 int main(void) { char last_name[LEN]; char first_name[LEN]; printf("请输入你的名字和姓氏:\n"); scanf("%s%s", &first_name, &last_

编译技术图式(第四章 语法分析)01文法和语法的定义

编译技术图式(第四章 语法分析)01文法和语法的定义 1.基本概念 1)词法规则: 哪些字符串合法或者不合法 字母表:语言允许使用字符的集合 词汇:由字符组成的有限串(字符串) 标识符:函数名,变量名等 2)语法规则: 句子:一个“词汇序列” 确定句子在形式上是否合法 提供句子的结构: if ( 表达式 ) 语句 else 语句 3)语法的表示: (1)自然语言描述 (2)形式化描述(BNF) (3)转换图(语法图) 2.形式化描述 终结符.非终结符.产生式 1)定义 2)产生式的表示    

Java语言程序设计(基础篇) 第四章 数学函数、字符和字符串

第四章 数学函数.字符和字符串 4.2 常用数学函数 方法分三类:三角函数方法(trigonometric method).指数函数方法(exponent method)和服务方法(service method) 4.4 String类型 String类型不是基本类型,而是引用类型(reference type).

Delphi基本之pascal语法(第四章.循环结构程序设计)

第四章.循环结构程序设计 一.FOR语句格式:1.FOR <循环变量>:=<初值> TO <终值> DO <语句>: 2.FOR<循环变量>:=<终值> DOWNTO <初值> DO <语句>.[例1]:输入10个数,求最大值.最小值.和.及平均值. PROGRAM ten(input,output);VAR a,s,max,min,avg:real; i:integer;BEGIN write('please

第四章 数组,字符串和指针

数组 数组若没有指定初始值则为内存遗留值 如果指定了部分初始值,那么其余部分也默认被指定为0: long data[100]={0};          //给data数组的所有元素赋0 字符串是附加有特殊字符(/0)的字符序列 数组的填充: char president[]="thank you"; wchar_t president[]=L"thank you";     //Unicode字符串 const int max=80; char name[max]

Java编程思想第四版读书笔记——第十三章 字符串

Java编程思想第四版读书笔记--第十三章 字符串 字符串的操作是计算机程序设计中最常见的行为. 关键词: StringBuilder ,StringBuffer,toString(),format转换,正则表达式, 1.不可变String String对象时不可变的.每当把String对象作为方法的参数时,都会复制一份引用.(其实就是对函数中参数列表中参数的操作不会影响外面的原参数) 如下: import static net.mindview.util.Print.*; public cla

第四章 复合类型

第四章  复合类型 4.1  数组 4.1.1  数组简介 数组(array)是一种数据格式,能够存储多个同类型的值. 声明数组的通用格式如下: typeName arrayName[arraySize]; 表达式arraySize指定数组的元素数目,它只能是以下三种情况之一: 1)        整型常数(如10,枚举值也可以): 2)        const值 3)        常量表达式(如8 * sizeof(int)) 注意:使用数组要注意下标的正确.编译器不会检查使用的下标是否有