蓝桥杯ES6及常用API解析
一、ES6核心特性
1. let与const示例
for(let i = 0; i < 5; i++) {
setTimeout(() => console.log(i), 100);
}
let i = 0:使用let声明循环变量i,具有块级作用域
i < 5:循环条件判断
i++:每次循环后i自增1
setTimeout(() => console.log(i), 100):设置100ms后打印i的值。由于let的块级作用域,每个i都是独立的
const PI = 3.1415;
const PI = 3.1415:声明一个不可变的常量PI
PI = 3:尝试修改常量会导致报错(注释掉了)
2. 箭头函数示例
const sum = (a, b) => a + b;
- 定义箭头函数sum,接收参数a和b,返回a+b的结果
const obj = {
value: 10,
getValue: function() {
setTimeout(() => {
console.log(this.value);
}, 100);
}
};
value: 10:定义对象属性
getValue: function():定义对象方法
setTimeout(() => {...}, 100):箭头函数继承外层getValue方法的this
console.log(this.value):输出obj.value的值10
3. 模板字符串示例
const name = "蓝桥杯";
console.log(`欢迎参加${name}竞赛!`);
const name = "蓝桥杯":定义字符串变量
`欢迎参加${name}竞赛!`:使用模板字符串插入变量
const html = `
<div>
<h1>标题</h1>
</div>
`;
4. 解构赋值示例
const [first, second] = [1, 2, 3];
- 将数组[1,2,3]的第一个元素赋值给first,第二个给second
const { name, age } = { name: "Alice", age: 20 };
- 从右侧对象中提取name和age属性赋值给同名变量
function greet({name, age}) {
return `你好,${name},你今年${age}岁!`;
}
5. 扩展运算符示例
const arr1 = [1, 2];
const arr2 = [...arr1, 3, 4];
...arr1:将arr1数组展开为1,2
- 合并成新数组[1,2,3,4]
const obj1 = { a: 1 };
const obj2 = { ...obj1, b: 2 };
...obj1:展开obj1的属性
- 合并成新对象{a:1,b:2}
6. Promise与异步示例
const fetchData = () => {
return new Promise((resolve, reject) => {
setTimeout(() => resolve("数据加载成功"), 1000);
});
};
- 创建Promise对象
setTimeout模拟异步操作
- 1秒后调用resolve返回成功结果
fetchData().then(data => console.log(data));
- 调用fetchData()
- then处理成功结果,打印返回的数据
async function getData() {
const data = await fetchData();
console.log(data);
}
- async声明异步函数
- await等待Promise解析完成
- 获取数据后打印
二、常用数组API
1. 高阶函数示例
const nums = [1, 2, 3, 4];
const doubled = nums.map(x => x * 2);
- map遍历数组,对每个元素x执行x*2
- 返回新数组[2,4,6,8]
const evens = nums.filter(x => x % 2 === 0);
- filter筛选数组中满足x%2===0的元素
- 返回新数组[2,4]
const sum = nums.reduce((acc, cur) => acc + cur, 0);
- reduce累加数组元素
- acc是累加器,cur是当前值
- 初始值为0
- 返回总和10
2. 其他实用方法示例
const firstEven = nums.find(x => x % 2 === 0);
- find查找第一个满足条件的元素
- 返回第一个偶数2
const hasEven = nums.some(x => x % 2 === 0);
const allEven = nums.every(x => x % 2 === 0);
- some检查是否有元素满足条件
- every检查是否所有元素满足条件
const nested = [1, [2, 3], [4, [5]]];
const flat = nested.flat(2);
- flat扁平化数组
- 参数2表示扁平化两层嵌套
- 返回[1,2,3,4,5]
三、字符串API示例
const str = "蓝桥杯竞赛";
console.log(str.includes("蓝桥"));
console.log(str.startsWith("蓝"));
console.log("ha".repeat(3));
console.log("5".padStart(2, "0"));
四、对象API示例
const obj = { a: 1, b: 2 };
console.log(Object.keys(obj));
console.log(Object.values(obj));
console.log(Object.entries(obj));
const newObj = Object.assign({}, obj, { c: 3 });
- 合并多个对象属性到第一个参数对象
- 返回新对象{a:1,b:2,c:3}
五、Set与Map示例
const set = new Set([1, 2, 2, 3]);
console.log([...set]);
const map = new Map();
map.set("name", "蓝桥杯");
console.log(map.get("name"));
- 创建Map实例
- set方法添加键值对
- get方法获取键对应的值
六、实战练习题解析
const unique = arr => arr.reduce((acc, cur) =>
acc.includes(cur) ? acc : [...acc, cur], []);
- reduce遍历数组
- acc是结果数组,cur是当前元素
- 如果acc包含cur则保持acc不变,否则将cur加入acc
- 初始值为空数组
function promiseAll(promises) {
return new Promise((resolve, reject) => {
let results = [];
let completed = 0;
promises.forEach((promise, i) => {
promise.then(result => {
results[i] = result;
completed++;
if(completed === promises.length) resolve(results);
}).catch(reject);
});
});
}
- 返回新Promise
- results保存所有promise的结果
- completed计数完成的promise数量
- 遍历promises数组,处理每个promise
- 当所有promise完成时resolve结果数组
- 任意promise失败则reject整个Promise