JS:ES8新特性

概述:

1、async 和 await两种语法结合简化异步函数的写法;让异步代码看起来像同步代码一样;

2、对象方法扩展:Object.values、Object.entries和Object.getOwnPropertyDescriptors;

async 函数:

        1. async 函数的返回值为 promise 对象;
        2. promise 对象的结果由 async 函数执行的返回值决定;

代码示例:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>async函数</title>
</head>
<body>
<script>
// async函数:异步函数
async function fn(){
// return 123; // 返回普通数据
// 若报错,则返回的Promise对象也是错误的
// throw new Error("出错啦!");
// 若返回的是Promise对象,那么返回的结果就是Promise对象的结果
return new Promise((resolve,reject)=>{
// resolve("成功啦!");
reject("失败啦!");
})
} c
onst result = fn();
// console.log(result); // 返回的结果是一个Promise对象
// 调用then方法
result.then(value => {
console.log(value);
},reason => {
console.warn(reason);
});
</script>
</body>
</html>

await 表达式:
        1. await 必须写在 async 函数中;
        2. await 右侧的表达式一般为 promise 对象;
        3. await 返回的是 promise 成功的值;
        4. await 的 promise 失败了, 就会抛出异常, 需要通过 try...catch 捕获处理;
代码示例:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>await表达式</title>
</head>
<body>
<script>
// async函数 + await表达式:异步函数
// 创建Prmise对象
const p = new Promise((resolve,reject)=>{
resolve("成功啦!");
})
async function fn(){
// await 返回的是 promise 成功的值
let result = await p;
console.log(result); // 成功啦!
} f
n();
</script>
</body>
</html>

async 和 await 读取文件案例:

// 导入模块
const fs = require("fs");
// 读取
function readText() {
return new Promise((resolve, reject) => {
fs.readFile("../resources/text.txt", (err, data) => {
//如果失败
if (err) reject(err);
//如果成功
resolve(data);
})
})
} f
unction readTest1() {
return new Promise((resolve, reject) => {
fs.readFile("../resources/test1.txt", (err, data) => {
//如果失败
if (err) reject(err);
//如果成功
resolve(data);
})
})
} f
unction readTest2() {
return new Promise((resolve, reject) => {
fs.readFile("../resources/test2.txt", (err, data) => {
//如果失败
if (err) reject(err);
//如果成功
resolve(data);
})
})
} /
/声明一个 async 函数
async function main(){
//获取为学内容
let t0 = await readText();
//获取插秧诗内容
let t1 = await readTest1();
// 获取观书有感
let t2 = await readTest2();
console.log(t0.toString());
console.log(t1.toString());
console.log(t2.toString());
}
main();

async 和 await 结合发送ajax请求:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>async 和 await 结合发送ajax请求</title>
</head>
<body>
<script>
// async 和 await 结合发送ajax请求
function sendAjax(url){
return new Promise((resolve,reject)=>{
// 1、创建对象
const x = new XMLHttpRequest();
// 2、初始化
x.open("GET",url);
// 3、发送
x.send();
// 4、事件绑定
x.onreadystatechange = function(){
if(x.readyState == 4){
if(x.status>=200 && x.status<=299){
// 成功
resolve(x.response);
}else{
// 失败
reject(x.status);
}
}
}
});
} 
// 测试
// const result = sendAjax("https://api.apiopen.top/getJoke");
// result.then(value=>{
// console.log(value);
// },reason=>{
// console.warn(reason);
// })
// 使用async和await
async function main(){
let result = await sendAjax("https://api.apiopen.top/getJoke");
console.log(result);
} 
main();
</script>
</body>
</html>

对象方法扩展:
        1. Object.values()方法:返回一个给定对象的所有可枚举属性值的数组;
        2. Object.entries()方法:返回一个给定对象自身可遍历属性 [key,value] 的数组;
        3. Object.getOwnPropertyDescriptors()该方法:返回指定对象所有自身属性的描述对象;
代码示例:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>对象方法扩展</title>
</head>
<body>
<script>
// 对象方法扩展
let school = {
name : "张三",
age : 21,
sex : "男"
} 
// 获取对象所有的键
console.log(Object.keys(school));
// 获取对象所有的值
console.log(Object.values(school));
// 获取对象的entries
console.log(Object.entries(school));
// 创建map
const map = new Map(Object.entries(school));
console.log(map);
console.log(map.get("name"));
// 返回指定对象所有自身属性的描述对象
console.log(Object.getOwnPropertyDescriptors(school));
// 参考内容:
const obj = Object.create(null,{
name : {
// 设置值
value : "张三",
// 属性特性
writable : true,
configuration : true,
enumerable : true
}
});
</script>
</body>
</html>




 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ES8ECMAScript 2017)引入了一些新的语言特性,下面是其中一些主要的特性,并举例说明: 1. 字符串填充方法:ES8引入了字符串的`padStart`和`padEnd`方法,用于在字符串的开头或结尾插入指定的字符,以达到指定的长度。 ```javascript const str = 'Hello'; console.log(str.padStart(10, 'x')); // Output: "xxxxHello" console.log(str.padEnd(10, 'x')); // Output: "Helloxxxxx" ``` 2. 异步函数:ES8引入了`async/await`关键字,用于简化使用Promise处理异步操作的代码。`async`关键字用于定义一个异步函数,而`await`关键字用于暂停异步函数的执行,等待一个Promise解析为结果。 ```javascript function delay(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } async function greet() { await delay(2000); // 等待2秒 console.log('Hello, world!'); } greet(); // 输出: "Hello, world!"(在等待2秒后) ``` 3. 共享内存和原子操作:ES8引入了`SharedArrayBuffer`和`Atomics`对象,用于支持共享内存并进行原子操作。这允许多个线程在共享内存上进行并发操作。 这里没有具体的示例代码,因为共享内存和原子操作是高级主题,需要在特定环境中使用。 4. 正则表达式命名捕获组:ES8允许给正则表达式的捕获组命名,以便更方便地引用和提取匹配的结果。 ```javascript const regex = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/; const match = regex.exec('2022-01-01'); console.log(match.groups.year); // Output: "2022" console.log(match.groups.month); // Output: "01" console.log(match.groups.day); // Output: "01" ``` 5. Object.getOwnPropertyDescriptors:这个静态方法返回一个对象的所有自身属性的描述符。这样可以更方便地获取对象属性的详细信息。 ```javascript const obj = { name: 'Alice', age: 25 }; const descriptors = Object.getOwnPropertyDescriptors(obj); console.log(descriptors.name); // Output: { value: 'Alice', writable: true, enumerable: true, configurable: true } console.log(descriptors.age); // Output: { value: 25, writable: true, enumerable: true, configurable: true } ``` 这些是ES8引入的一些新特性,它们为开发者提供了更方便、更强大的编程工具,并进一步改善了JavaScript语言的功能和性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白目

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值