es7 以上知识
1. Es8
- Object.keys() 返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含 Symbol 属性)的键名。
- Object.values() 返回一个数组,包含对象自身的(不含继承的)所有可枚举属性的值。
js
const obj = {
name: "hzy",
age: 18
}
console.log(Object.keys(obj))
console.log(Object.values(obj))
// 用的非常少
console.log(Object.values(["abc", "cba", "nba"]))
console.log(Object.values("abc"))
// [ 'name', 'age' ]
// [ 'hzy', 18 ]
// [ 'abc', 'cba', 'nba' ]
// [ 'a', 'b', 'c' ]
- Object.entries() 返回一个数组,包含对象自身的(不含继承的)所有可枚举属性的键值对数组。
js
const obj = {
name: "hzy",
age: 18,
};
console.log(Object.entries(obj));
const objEntries = Object.entries(obj);
objEntries.forEach((item) => {
console.log(item[0], item[1]);
});
console.log(Object.entries(["abc", "cba", "nba"]));
console.log(Object.entries("abc"));
// [ [ 'name', 'hzy' ], [ 'age', 18 ] ]
// name hzy
// age 18
// [ [ '0', 'abc' ], [ '1', 'cba' ], [ '2', 'nba' ] ]
// [ [ '0', 'a' ], [ '1', 'b' ], [ '2', 'c' ] ]
- padStart() padStart用于头部补全.
- padEnd 用于尾部补全.
js
const message = "Hello World"
const newMessage = message.padStart(15, "*").padEnd(20, "-")
console.log(newMessage)
// 案例
const cardNumber = "321324234242342342341312"
const lastFourCard = cardNumber.slice(-4)
const finalCard = lastFourCard.padStart(cardNumber.length, "*")
console.log(finalCard)
// ****Hello World-----
// ********************1312
- Trailing-Commas : 尾部逗号
js
function foo(m, n,) {
}
foo(20, 30,)
- Async/Await : 异步/等待
js
// 1. async
// 2. await
async function foo() {
await new Promise((resolve, reject) => {
setTimeout(() => {
console.log("async")
resolve()
}, 1000)
})
}
2. Es10
- Array.flat() : 数组扁平化
- Array.flatMap() : 数组扁平化
js
// 1.flat的使用
// const nums = [10, 20, [2, 9], [[30, 40], [10, 45]], 78, [55, 88]]
// const newNums = nums.flat()
// console.log(newNums)
// const newNums2 = nums.flat(2)
// console.log(newNums2)
// 2.flatMap的使用
// const nums2 = [10, 20, 30]
// const newNums3 = nums2.flatMap(item => {
// return item * 2
// })
// const newNums4 = nums2.map(item => {
// return item * 2
// })
// console.log(newNums3)
// console.log(newNums4)
// 3.flatMap的应用场景
const messages = ["Hello World", "hello lyh", "my name is hzy"]
const words = messages.flatMap(item => {
return item.split(" ")
})
console.log(words)
- Object.fromEntries: 将键值对列表转换为对象
js
// const obj = {
// name: "hzy",
// age: 18,
// height: 1.88
// }
// const entries = Object.entries(obj)
// console.log(entries)
// const newObj = {}
// for (const entry of entries) {
// newObj[entry[0]] = entry[1]
// }
// 1.ES10中新增了Object.fromEntries方法
// const newObj = Object.fromEntries(entries)
// console.log(newObj)
// 2.Object.fromEntries的应用场景
const queryString = 'name=hzy&age=18&height=1.88'
const queryParams = new URLSearchParams(queryString)
for (const param of queryParams) {
console.log(param)
}
const paramObj = Object.fromEntries(queryParams)
console.log(paramObj)
// [ 'name', 'hzy' ]
// [ 'age', '18' ]
// [ 'height', '1.88' ]
// { name: 'hzy', age: '18', height: '1.88' }
- trimStart: 去除字符串左侧空格
- trimEnd: 去除字符串右侧空格
js
const message = " Hello World "
console.log(message.trim())
console.log(message.trimStart())
console.log(message.trimEnd())
// Hello World
// Hello World
// Hello World
3. es11
- BigInt: 大整数
js
// ES11之前 max_safe_integer
const maxInt = Number.MAX_SAFE_INTEGER
console.log(maxInt) // 9007199254740991
console.log(maxInt + 1)
console.log(maxInt + 2)
// ES11之后: BigInt
const bigInt = 900719925474099100n
console.log(bigInt + 10n)
const num = 100
console.log(bigInt + BigInt(num))
const smallNum = Number(bigInt)
console.log(smallNum)
// 9007199254740991
// 9007199254740992
// 9007199254740992
// 900719925474099110n
// 900719925474099200n
// 900719925474099100
- Nullish Coalescing Operator: 空值合并运算符
js
// ES11: 空值合并运算 ??
const foo = undefined
// const bar = foo || "default value"
const bar = foo ?? "defualt value"
console.log(bar)
// ts 是 js 的超级
// defualt value
- Optional Chaining: 可选链
js
const info = {
name: "hzy",
// friend: {
// girlFriend: {
// name: "hmm"
// }
// }
}
// console.log(info.friend.girlFriend.name)
// if (info && info.friend && info.friend.girlFriend) {
// console.log(info.friend.girlFriend.name)
// }
// ES11提供了可选链(Optional Chainling)
console.log(info.friend?.girlFriend?.name)
console.log('其他的代码逻辑')
// undefined
// 其他的代码逻辑
- 获取全局对象globalThis: globalThis
js
// 获取某一个环境下的全局对象(Global Object)
// 在浏览器下
// console.log(window)
// console.log(this)
// 在node下
// console.log(global)
// ES11
console.log(globalThis)
- 遍历对象标准方法: for-in
js
// for...in 标准化: ECMA
const obj = {
name: "why",
age: 18
}
for (const item in obj) {
console.log(item)
}
// name
// age
4. es12
- Promise.any: 只要有一个promise成功就返回
- Promise.allSettled: 等待所有promise完成,不管成功还是失败
- String.prototype.replaceAll: 替换所有
- 数值分隔符: 100_000_000
- finalizationRegistry: 垃圾回收机制
js
// ES12: FinalizationRegistry类
const finalRegistry = new FinalizationRegistry((value) => {
console.log("注册在finalRegistry的对象, 某一个被销毁", value)
})
let obj = { name: "hzy" }
let info = { age: 18 }
finalRegistry.register(obj, "obj")
finalRegistry.register(info, "value")
obj = null
info = null
// 对象被GC销毁时候, 执行回调函数,
- WeakRef: 弱引用
js
// ES12: WeakRef类
// WeakRef.prototype.deref:
// > 如果原对象没有销毁, 那么可以获取到原对象
// > 如果原对象已经销毁, 那么获取到的是undefined
const finalRegistry = new FinalizationRegistry((value) => {
console.log("注册在finalRegistry的对象, 某一个被销毁", value)
})
let obj = { name: "hzy" }
let info = new WeakRef(obj)
finalRegistry.register(obj, "obj")
obj = null
setTimeout(() => {
console.log(info.deref()?.name)
console.log(info.deref() && info.deref().name)
}, 10000)
// 垃圾回收机制: 回收一些没有被引用的对象, 执行回调函数
- logical assign operator: 逻辑赋值运算符
js
// 1.||= 逻辑或赋值运算
// let message = "hello world"
// message = message || "default value"
// message ||= "default value"
// console.log(message)
// 2.&&= 逻辑与赋值运算
// &&
// const obj = {
// name: "hzy",
// foo: function() {
// console.log("foo函数被调用")
// }
// }
// obj.foo && obj.foo()
// &&=
// let info = {
// name: "hzy"
// }
// // 1.判断info
// // 2.有值的情况下, 取出info.name
// // info = info && info.name
// info &&= info.name
// console.log(info)
// 3.??= 逻辑空赋值运算
let message = 0
message ??= "default value"
console.log(message)