includes?
fromIndex 可选, 从fromIndex 索引处开始查找 valueToFind 。如果为负值(即从末尾开始往前跳 fromIndex 的绝对值个索引,然后往后搜寻)。默认为 0。
arr.includes(valueToFind,[fromIndex])
想求2的10次方
console.log(Math.pow(2, 10)); // 1024
//或者
console.log(2 ** 10); // 1024
Object.getOwnPropertyDescriptors()
方法用来获取一个对象的所有自身属性的描述符。
const obj = {
name: "jimmy",
age: 18,
};
const desc = Object.getOwnPropertyDescriptors(obj);
console.log(desc);
// 打印结果
{
name: {
value: 'jimmy',
writable: true,
enumerable: true,
configurable: true
},
age: {
value: 18,
writable: true,
enumerable: true,
configurable: true
}
}
那这些对象的属性我们怎么设置和修改他们呢,我们可以使用es5的?Object.defineProperty() ?
const obj = {};
Object.defineProperty(obj, "name", {
value: "jimmy",
writable: true,
configurable: true,
enumerable: true,
});
Object.defineProperty(obj, "age", {
value: 34,
writable: true,
configurable: true,
enumerable: true,
});
console.log(obj); // { name: 'jimmy', age: 34 }
复制代码
padStart把指定字符串填充到字符串头部,返回新字符串。
'abc'.padStart(10); // " abc"
'abc'.padStart(10, "foo"); // "foofoofabc"
'abc'.padStart(6,"123465"); // "123abc"
'abc'.padStart(8, "0"); // "00000abc"
'abc'.padStart(1); // "abc"
应用场景 :日期格式化:yyyy-mm-dd的格式
const now = new Date()
const year = now.getFullYear()
// 月份和日期 如果是一位前面给它填充一个0
const month = (now.getMonth() + 1).toString().padStart(2, '0')
const day = (now.getDate()).toString().padStart(2, '0')
console.log(year, month, day)
console.log( `${year}-${month}-${day}` ) //输入今天的日期 2021-12-31
数字替换(手机号,银行卡号等)
const tel = '18781268679'
const newTel = tel.slice(-4).padStart(tel.length, '*')
console.log(newTel) // *******5678
padEnd?把指定字符串填充到字符串尾部,返回新字符串(语法同上)
'abc'.padEnd(10); // "abc "
'abc'.padEnd(10, "foo"); // "abcfoofoof"
'abc'.padEnd(6, "123456"); // "abc123"
'abc'.padEnd(1); // "abc"
ES8 允许函数的最后一个参数有尾逗号
async/await
async? 标记函数为异步函数(返回Promise)
await? ?必需在async标记的函数里面执行,await标记的函数执行完才向下执行(reslove)
await后面的Promise对象不必写then,因为await的作用之一就是获取后面Promise对象成功状态传递出来的参数
function fn(){
return new Promise(resolve=>{//不加Promise不生效
setTimeout(()=>{
console.log(111)
resolve()//调用resolve后才会向下执行(执行fn2),向下执行的关键节点
},3000)
})
}
function fn2(){
setTimeout(()=>console.log(222),2000)
}
async function fn3(){//标记函数为异步函数
await fn()
fn2()
}
fn3()
//输出结果:3s后输入111 2s后输出222
for-await-of
异步迭代器(for-await-of):循环等待每个Promise对象变为resolved状态才进入下一步。
for...of 是同步的
function TimeOut(time) {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve(time)
}, time)
})
}
async function test() {
let arr = [TimeOut(2000), TimeOut(1000), TimeOut(3000)]
for await (let item of arr) {
console.log(Date.now(), item)
}
}
test()
// 1560092345730 2000
// 1560092345730 1000
// 1560092346336 3000
Array.prototype.flat()
let newArray = arr.flat([depth])
flat() ??方法会按照一个可指定的深度递归遍历数组,并将所有元素合并为一个新数组返回。
const arr1 = [0, 1, 2, [3, 4]];
console.log(arr1.flat()); // [0, 1, 2, 3, 4]
const arr2 = [0, 1, 2, [[[3, 4]]]];
console.log(arr2.flat(2)); // [0, 1, 2, [3, 4]]
//使用 Infinity,可展开任意深度的嵌套数组
var arr4 = [1, 2, [3, 4, [5, 6, [7, 8, [9, 10]]]]];
arr4.flat(Infinity); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
// `flat()` 方法会移除数组中的空项:
var arr5 = [1, 2, , 4, 5];
arr5.flat(); // [1, 2, 4, 5]
?Array.prototype.flatMap()
先map? 后 flat (深度为1)
var new_array = arr.flatMap(function callback(currentValue, index, array) {
// 返回新数组的元素
}[, thisArg])
对比map 和flatMap
const numbers = [1, 2, 3]
numbers.map(x => [x * 2]) // [[2], [4], [6]]
numbers.flatMap(x => [x * 2]) // [2, 4, 6] map后执行flat了
let arr = ['今天天气不错', '', '早上好']
arr.map(s => s.split(''))
// [["今", "天", "天", "气", "不", "错"],[""],["早", "上", "好"]]
arr.flatMap(s => s.split(''))
// ["今", "天", "天", "气", "不", "错", "", "早", "上", "好"]
String.prototype.trimStart() / String.prototype.trimEnd()
trimStart() 方法从字符串的开头删除空格,trimLeft()是此方法的别名。
let str = ' foo '
console.log(str.length) // 8
str = str.trimStart() // 或str.trimLeft()
console.log(str.length) // 5
trimEnd() 方法从一个字符串的右端移除空白字符,trimRight 是 trimEnd 的别名。
异常捕获
//ES10以前捕获异常
try {
// tryCode
} catch (err) {
// catchCode
}
//ES10之后,可以省略 err参数
try {
console.log('Foobar')
} catch {
console.error('Bar')
}
验证参数是否为json格式
const validJSON = json => {
try {
JSON.parse(json)
return true
} catch {
return false
}
}
globalThis
globalThis ?提供了一个标准的方式来获取不同环境下的全局?this ? 对象(也就是全局对象自身)
Promise.allSettled()
Promise.all() 具有并发执行异步任务的能力。但如果其中某个任务出现异常(reject),所有任务都会挂掉,Promise直接进入reject 状态。
Promise.allSettled: 并发任务中,无论一个任务正常或者异常,都会全部返回对应的的状态
逻辑运算符和赋值表达式(&&=,||=,??=)
x &&= y
//等价于
x && (x = y);
x ||= y
//等价于
x || (x = y);
x ??= y
//等价于
x ?? (x = y);
//仅在x为null或undefined时。对x进行赋值
数字分隔符
欧美语言中,较长的数值允许每三位添加一个分隔符(通常是一个逗号),增加数值的可读性。比如,1000 可以写作1,000 。
ES2021 中允许 JavaScript 的数值使用下划线(_ )作为分隔符
let a= 1_000;
a=== 1000 // true
但JS中没有明确的位数,可以每三位添加一个分隔符,也可以每一位、每两位、每四位
123_00 === 12_300 // true
12345_00 === 123_4500 // true
12345_00 === 1_234_500 // true
// 全部报错
3_.141
3._141
1_e12
1e_12
123__456
_1464301
1464301_
|