... 展开运算符 用于函数实参或者赋值号右边
console.log(...[1, 2, 3]) // 1,2,3console.log(Math.max(...[1, 2, 3]))//3 console.log(Math.max.apply(null, [1, 2, 3]))//3const o = { a: 1, b: 2 }const obj = { ...o, c: 3 }console.log(obj)//Object
... 剩余运算符 用于赋值号左边或函数形参
const [a, ...args] = [1, 2, 3, 4]console.log(args) // [2,3,4]const fn = (...args) => {console.log(args)let sum = 0args.forEach((item) => {sum += item})return sum}console.log(fn(1))//1console.log(fn(1, 2))//3console.log(fn(1, 2, 3))//6
函数参数默认值
function fn(a = 0, b = 0) {return a + b}console.log(fn())//0console.log(fn.name)//fn
对象变化
当对象的属性名和值的变量名或常量名一样 可以省略冒号+变量名
const username = 'admin'const pwd = '123456'const obj = {username, // username:usernamepwd,say() {console.log('say')//say},say1: () => {},}console.log(obj)//objectobj.say()const o = Object.create(obj) // o.__proto__ = objo.a = 100console.log(o.username)//adminconsole.log(NaN === NaN)//falseconsole.log(Object.is(NaN, NaN)) // trueconsole.log(Object.is({ a: 1 }, { a: 1 }))//falseconst arr = [1, 2, 3]console.log(arr.toString())//1,2,3 console.log(Object.prototype.toString.call(arr))//[object Array]
hasOwnProperty() 判断某个属性是否是自身
console.log(o.hasOwnProperty('username')) // falseconsole.log(o.hasOwnProperty('a')) // true
数组扁平化
实现方式一 数组的flat方法const arr1 = [0, 1, 2, [3, 4, [9, 10]], [7, 8]]console.log(arr1.keys()) // 返回const iterator = arr1.keys()for (const key of iterator) {console.log(key)}console.log(Object.keys(arr1))//['0', '1', '2', '3', '4']
实现方式二 递归
function flat(arr, newArr = []) {arr.forEach((item) => {if (Array.isArray(item)) {flat(item, newArr)} else {newArr.push(item)}})return newArr}
console.log(flat(arr1))//[0, 1, 2, 3, 4, 9, 10, 7, 8]
console.log('x'.repeat(3))//xxxconst paragraph ='The quick brown fox jumps over the lazy dog. It barked.'const regex = /([A-Z])h/const found = paragraph.match(regex)console.log(found)
集合-Set集合不能重复
const set = new Set()
往集合添加元素
set.add('html')set.add('css')set.add('js')set.add('js')
集合遍历
set.forEach((item) => {console.log(item)})
集合长度
console.log(set.size)
判断集合是否含有某个元素
console.log(set.has('js'))console.log(Array.from(set)) //['html', 'css', 'js'] console.log([...set]) //['html', 'css', 'js'] set.delete('html')console.log(set)//{'css', 'js'}set.clear()console.log(set.size)//0
利用set集合实现数组去重 对原数组进行遍历,判断每个元素不在新数组中,加到新数组中
const s = [...new Set([1, 2, 3, 4, 3, 2])]
console.log(s)//[1, 2, 3, 4]
const arr = [1, 2, 3, 4, 3, 2]const newArr = []arr.forEach((item) => {if (newArr.indexOf(item) === -1) {newArr.push(item)}})console.log(newArr)// [1, 2, 3, 4]
Map存的是键值对
const map = new Map()map.set('uname', 'zs')map.set('address', { province: '浙江省', city: '杭州' })const o = { a: 1 }map.set(o, { x: 100 })map.delete('uname')console.log(map.get('address'))//objectconsole.log(map.size)//2console.log(map.has('uname'))//false
遍历
map.forEach((v, k) => {console.log(v, k)})
WeakMap 它的键只能是对象,一个对象作为 WeakMap 的键存在,不会阻止该对象被垃圾回收性能更好
const weakMap = new WeakMap()weakMap.set(o, 10)console.log(weakMap)
深拷贝方式
const o = {a: 1,b: [2, 3],c: {x: 10,y: 20,},}o.o1 = o // {a,b,c,o1:{a,b,c,o1:}}function deepClone(obj) {if (obj == null) return objif (obj instanceof Date) return new Date(obj)if (typeof obj !== 'object') return objconst newObj = new obj.constructor()for (const key in obj) {newObj[key] = deepClone(obj[key])}return newObj}console.log(deepClone(o))</script>