小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
写在前面:作者主要会集中在部分重点面试问题上,本文并不能作为一篇严谨介绍ES6的文档,仅供各位想要求职的朋友们再回忆回忆,加强记忆部分内容,存在问题请留言指出,以上。 :)
let & const
- let & const 定义的变量只能在定义后使用, var 定义的变量可以变量提升
- let & const 都不能重复定义
- const 定义的常量不可变
请注意基础类型和引用类型的区别
变量的解构赋值
- ES6支持不完整的解构方式,但目标对象必须是可遍历的
// 简单描述一下解构赋值
// 不完整解构
const [a,b] = [1,2,3];
// a = 1
// b = 2
const [a,b,c] = [1];
// a = 1
// b = undefined
// c = undefined
// swap
const [a,b] = [b,a];
字符串新增方法
includes: 用于判断字符串是否包含某个字符串,且第二个参数皆为开始搜索的index
显然,
includes包含了startsWith&endWith
repeat: 返回一个新的字符串重复多次之后的结果
注意,
repeat接受一个参数,即重复次数,若参数并非正整数,函数会试图向下转换成正整数(当值在(-1, 0)之间的时候会被转换为0)。此外,当参数 < -1 或为Infinity时会返回一个RangeError.
replaceAll: 现在 ES6 里可以直接使用replaceAll了。
数组新增方法
扩展运算符: 这里要关注的是
const arr = [1, 2, 3];
const arr2 = [...arr] // arr2 [1,2,3]
arr === arr2 // false
注意,只有函数调用时,扩展运算符才可以放在圆括号中,否则会报错。
Array.of():为了弥补Array构造函数存在的问题,即Array(1)和Array(1,2)完全不同。此外,若没有参数,则返回一个空数组。Array.fill(): 用于填充数组。
注意,如果填充的类型为对象,那么被赋值的是同一个内存地址的对象,而不是深拷贝对象。
对象的拓展
- 对象属性遍历方式
ES6 一共有 5 种方法可以遍历对象的属性。
- for...in
for...in循环遍历对象自身的和继承的可枚举属性(不含 Symbol 属性)。
- Object.keys(obj)
Object.keys返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含 Symbol 属性)的键名。
- Object.getOwnPropertyNames(obj)
Object.getOwnPropertyNames返回一个数组,包含对象自身的所有属性(不含 Symbol 属性,但是包括不可枚举属性)的键名。
- Object.getOwnPropertySymbols(obj)
Object.getOwnPropertySymbols返回一个数组,包含对象自身的所有 Symbol 属性的键名。
- Reflect.ownKeys(obj)
Reflect.ownKeys返回一个数组,包含对象自身的(不含继承的)所有键名,不管键名是 Symbol 或字符串,也不管是否可枚举。
以上的 5 种方法遍历对象的键名,都遵守同样的属性遍历的次序规则。
- 首先遍历所有数值键,按照数值升序排列。
- 其次遍历所有字符串键,按照加入时间升序排列。
- 最后遍历所有
Symbol键,按照加入时间升序排列。
Reflect.ownKeys({
[Symbol()]:100,
b:100,
3:100,
100: 100,
2:100,
a:100
})
// ['2','3','100','b','a',Symbol()]
上面代码中,Reflect.ownKeys方法返回一个数组,包含了参数对象的所有属性。这个数组的属性次序是这样的,首先是数值属性2和10,其次是字符串属性b和a,最后是 Symbol 属性。
对象新增方法
- Object.is()
Object.is()用来比较两个值是否完全相等。与===不同的是,+0不等于-0、NaN等于自身。 - Object.assign()
Object.assign()方法用于对象的合并,将源对象(source)的所有自身的且可枚举属性,复制到目标对象(target)。
我们常用Object.assign来浅复制一个对象——虽然严格来说这种方式并不合理,因为会漏掉可能存在的不可枚举属性。
let obj = { a: 1 }
obj === Object.assign(obj) // true
运算符
a**b===Math.pow(a,b)a?.b===(a === null || a === undefined) ? undefined : a.ba ?? b===a === null ? b : a
如果多个逻辑运算符一起使用,必须用括号表明优先级,否则会报错。