解构赋值
解构赋值是对赋值运算符的扩展,主要针对数组或者对象进行模式匹配,然后对其中的变量进行赋值。
在解构中,有两部分参与:解构的源,解构赋值表达式的右边部分;解构的目标,解构赋值表达式的左边部分
1.数组的解构赋值
在解构数组的时候存在多种解构方法,如基本解构、嵌套解构、可忽略解构、不完全解构、剩余运算符解构、字符串结构、解构默认值等。具体解构实例如下:
//基本解构
let [a, b, c] = [1, 2, 3];
// a = 1 b = 2 c = 3
//嵌套解构
let [foo, [[bar], baz]] = [1, [[2], 3]];
//foo = 1 bar = 2 baz = 3
//可忽略解构
let [ , , third] = ["foo", "bar", "baz"];
//third = "baz"
//不完全解构
let [a, b] = [2,3,4];
// a = 2, b = 3
//剩余运算符解构
let [head, ...tail] = [1, 2, 3, 4];
//head = 1 tail = [2, 3, 4]
//字符串结构
let [a, b, c, d, e] = 'hello';
//解构默认值
let [a = 2] = [];
// a = 2
2.对象的解构赋值
对象的解构赋值和数组的解构赋值其实类似,但是数组的数组成员是有序的。而对象的属性则是无序的,变量必须与属性同名,才能取到正确的值。
//基本对象解构赋值
let { foo, bar } = { foo: 'aaa', bar: 'bbb' };
// foo = 'aaa' bar = 'bbb'
//可忽略
let { bar } = { foo: 'aaa', bar: 'bbb' };
// bar = 'bbb'
//可嵌套
let obj = {p: ['hello', {y: 'world'}] };
let {p: [x, { y }] } = obj;
// x = 'hello' y = 'world'
//剩余运算符
let {a, b, ...rest} = {a: 10, b: 20, c: 30, d: 40};
// a = 10 b = 20 rest = {c: 30, d: 40}
//解构默认值
let {a = 10, b = 5} = {a: 3};
// a = 3; b = 5;
在使用解构赋值时,可以进行嵌套使用,将数组解构和对象解构联合使用,虽然是联合使用了,但是它们的使用规则还是不变。
字符串
1.模板字符串
模板字符串相当于加强版的字符串,用反引号 ` ,除了作为普通字符串,还可以用来定义多行字符串,还可以在字符串中加入变量和表达式。具体的用法如下:
// 普通字符串
`In JavaScript '\n' is a line-feed.`
// 多行字符串
`In JavaScript this is
not legal.`
console.log(`string text line 1
string text line 2`);
// 字符串中嵌入变量
let name = "Bob", time = "today";
`Hello ${name}, how are you ${time}?`
在使用模板字符串的时候需要注意,模板字符串中的换行和空格都是会被保留。
2.新增方法
String.fromCodePoint()
在ES5 中有一个String.fromCharCode()
方法,用于从 Unicode 码点返回对应字符,但是这个方法不能识别码点大于0xFFFF
的字符,而String.fromCodePoint()
可以识别大于0xFFFF
的字符,当传入多个参数的时候它们会被合并成一个字符串返回。
String.fromCodePoint(0x20BB7)
// "𠮷"
String.fromCodePoint(0x78, 0x1f680, 0x79) === 'x\uD83D\uDE80y'
// true
includes(), startsWith(), endsWith()
includes(), startsWith(), endsWith()
可以用来确定一个字符串是否包含在另一个字符串中,这三个方法都支持第二个参数,表示开始搜索的位置
- includes():返回布尔值,表示是否找到了参数字符串。
- startsWith():返回布尔值,表示参数字符串是否在原字符串的头部。
- endsWith():返回布尔值,表示参数字符串是否在原字符串的尾部。
let s = 'Hello world!';
s.startsWith('world', 6) // true
s.endsWith('Hello', 5) // true
s.includes('Hello', 6) // false
这三个方法只返回布尔值,如果需要知道子串的位置,还是得用 indexOf 和 lastIndexOf 。
这三个方法如果传入了正则表达式而不是字符串,会抛出错误。而 indexOf 和 lastIndexOf 这两个方法,它们会将正则表达式转换为字符串并搜索它。
repeat()
repeat()
方法返回一个新字符串,表示将原字符串重复n次。
'x'.repeat(3) // "xxx"
'hello'.repeat(2) // "hellohello"
'na'.repeat(0) // ""
如果参数是小数,向下取整
console.log("Hello,".repeat(3.2)); // "Hello,Hello,Hello,"
如果参数是 0 至 -1 之间的小数,会进行取整运算,0 至 -1 之间的小数取整得到 -0 ,等同于 repeat 零次
console.log("Hello,".repeat(-0.5)); // ""
如果参数是 NaN,等同于 repeat 零次
console.log("Hello,".repeat(NaN)); // ""
如果参数是负数或者 Infinity ,会报错:
console.log("Hello,".repeat(-1));
// RangeError: Invalid count value
console.log("Hello,".repeat(Infinity));
// RangeError: Invalid count value
如果传入的参数是字符串,则会先将字符串转化为数字
console.log("Hello,".repeat("hh")); // ""
console.log("Hello,".repeat("2")); // "Hello,Hello,"
padStart(),padEnd()
如果某个字符串不够指定长度,会在头部或尾部补全。padStart()用于头部补全,padEnd()用于尾部补全。
- padStart:返回新的字符串,表示用参数字符串从头部(左侧)补全原字符串。
- padEnd:返回新的字符串,表示用参数字符串从尾部(右侧)补全原字符串。
以上两个方法接受两个参数,第一个参数是指定生成的字符串的最小长度,第二个参数是用来补全的字符串。如果没有指定第二个参数,默认用空格填充。
console.log("h".padStart(5,"o")); // "ooooh"
console.log("h".padEnd(5,"o")); // "hoooo"
console.log("h".padStart(5)); // " h"
如果指定的长度小于或者等于原字符串的长度,则返回原字符串:
console.log("hello".padStart(5,"A")); // "hello"
如果原字符串加上补全字符串长度大于指定长度,则截去超出位数的补全字符串:
console.log("hello".padEnd(10,",world!")); // "hello,worl"
常用于补全位数:
console.log("123".padStart(10,"0")); // "0000000123"
trimStart(),trimEnd()
trimStart()
和trimEnd()
这两个方法。它们的行为与trim()
一致,trimStart()
消除字符串头部的空格,trimEnd()
消除尾部的空格。它们返回的都是新字符串,不会修改原始字符串。
const s = ' abc ';
s.trim() // "abc"
s.trimStart() // "abc "
s.trimEnd() // " abc"
除了能消除空格键,这两个方法对字符串头部(或尾部)的 tab 键、换行符等不可见的空白符号也有效。
replaceAll()
可以一次性替换所有匹配,它的用法与replace()
相同,返回一个新字符串,不会改变原字符串。
'aabbcc'.replaceAll('b', '_')
// 'aa__cc'