1.解构赋值
默认值生效的条件是,对象的属性值严格等于undefined。
var {x = 3} = {x: undefined};
x // 3
var {x = 3} = {x: null};
x // null
var { message: msg = ‘Something went wrong’ } = {};
msg // “Something went wrong” //改名、默认值
let arr=[5,7]
[arr[0],arr[]1] = [arr[1],arr[0]] //交换变量
任何部署了 Iterator 接口的对象,都可以用for…of循环遍历
2.模板字符串
如果在模板字符串中需要使用反引号,则前面要用反斜杠转义。
let greeting = \
Yo` World!`;
includes():返回布尔值,表示是否找到了参数字符串。
startsWith():返回布尔值,表示参数字符串是否在原字符串的头部。
endsWith():返回布尔值,表示参数字符串是否在原字符串的尾部
let s = ‘Hello world!’;
s.startsWith(‘Hello’) // true
s.endsWith(’!’) // true
s.includes(‘o’) // true
repeat方法返回一个新字符串,表示将原字符串重复n次。
‘x’.repeat(3) // “xxx”
padStart()用于头部补全,padEnd()用于尾部补全。
padStart()和padEnd()一共接受两个参数,第一个参数是字符串补全生效的最大长度,第二个参数是用来补全的字符串。
‘x’.padEnd(5, ‘ab’) // ‘xabab’
‘x’.padEnd(4, ‘ab’) // ‘xaba’
trim消除字符串空格,trimStart()消除字符串头部的空格,trimEnd()消除尾部的空格。它们返回的都是新字符串,不会修改原始字符串
replace()只能替换第一个匹配,replaceAll()方法,可以一次性替换所有匹配,返回一个新字符串,不会改变原字符串。
‘aabbcc’.replaceAll(‘b’, ‘_’)
at()方法接受一个整数作为参数,返回参数指定位置的字符,支持负索引(即倒数的位置)
const str = ‘hello’;
str.at(1) // “e”
Number.isFinite()用来检查一个数值是否为有限的(finite),即不是Infinity。
Number.isNaN()用来检查一个值是否为NaN。
parseInt()和parseFloat()
Number.isInteger()用来判断一个数值是否为整数。
Math.trunc方法用于去除一个数的小数部分,返回整数部分。
Math.sign方法用来判断一个数到底是正数、负数、还是零。对于非数值,会先将其转换为数值。
BigInt 只用来表示整数,没有位数的限制,任何位数的整数都可以精确表示,不能为小数
ES6 引入 rest 参数(形式为…变量名),用于获取函数的多余参数,这样就不需要使用arguments对象了。rest 参数搭配的变量是一个数组,该变量将多余的参数放入数组中。
function add(…values) {
let sum = 0;
for (var val of values) {
sum += val;
}
return sum;
}
add(2, 5, 3) // 10
箭头函数有几个使用注意点
(1)箭头函数没有自己的this对象。
(2)不可以当作构造函数,也就是说,不可以对箭头函数使用new命令,否则会抛出一个错误。
(3)不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。
(4)不可以使用yield命令,因此箭头函数不能用作 Generator 函数。
尾递归之所以需要优化,原因是调用栈太多,造成溢出,那么只要减少调用栈,就不会溢出。怎么做可以减少调用栈呢?就是采用“循环”换掉“递归”
function sum(x, y) {
if (y > 0) {
return sum(x + 1, y - 1);
} else {
return x;
}
}
sum(1, 100000)
蹦床函数的一个实现,它接受一个函数f作为参数。只要f执行后返回一个函数,就继续执行。注意,这里是返回一个函数,然后执行该函数,而不是函数里面调用函数,这样就避免了递归执行,从而就消除了调用栈过大的问题。
function sum(x, y) {
if (y > 0) {
return sum.bind(null, x + 1, y - 1);
} else {
return x;
}
}
Map 和 Set 结构,Generator 函数
let obj = {a:4,b:9,c:5}
let arr = […obj] //obj is not iterable
如果对没有 Iterator 接口的对象,使用扩展运算符,将会报错。
只要是部署了 Iterator 接口的数据结构,Array.from都能将其转为数组。
Array.from还可以接受第二个参数,作用类似于数组的map方法,用来对每个元素进行处理,将处理后的值放入返回的数组。
Array.from([1, 2, 3], (x) => x * x)
Array.of()方法用于将一组值,转换为数组。
Array.at(-1) 返回数组的最后一个元素
let aClone = { …a };
// 等同于
let aClone = Object.assign({}, a);
如果想完整克隆一个对象,还拷贝对象原型的属性,可以采用下面的写法。
// 写法二
const clone2 = Object.assign(
Object.create(Object.getPrototypeOf(obj)),
obj
);
// 写法三
const clone3 = Object.create(
Object.getPrototypeOf(obj),
Object.getOwnPropertyDescriptors(obj)
)
Object.getOwnPropertyDescriptors()方法返回一个对象,所有原对象的属性名都是该对象的属性名,对应的属性值就是该属性的描述对象
Object.setPrototypeOf()(写操作)、Object.getPrototypeOf()(读操作)、Object.create()(生成操作)
let obj={a:8}
let obj3 = {p:100}
Object.setPrototypeOf(obj,obj3)
obj.p //100
Object.getPrototypeOf(obj); //读取obj的原型 {p:100}
Object.keys(),Object.values(),Object.entries()
Object.fromEntries()方法是Object.entries()的逆操作,用于将一个键值对数组转为对象。
Null 判断运算符??只有运算符左侧的值为null或undefined时