Day04 - 字符串详解

作业

  1. 字符串是什么
  2. 字符串类型是什么
  3. 创建字符串的方法
  4. 创建字符串字面量的语法
  5. 字符串的特点
  • 字符串用法1:查询字符串长度
  • 用法2:连接字符串
  • 用法3:比较字符串
  • 用法4:查询索引
  • 用法5:查询字符
  • 用法6:查询字符编码
  • 用法7:提取字符
  • 字符串对象
  • 包装对象

字符串是什么

定义
字符串就是使用引号括起来的字符序列。

字符串类型是什么

  • 字符串就是string
  • string是一种数据类型,用于表示js程序中的文本。
  • string是一个不可修改的16位值的有序序列。
  • 每个字符对应一个或多个16位存储单元。
  • string的长度表示字符编码的个数,并非字符的个数。
'张三'
'hello world'

'\uD83D\uDE00' //😀
'😀'.length // 2

'e\u0301' //'é'
'é'.length // 2

'\ud83d\udc99' //💙
'💙'.length  //  2

创建字符串的方法

方法一:创建字符串字面量

字符串字面量

  • 字符串字面量指直接出现在程序中的字符串,而不是以变量形式出现的字符串。
  • 字符串字面量是由单引号双引号反引号括起来的字符序列。

用法1:使用引号定界

'hello world'
"hello world"
`hello world`

用法2:引号嵌套规则
外单内双 单引号定界的字符串中可以包含双引号,不能包含单引号

'<div class="box"></div>' //正确。外单内双
'<div class='box'></div>' //错误。定界错误

外双内单:双引号定界的字符串中可以包含单引号,不能包含双引号

"<div class='box'></div>" //正确。外双内单
"<div class="box"></div>" //错误。定界错误

外反:反引号定界的字符串中可以包含单引号或双引号

`<div class='box'></div>` //正确
`<div class="box"></div>` //正确

用法3:转义符 - 即反斜线\
反斜线在JavaScript中有着特殊用途。反斜线后加一个字符,该字符就不再表示该字符的字面意思了。

'It\'s true.' //正确。转义符后面的单引号不再表示字符串定界符
"<div class=\"box\"></div>" //正确。转义符后面的双引号不再表示字符串定界符

用法4:换行
使用单引号或双引号定界的字符串不能换行。

'滚滚长
江东逝水' //错误。单引号定界的字符串必须写在一行内

'滚滚长\
江东逝水' //正确。反斜线后面的行结束符(不可见符号)被转义,即行结束符不再表示行结束

使用反引号定界的字符串可以换行

let str = ''
str += `<ul>
  <li>列表项</li>
</ul>
`

用法5:模版字符串
使用反引号定界的字符串也被称为”模版字符串“。模版字符串可以包含js表达式。

let name = '张三';
console.log(`Hello ${ name }`) // 'hello 张三'

方法二:创建字符串对象

String对象用于表示和操作字符序列。

创建字符串对象

String对象可以通过String()构造函数创建。

const str = new String("hello world")
console.log(str) //返回 'hello world'

字符串的特点

特点1:字符串是不可变的

字符串是固定不变的,类似replace()toUpperCase()的方法都返回新字符串,原字符串本身并没有发生改变。字符串相当于只读数组。

let arr = [1,2,3]
arr[1] = 5
console.log(arr) //数组元素可以修改

let str = '123'
str[1] = 5
console.log(str) //字符串元素不可以修改

特点2:字符串是有索引的

  • 字符串的索引从0开始
  • 第一个字符的位置是0
  • 第二个字符的位置是1
  • 最后一个字符的位置: str[str.length - 1]

特点3:字符串是有长度的

用法1:查询字符串长度

  • 字符串的长度是指字符串中包含单个字符的个数。
  • 空字符串的长度为0。
  • 可使用length属性查询字符的长度。
var str = 'hello'
var len = str.length
console.log(len) //5

案例1

  1. 限制内容字数

用法2:连接字符串

方法1:使用加号操作符

  • 如果将加号(+)运算符用于数字,表示两数相加;
  • 如果将加号(+)运算符用于字符串,则表示字符串连接。

