ES6语法详解+面试必备

ES6(ECMAScript 2015)是JavaScript的一个版本,它于2015年发布。ES6引入了很多新的语法和功能,使得JavaScript更加强大、灵活和易于使用。

一、块级作用域:

ES6引入了let和const关键字,可以在块级作用域中声明变量,解决了以前使用var声明变量可能导致的问题。在ES6之前,JavaScript中的变量声明使用var关键字,它具有函数作用域而不是块级作用域。这意味着使用var声明的变量可以在其所在的函数内部任何位置访问,而不仅仅是在声明的块级作用域内。

1、let关键字:

let关键字用于声明可变的变量,它的作用范围限定在当前的块级作用域内,包括花括号({})内部的任何代码块。在同一个作用域内,不能重复声明同名的let变量。

function example() {if (true) {let x = 10; // 声明一个块级作用域内的变量xconsole.log(x); // 输出 10}console.log(x); // 报错,x未定义
}example();
2、const关键字:

const关键字用于声明常量,它的作用范围也是在当前的块级作用域内。与let不同,const声明的变量是不可变的,即不能被重新赋值。同时,const声明的变量必须在声明时进行初始化,且不能再次修改其值

function example() {const PI = 3.14159; // 声明一个常量PIconsole.log(PI); // 输出 3.14159PI = 3.14; // 报错,常量不能被重新赋值
}example();
二、箭头函数

ES6引入了箭头函数=>语法,简化了函数的定义和使用

1、箭头函数可以简化的函数定义
// 传统函数定义
function add(a, b) {return a + b;
}// 箭头函数定义
const add = (a, b) => a + b;
2、隐式返回值

指箭头函数中省略了return关键字,并且直接返回一个表达式的值。这意味着箭头函数可以在一行代码中完成函数体的定义和返回值的指定

// 传统函数定义
function multiply(a, b) {return a * b;
}// 箭头函数定义
const multiply = (a, b) => a * b;//箭头函数中省略了return关键字,并且直接返回了a * b的结果。这就是隐式返回值的概念

需要注意的是,隐式返回值只适用于一行代码的情况。如果函数体有多行代码或者需要进行复杂的逻辑处理,仍然需要使用传统的函数定义并显式地使用return关键字。 

const calculate = (a, b) => {if (a > b) {return a - b;} else {return b - a;}
};

在上述示例中,根据条件判断使用了显式返回值(使用return关键字),而在其他情况下则使用了隐式返回值。这样可以兼顾简洁性和灵活性。 

3、使用箭头函数作为回调函数

在JavaScript中,回调函数是指作为参数传递给其他函数的函数。在某些情况下,我们需要在回调函数中定义一些简单的逻辑来处理数据或完成一些操作。使用箭头函数作为回调函数可以使代码更加简洁,提高开发效率。

const numbers = [1, 2, 3, 4, 5];// 传统函数定义
//map()方法用于对数组中的每个元素进行处理,并返回一个新的数组
const square = numbers.map(function (number) {return number * number;
});
//在传统的函数定义中,我们需要使用function关键字,同时需要使用return关键字来指定返回值。// 箭头函数定义
const square = numbers.map((number) => number * number);
//在箭头函数中,由于只有一行代码,我们可以使用隐式返回值的方式来简化函数定义和返回值的指定。

需要注意的是,在使用箭头函数作为回调函数时,要根据具体的情况来考虑是否需要使用括号来包裹参数。如果只有一个参数,可以省略括号,但如果没有参数或者有多个参数,则需要使用括号。 

4、使用箭头函数绑定外部this值

箭头函数可以绑定外部 this 值,这是因为箭头函数没有自己的 this 上下文。箭头函数的 this 值继承了它所在上下文的 this 值。当我们在箭头函数中使用 this 时,它指向的就是箭头函数所在的上下文中的 this 值。

export default {data() {return {message: 'Hello, World!'}},mounted() {setTimeout(() => {console.log(this.message) // 输出:Hello, World!}, 1000)}
}

在上述代码中,我们在组件的 mounted 钩子函数中使用了一个 setTimeout 函数,该函数中包含一个箭头函数作为回调函数。由于箭头函数继承了它所在上下文的 this 值,因此在箭头函数中我们可以访问到组件实例的 this 值。 

三、模板字符串

在ES6中,模板字符串是一种特殊的字符串语法,使用反引号(`)来包裹字符串内容。它允许在字符串中插入表达式,并且支持多行字符串的定义,提供了更加灵活和方便的字符串处理方式。

1、字符串插值

使用${}语法,在模板字符串中嵌入表达式或变量。这样可以方便地将变量的值插入到字符串中

const name = 'SHANDONG';
const message = `Hello, ${name}!`;
console.log(message); // 输出:Hello, SHANDONG!
2、多行字符串

使用模板字符串可以方便地定义多行字符串,而无需使用\n进行换行操作

const multiline = `This isa multilinestring.
`;
console.log(multiline);
// 输出:
//   This is
//   a multiline
//   string.
3、嵌套使用

模板字符串可以嵌套使用,可以在一个模板字符串中插入另一个模板字符串

const name = 'Alice';
const message = `Hello, ${`Welcome, ${name}!`} How are you?`;
console.log(message); // 输出:Hello, Welcome, Alice! How are you?

总而言之,ES6中的模板字符串提供了一种更加灵活和方便的字符串处理方式。它支持字符串插值,在字符串中嵌入表达式或变量;支持定义多行字符串,无需使用\n进行换行;还可以嵌套使用,将一个模板字符串插入到另一个模板字符串中。这些特性使得模板字符串在处理复杂字符串逻辑时更加简洁和直观。

四、解构赋值

一种特殊的赋值语法,可以方便地将数组或对象中的值解构到变量中;

这样可以简化变量的声明和赋值操作,提高代码的可读性和可维护性。

1、数组解构

使用数组解构可以将数组中的元素解构到变量中。解构时需要使用方括号([])来包裹变量名

const numbers = [1, 2, 3, 4];
const [a, b, c, d] = numbers;
console.log(a, b, c, d); // 输出:1 2 3 4

在上面的例子中,数组中的第一个元素被解构到变量a中,第二个元素被解构到变量b中,以此类推。如果数组中的元素数量少于变量数量,未被解构的变量将会是undefined

const numbers = [1, 2, 3];
const [a, b, c, d] = numbers;
console.log(a, b, c, d); // 输出:1 2 3 undefined
2、对象解构

使用对象解构可以将对象中的属性解构到变量中。解构时需要使用花括号({})来包裹变量名,并且变量名要与对象属性名相同

const person = { name: 'asd', age: 20 };
const { name, age } = person;
console.log(name, age); // 输出:asd 20

在上面的例子中,对象中的name属性被解构到变量name中,age属性被解构到变量age中。如果对象中没有对应的属性,变量将会是undefined

const person = { name: 'asd', age: 20 };
const { name, age,sex } = person;
console.log(name, age,sex); // 输出:asd 20 undefined
3、默认值

可以为解构赋值设置默认值,当变量未被解构时将会使用默认值。

const numbers = [1, 2];
const [a, b, c = 3] = numbers;
console.log(a, b, c); // 输出:1 2 3

在上面的例子中,变量c设置了默认值为3。由于数组中只有两个元素,变量c未被解构,因此使用了默认值。

4、剩余操作符

可以使用剩余操作符(...)将剩余的数组元素或对象属性解构到一个新的数组或对象中。

const numbers = [1, 2, 3, 4];
const [a, b, ...rest] = numbers;
console.log(a, b, rest); // 输出:1 2 [3, 4]const person = { name: 'Alice', age: 20, gender: 'female' };
const { name, ...rest } = person;
console.log(name, rest); // 输出:Alice { age: 20, gender: 'female' }

在上面的例子中,使用剩余操作符可以将剩余的数组元素或对象属性解构到一个新的数组或对象中。在数组解构中,剩余操作符需要放在最后;在对象解构中,剩余操作符可以放在任意位置。

五、默认参数

在ES6中,可以为函数的参数设置默认值,这样在函数调用时,如果没有传递该参数或传递的值为undefined,就会使用默认值。这样可以简化函数的调用,避免出现undefined的情况。

1、设置默认值

在函数定义时,可以通过赋值运算符(=)来为参数设置默认值。

function greet(name = 'Guest') {console.log(`Hello, ${name}!`);
}greet(); // 输出:Hello, Guest!
greet('Alice'); // 输出:Hello, Alice!

在上面的例子中,greet函数的name参数设置了默认值为'Guest'。当没有传递参数或传递的参数为undefined时,将会使用默认值

2、默认值表达式
function multiply(a, b = 2 * a) {return a * b;
}console.log(multiply(5)); // 输出:50
console.log(multiply(5,2)); // 输出:10

在上面的例子中,multiply函数的b参数设置了默认值为2 * a。当没有传递第二个参数时,将会使用默认值,计算结果为b=5 * 2 = 10,a*b=5*10=50;当传递第二个参数,就会直接计算a*b=5 * 2 = 10

3、默认参数对arguments对象的影响

使用默认参数不会影响arguments对象的长度

function sum(a, b = 0) {console.log(arguments.length);return a + b;
}console.log(sum(1)); // 输出:1,返回:1
console.log(sum(1, 2)); // 输出:2,返回:3

sum函数的b参数设置了默认值为0。即使没有传递第二个参数,arguments对象的长度仍然是1。

需要注意的是,默认参数的作用域是函数内部,而不是全局作用域。这意味着默认参数可以访问函数体内的其他变量和参数,但不能访问函数外部的变量。

六、Promise

Promise 是一种用于处理异步操作的对象。它可以将异步操作封装成一个 Promise 对象,通过 then() 方法来添加回调函数,当异步操作完成时自动执行回调函数。

function delay(ms) {return new Promise(resolve => setTimeout(resolve, ms));
}delay(1000).then(() => console.log('1 秒后输出该信息'));

在上面的例子中,定义了一个 delay() 函数,该函数返回一个 Promise 对象。该 Promise 对象会在指定的时间间隔之后自动执行 resolve() 方法,从而触发 then() 方法中设置的回调函数。使用 Promise 对象可以使异步操作的代码更加清晰、简洁,并且可以避免回调地狱的问题。

Promise 对象还提供了一些其他的方法,例如 catch() 方法可以捕获异步操作中的异常,并且可以通过 Promise.all() 方法来并行处理多个异步操作。

const promise1 = Promise.resolve(1);
const promise2 = Promise.resolve(2);
const promise3 = new Promise((resolve, reject) => {setTimeout(resolve, 1000, '3 秒后输出该信息');
});Promise.all([promise1, promise2, promise3]).then(values => {console.log(values); // 输出:[1, 2, "3 秒后输出该信息"]
});

在上面的例子中,我们通过 Promise.resolve() 方法来创建了两个 Promise 对象,并且通过 new Promise() 方法创建了一个延时执行的 Promise 对象。我们将三个 Promise 对象放入了一个数组中,并且使用 Promise.all() 方法来并行处理这些异步操作。当所有异步操作都完成时,then() 方法中设置的回调函数将会被自动执行。

总的来说,平时使用,

jiekouming().then((res)=>{

console.log(res)

})

七、简化对象字面量的语法

ES6 简化对象字面量的语法主要包括两个方面的改进:属性名和方法名的简写、计算属性名。

1、属性名和方法名的简写

在 ES6 之前,如果我们需要将一个变量作为对象的属性名,通常需要使用计算属性名。例如:

const obj = {[propName]: 'value'
};

在 ES6 中,我们可以使用属性名和方法名的简写来更加方便地创建对象。

const name = 'John';
const age = 20;const obj = {name,age,sayHi() {console.log(`Hi, my name is ${this.name}, I'm ${this.age} years old.`);}
};obj.sayHi(); // 输出:Hi, my name is John, I'm 20 years old.

在上面的例子中,我们使用了属性名和方法名的简写语法,将变量 nameage 直接作为了对象的属性名。同时,我们也定义了一个 sayHi() 方法,并且在对象初始化时直接将其作为了一个属性。

2、计算属性名

ES6 提供了计算属性名的语法,允许我们在对象字面量中使用表达式来作为属性名。

const propName = 'size';const obj = {[propName + 'Label']: 'Size',['get' + propName]() {return this[propName];},set [propName](value) {this._size = value;},get [propName]() {return this._size;}
};console.log(obj.sizeLabel); // 输出:Sizeobj.size = 10;
console.log(obj.getSize()); // 输出:10

在上面的例子中,我们在对象字面量中使用了计算属性名的语法,将变量 propName 和字符串 'Label' 进行了拼接,并且作为了一个属性名。同时,我们也定义了一个计算属性 size,并且使用 getset 关键字来定义了该属性的读取和修改方法。

八、扩展运算符

ES6 中的扩展运算符用三个连续的点 ... 表示,主要用于将一个可迭代对象(如数组、字符串或类数组对象)展开成多个元素

1、数组的展开
const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];const combinedArray = [...arr1, ...arr2];
console.log(combinedArray); // 输出:[1, 2, 3, 4, 5, 6]

在上面的例子中,我们使用扩展运算符将两个数组 arr1arr2 展开,并且合并成一个新的数组 combinedArray

2、字符串的展开
const str = 'hello';
const chars = [...str];console.log(chars); // 输出:['h', 'e', 'l', 'l', 'o']

在上面的例子中,我们使用扩展运算符将字符串 str 展开成一个字符数组 chars,每个字符都成为了数组的一个元素。 

3、函数的参数传递
function sum(a, b, c) {return a + b + c;
}const numbers = [1, 2, 3];
const result = sum(...numbers);console.log(result); // 输出:6

 在上面的例子中,我们定义了一个求和函数 sum(),并且使用扩展运算符将数组 numbers 的元素作为函数的参数进行传递。

4、对象的展开
const obj1 = { foo: 'bar' };
const obj2 = { baz: 'qux' };const mergedObj = { ...obj1, ...obj2 };
console.log(mergedObj); // 输出:{ foo: 'bar', baz: 'qux' }

在上面的例子中,我们使用扩展运算符将两个对象 obj1obj2 的属性展开,并且合并成一个新的对象 mergedObj

扩展运算符不仅可以用于数组、字符串、对象的展开,还可以用于函数调用时的参数展开等场景,能够让我们更方便地处理和操作数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/615736.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IP定位技术:如何保护患者的隐私和医疗数据安全?

随着科技的飞速发展,互联网已经深入到我们生活的方方面面,医疗行业也不例外。然而,这也带来了网络安全问题。如何保护患者的隐私和医疗数据的安全,成为了医疗行业面临的重大挑战。IP定位技术的应用,为解决这一问题提供…

Unity中URP下抓屏的 开启 和 使用

文章目录 前言一、抓屏开启1、Unity下开启抓屏2、Shader中开启抓屏 二、抓屏使用1、设置为半透明渲染队列,关闭深度写入2、申明纹理和采样器3、在片元着色器使用请添加图片描述 三、测试代码 前言 我们在这篇文章中看一下,URP下怎么开启抓屏。 一、抓屏…

(代码模板)JAVA_返回类R

个人留存用,通用返回类R代码模板: import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data;import java.io.Serializable; import java.util.HashMap; import java.util.Map;/*** author &#…

《共建开源》系列:Airtest-Framework - UI自动化框架系统

Airtest- Framework 平台简介 Airtest- Framework 是 基于 unittest、Flask、Airtest 搭建的 开源的 UI 自动化框架系统 提供 HTTP API 接口,实现自动解析包名并自动执行 相应目录下的 Case。目前仅支持单台设备连接。多个任务会自动排队处理。 系统要求 Pytho…

【动态规划】【二分查找】C++算法 466 统计重复个数

作者推荐 【动态规划】458:可怜的小猪 涉及知识点 动态规划 二分查找 力扣:466 统计重复个数 定义 str [s, n] 表示 str 由 n 个字符串 s 连接构成。 例如,str [“abc”, 3] “abcabcabc” 。 如果可以从 s2 中删除某些字符使其变为 s1,则称字符串…

互信息法的原理详解

文章目录 互信息法(上)互信息是什么从信息增益角度理解互信息从变量分布一致角度理解互信息 卡方检验与离散变量的互信息法 互信息法(上) 尽管f_regression巧妙的构建了一个F统计量,并借此成功的借助假设检验来判断变…

跨境商城系统如何开发代购商城、国际物流、一件代发等功能?

跨境商城系统的开发涉及到多个方面,其中代购商城、国际物流和一件代发等功能是其中的重要组成部分。本文将详细介绍如何开发这些功能,以帮助跨境商城系统更好地满足市场需求。 一、代购商城的开发 代购商城是跨境商城系统中的重要功能之一,它…

互联网加竞赛 基于大数据的股票量化分析与股价预测系统

文章目录 0 前言1 课题背景2 实现效果3 设计原理QTChartsarma模型预测K-means聚类算法算法实现关键问题说明 4 部分核心代码5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于大数据的股票量化分析与股价预测系统 该项目较为新颖…

小程序基础学习(导航栏组件)

目标:把导航栏抽离成组件,

oracle 19c容器数据库data dump数据泵传输数据(2)---11g导19c

目录 1.在11gnon-cdb数据库中创建测试用户 2.在19cCDB容器数据库中新建pdb2 3.执行命令导出 4.执行命令导入 Exporting from a Non-CDB and Importing into a PDB 我們要記住一点:如果是全库导出导入的话,目标数据库没有的表空间我们要事先创建&#…

Java中输入和输出处理(四)序列化和反序列化

Java中输入和输出处理(四)序列化和反序列化的笔记 一、序列化 序列化是将对象的状态信息转换为可以存储或传输的形式的过程。在Java中,我们可以使用java.io.Serializable接口来实现对象的序列化。 示例: import java.io.*;clas…

提高iOS App开发效率的方法

引言 随着智能手机的普及,iOS App开发成为越来越受欢迎的技术领域之一。许多人选择开发iOS应用程序来满足市场需求,但是iOS App开发需要掌握一些关键技术和工具,以提高开发效率和质量。本文将介绍一些关键点,可以帮助你进行高效的…

Flying HTML生成PDF添加水印

HTML转PDF并添加水印 <!-- 用于生成PDF --> <dependency><groupId>org.xhtmlrenderer</groupId><artifactId>flying-saucer-pdf</artifactId><version>9.1.20</version> </dependency>import java.io.File; import jav…

os.path模块常用函数

os.path模块提供用于处理文件路径的函数&#xff0c;这些函数可以跨平台使用&#xff0c;因为他们会根据操作系统的不同选择适当的路径分隔符。 1.os.path.join(path, *paths) 作用&#xff1a;将多个路径组合成一个完整的路径 path os.path.join(/path/to example file.…

基础知识篇(一)Acticity生命周期

Activity 类是 Android 应用的关键组件&#xff0c;而 activity 的启动和组合方式是平台应用模型的基本组成部分。与使用 main() 方法启动应用的编程范式不同&#xff0c;Android 系统会通过调用与其生命周期特定阶段对应的特定回调方法&#xff0c;在 Activity 实例中启动代码…

ChatGpt使用技巧

通用类技巧 角色扮演 比如让ChatGpt扮演500强营销专家 告诉ChatGpt你的身份。初学者、或是有一定能力、知识的学习者等 限制ChatGpt回答长度 100~200字之间 让ChatGpt一步一步思考 他会预测下一个单词&#xff0c;根据prompt进行生成 明确你的要求和目的 说清楚问题&#x…

为什么杭州的独角兽公司的技术专家都是阿里巴巴出来的?

在浙江杭州有一个不成为的规定&#xff0c;独角兽公司招聘技术人才的时候&#xff0c;尤其是阿里巴巴出来的技术专家&#xff0c;面试官都是争先恐后的面试&#xff0c;总是想第一时间把这个人拿到手&#xff0c;当然前提是这个技术专家不是水货。 猎头推荐人才的时候&#xf…

网络安全(网络安全)—2024自学

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高&#xff1b; 二、则是发展相对成熟…

Docker 配置国内镜像源加速

1. 国内镜像源总览 名称路径中国官方镜像https://registry.docker-cn.com网易163镜像http://hub-mirror.c.163.com中科大镜像https://docker.mirrors.ustc.edu.cn阿里云镜像https://[xxx].mirror.aliyuncs.com 2. 阿里云镜像源 地址&#xff1a;https://cr.console.aliyun.c…

同样的行情为什么有人亏损有人盈利?现货白银关键的管理细节要知道

给同样一波趋势行情两个人做交易&#xff0c;就算大家执行一样的交易策略&#xff0c;但结果却也有可能有所不同&#xff0c;有人盈利有人亏损&#xff0c;而盈利的人中可能有的人多&#xff0c;有的人少&#xff0c;这是为什么呢&#xff1f;其实很多投资者忽略了进行现货白银…