方法2:string.concat()
concat() 方法将字符串参数连接到调用字符串并返回一个新字符串。

const str1 = 'Hello';
const str2 = 'World';

console.log(str1.concat(' ', str2));
// expected output: "Hello World"

console.log(str2.concat(', ', str1));
// expected output: "World, Hello"

语法

concat(str1)
concat(str1, str2)
concat(str1, str2, /* …, */ strN)

用法3: 比较字符串

在JS中,字符串是可以比较的,但是只能使用大于、小于操作符比较。

const str1 = 'a'
const str2 = 'b'
if( str1 > str2){
    console.log(`${str1}大于${str2}`)
} else if(str2 > str1){
    console.log(`${str2}大于${str1}`)
} else {
    console.log(`${str1}等于${str2}`)
}

用法4: 查询索引

string.indexOf()
indexOf() 方法返回指定字符串在调用字符串中第一次出现的位置。

  • 如果未找到,则返回-1。
  • 对大小写敏感
  • 不能使用正则表达式

语法

indexOf(searchString)
indexOf(searchString, start)

  • searchString: 要搜索的子字符串
  • start: 搜索的开始位置。默认是0

string.lastIndexOf()
Returns the index (position) of the last occurrence of a value in a string

string.search()
返回指定值或正则表达式匹配到的字符串的索引。

用法5: 查询字符

string.charAt()
Returns the character at a specified index (position)
string.charCodeAt()
Returns the Unicode of the character at a specified index。

案例

  1. 找出字符串中所有的数字
  2. QQ登录检测

用法6:查询字符编码

string.fromCharCode()
返回Unicode编码对应的字符。

案例

  1. 告白加密

用法7:提取字符

方法1String.prototype.slice()
定义:返回提取的字符串。(slice方法也可操作数组)

语法:

slice(indexStart)
slice(indexStart, indexEnd)

参数:

  • indexStart: 提取的起始/包含位置(包含该位置的字符)。可以是负值。含头
  • indexEnd : 可选。提取的结束/排除位置(不包含该位置的字符)。可以是负值。不含尾

返回值: 提取的子字符串。

示例:

const str = '0123456789';

/*****没有值*****/
//start=0 end=str.length-1
console.log(str.slice()); // "hello"
console.log(str.substring()); // "hello"

/*****一个值*****/ 
//end=str.length-1
console.log(str.slice(2)); //"llo"
console.log(str.substring(2)); //"llo"
//if start == nagative, end = str.length-1
console.log(str.slice(-2));// "lo"
console.log(str.substring(-2));// "Hello"
//if start >= str.length 则返回空字符串
console.log(str.slice(5)); //""
console.log(str.substring(5)); //""
//if start == undefined ||NaN||null start = 0
console.log(str.slice(undefined)); // "hello"
console.log(str.substring(undefined)); // "hello"
console.log(str.slice(NaN)); // "hello"
console.log(str.substring(NaN)); // "hello"
console.log(str.slice(null)); // "hello"
console.log(str.substring(null)); // "hello"

/*****两个值*****/
//正值
console.log(str.slice(2, 4));//"ll"
console.log(str.substring(2, 4));//"ll"
//负值
console.log(str.slice(-4, -2)); // "el"
console.log(str.substring(-4, -2)); // ""
//if end <= start 则返回空字符串
console.log(str.slice(4, 2));//""
console.log(str.substring(4, 2));//"ll"
console.log(str.slice(-2, -4));//""
console.log(str.substring(-2, -4));//""

案例2

  1. 截取粘贴的文本
  2. 驼峰转换

substr()

Extracts a number of characters from a string, from a start index (position)

String.prototype.substring()

substring()方法返回提取的字符串。

语法

substring(indexStart)
substring(indexStart, indexEnd)
  • indexstart:提取字符串的起始(包含)位置,不可以是负值。含头
  • indexend: 提取字符串的结束(排除)位置,不可以是负值。不含尾

返回值:新字符

示例:

const str = '0123456789';

/*****没有值*****/
//start=0 end=str.length-1
console.log(str.slice()); // "hello"
console.log(str.substring()); // "hello"

/*****一个值*****/ 
//end=str.length-1
console.log(str.slice(2)); //"llo"
console.log(str.substring(2)); //"llo"
//if start == nagative, end = 0
console.log(str.slice(-2));// "lo"
console.log(str.substring(-2));// "Hello"
//if start >= str.length 则返回空字符串
console.log(str.slice(5)); //""
console.log(str.substring(5)); //""
//if start == undefined ||NaN||null start = 0
console.log(str.slice(undefined)); // "hello"
console.log(str.substring(undefined)); // "hello"
console.log(str.slice(NaN)); // "hello"
console.log(str.substring(NaN)); // "hello"
console.log(str.slice(null)); // "hello"
console.log(str.substring(null)); // "hello"

/*****两个值*****/
//正值
console.log(str.slice(2, 4));//"ll"
console.log(str.substring(2, 4));//"ll"
//负值
console.log(str.slice(-4, -2)); // "el"
console.log(str.substring(-4, -2)); // ""
//if end <= start 则交换start和end
console.log(str.slice(4, 2));//""
console.log(str.substring(4, 2));//"ll"
console.log(str.slice(-2, -4));//""
console.log(str.substring(-2, -4));//""

检测字符串

includes()

返回字符串是否包含指定值

endsWith()

检测字符串是否以指定值结尾

startsWith()

检测字符串是否以指定字符开头。

案例

  1. 替换字符

检索字符串

match()

在字符串中搜索值或正则表达式,并返回匹配项。

repeat()

返回具有多个字符串副本的新字符串。

replace()

返回指定值或正则表达式替换后的字符串。

字符串转数组

String.prototype.split()

split()方法通过分隔符把字符串分隔为一个数组。

语法

split()
split(separator)
split(separator, limit)

  • separator: 分隔符,即分隔字符的模式。分隔符可以是:
    • 字符串
    • RegExp
  • limit: (可选) 指定返回数组的长度。非负整数。
    • 如果是0,则返回空数组。

示例:

const str = 'hello world'

const arr1 = str.split()
console.log(arr1)//['hello world']

const arr2 = str.split('')
console.log(arr2) //['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']

const arr3 = str.split(' ')
console.log(arr3) //['hello', 'world']

const arr4 = str.split('o')
console.log(arr4) //['hell', ' w', 'rld']

const arr5 = str.split('l')
console.log(arr5) //['he', '', 'o wor', 'd']

大小写转换

toLowerCase()

返回转换为小写字母的字符串。

toUpperCase()

返回转换为大写字母的字符串。

案例

  1. 驼峰转换

toLocaleLowerCase()

返回转换为本地语言的小写字母的字符串。

toLocaleUpperCase()

返回转换为本地语言的大写字母的字符串。

去空白

trim()

Returns a string with removed whitespaces

trimEnd()

Returns a string with removed whitespaces from the end

trimStart()

Returns a string with removed whitespaces from the start

valueOf()

用于把字符串对象转换成字符串直接量。

toString()

返回字符串直接量或字符串对象。

包装对象

包装对象是指存取字符串的属性时创建的临时对象,被称为包装对象。

思考:字符串既然不是对象,为什么它会有属性和方法呢?

var str = 'hello'
var len = str.length
console.log(len) // 返回5

原因:只要引用了字符串str的属性,JavaScript就会将字符串值通过调用new String(str)的方式临时转换成对象,这个对象就是包装对象,它继承了字符串的方法,并用来处理属性的引用,一旦属性引用结束,包装对象就会被立刻销毁。

思考:可以为包装对象的属性赋值吗?

var str1 = 'hello world'
console.log(typeof str1) //string
console.log(str1.length) //调用包装对象读取str1的length属性,随即销毁
str1.attr = 100//试图为包装对象的属性赋值,则会忽略这个操作
console.log(str1.attr) // 返回undefined

var str2 = new String("hello world")
console.log(typeof str2) //object
str2.attr = 200
console.log(str2.attr) // 返回200

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,290评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,107评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,872评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,415评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,453评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,784评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,927评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,691评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,137评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,472评论 2 326
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,622评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,289评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,887评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,741评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,316评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,490评论 2 348

推荐阅读更多精彩内容