es6语法总结

【1】语法

(1)声明变量(let-var-const)

  • 变量提升
    • 是JavaScript引擎在代码执行前将变量的声明部分提升到作用域顶部的行为
    • 尽管变量的声明被提升了,变量的赋值(即初始化)仍然保留在原来的位置。因此,如果在初始化之前使用变量,其值将为undefined
  • 暂时性死区(Temporal Dead Zone, TDZ)
    • letconst 声明的变量被初始化之前,如果尝试访问它们,会抛出一个 ReferenceError
    • 这个区域被称为暂时性死区。
    • var存在变量提上不会报错,但是应该少用
  • var
    • ES5中引入的变量声明方式,它声明的变量具有函数作用域全局作用域,并且存在变量提升现象。
    • 这意味着var声明的变量,无论实际声明在何处,都会被提升到其所在作用域的最顶部。此外,var声明的变量可以被重新赋值。
var x = 10;
function testVar() {
    console.log(x); // undefined,因为变量提升,但此时x还没有被赋值
    var x = 20;
    console.log(x); // 20
}
testVar();
console.log(x) //10
  • let
    • ES6中引入的变量声明方式,它声明的变量具有块级作用域(即大括号{}内),并且不会存在变量提升。
    • let声明的变量在声明之前使用会抛出错误。同样,let声明的变量可以被重新赋值。
    • let是 ES6 中引入的一个关键字,用于声明变量。
    • var 相比,let 声明的变量具有块级作用域,变量只在它被声明的代码块{}内有效。
let y = 10;
if (true) {
    // console.log(y) // 不存在跨域提升,直接报错
    let y = 20; // 不会与外部的y冲突,因为具有块级作用域
    console.log(y); // 20
}
console.log(y); // 10
  • const
    • ES6中引入的,它用于声明一个只读的常量。一旦一个变量被const声明,它的值就不能被重新赋值
    • 但如果该值是一个对象或数组,那么其内部属性或元素仍然可以被修改。const也具有块级作用域。
const z = 10;
// z = 20; // 报错,不能被重新赋值
const obj = {key: 'value'};
obj.key = 'new value'; // 内部元素可以修改
// obj = {anotherKey: 'value'}; // 报错,整体不能被直接修改
  • 小结:
    • letconst 提供了块级作用域。
    • let 声明的变量可以被重新赋值。
    • const 声明的常量(或称为不可重新赋值的变量)一旦被赋值后,就不能再被重新赋值(但可以修改对象或数组的内部状态)。
    • 在声明之前访问 letconst 声明的变量会导致 ReferenceError,这是由暂时性死区导致的。

(2)箭头函数

  • 语法

    • 箭头函数是ES6中引入的一种新的函数表达式。它的语法比传统的函数表达式更简洁,且有一些特殊的行为。

    • (parameters) => { functionBody }
      
      • parameters:箭头函数的参数列表。

      • =>:箭头,表示这是一个箭头函数。

      • functionBody:箭头函数的主体。

  • 示例讲解

    • 箭头函数传统的函数表达式

      • 相比于传统的函数表达式,箭头函数没有function关键字,这使得代码更简洁

      • 当函数只有一个参数传递时,方法的括号也可省略

      • 当函数只用一个return值时,return关键字和大括号也可以省略

      • // 传统函数表达式
        const testFunc = function(x){return x * x}
        //箭头函数表达式
        const tetsFunc = (x) => {return x * x}
        const testFunc = x   => x * x
        
    • 箭头函数没有自己的this,即不绑定this

      • 箭头函数不会创建自己的this值,而是捕获其所在上下文的this值。

      • 这使得在回调函数、事件处理器和定时器中使用箭头函数更加安全和方便。

      • const obj = {  
          value: 10,  
          getValue: function() {  
              // 等待一秒输出log内容
            setTimeout(() => {  
              console.log(this.value); // 输出 10,因为箭头函数捕获了外层函数的this值  
            }, 1000);  
          }  
        };  
        obj.getValue();
        
    • 箭头函数没有arguments对象

      • 箭头函数没有arguments对象,但可以使用剩余参数(rest parameters)来达到类似的效果。

      • const sum = (...args) => args.reduce((a, b) => a + b, 100);
        let num =   sum(1, 2, 3, 4); 
        console.log(num)
        
    • 箭头函数不能作为构造函数

      • 箭头函数没有prototype属性,因此不能用作构造函数。

      • const Arrow = () => {};
        const arrowInstance = new Arrow(); // 抛出错误
        // Uncaught TypeError: Arrow is not a constructor
        

(3)箭头函数和this

  • 箭头函数内部的 this
    • 箭头函数不会创建自己的 this 上下文,因此它捕获其所在(即定义它的位置)的外部函数的 this 值,作为自己的 this 值。
function Outer() {  
    this.value = 'bruce';  
    this.innerFunc = () => {  
        console.log(this.value); // bruce 
    };  
}  
const outer = new Outer();  
outer.innerFunc();
  • this 指向问题分析

    1. 在全局上下文中使用(this是window对象)

      • console.log(this); // window 对象
        
      • image-20240429214417804

    2. 普通函数内调用(this是window对象)

      • function normalFunction() {
            console.log(this); // window 对象
        }
        normalFunction();
        
    3. 作为对象方法调用(this是当前的对象)

      •     const obj = {
                value: 'hello',
                method: function () {
                    console.log(this);
                }
            };
            obj.method();
        
      • image-20240429214540887

    4. 在node中直接调用(this是全局对象global)

      • console.log(this)
        
      • image-20240429214356486

(4)模板字符串

  • 在ES6中,模板字符串是一种新的字符串语法,用反引号(``)包围字符串内容。

  • 模板字符串可以包含变量,这些变量会被解析并替换为实际的值。

    • let name = 'bruce'
      let info = `My name is:${name}`
      
    • 举例来说,假设你有一个变量name,其值为"bruce",那么当你使用模板字符串let info = My name is:${name};时,变量info 的值将会是"My name is:bruce"

  • 特点:

    1. 可以在字符串中直接插入变量,使代码更加简洁易读。
    2. 可以跨行书写字符串,不再需要使用字符串连接符(+)。
    3. 支持在字符串中使用表达式,比如${2 + 2}会被计算为4

(5)解构赋值

  • 解构赋值对象

    • 解构赋值允许您从对象中提取属性,并将它们赋值给不同的变量。

    • 这避免了多次使用点操作符(.)或方括号([])来获取对象属性的值。

    • let user = {name: 'bruce', age: 1};  
        
      // let name = user.name;  
      // let age = user.age;  
        
      let {name, age, hobby, a = 10} = user;  
      // 没有bobby所以是undefined
      // 没有a但是又默认是所以a是10
      console.log(name, age, hobby, a); // bruce 1 undefined 10
      
  • 解构赋值数组

    • 对于数组,解构赋值允许直接从数组中提取元素

    • 按照索引位置直接赋值

    • 如果解构的变量数量超过数组的长度,多余的变量会被赋值为undefined

    • let listInfo = [11, 22];
      let [a, b, c] = listInfo;
      
      console.log(a, b, c); // 11 22 undefined
      
  • 交换变量

    • 当使用解构赋值时,还可以很方便地交换两个变量的值

    • let a = 10;
      let b = 20;
      
      [a, b] = [b, a];
      console.log(a, b); // 20 10
      
  • 解构函数返回值

    • 当函数返回一个对象时,可以使用解构赋值来直接访问该对象的属性。

    • function handleInfo() {
          return {name: 'bruce', age: 19};
      }
      
      let {name = '1', age} = handleInfo();
      
      // 如果返回的对象中没有name属性,则name的值为默认值'1'
      console.log(name, age); // bruce 19
      

(6)展开运算

  • 展开运算符 ...

    • 将可迭代对象的元素或属性展开为多个参数或元素。
    • 可以简单理解为python的*args
  • 对象展开

    • 在对象中使用展开运算符,可以将源对象的所有可枚举属性复制到目标对象中。

    • let userDetail = {age: 19, hobby: ['swimming', 'running']};
      let userInfo = {name: 'bruce', ...userDetail};
      console.log(userInfo); // {name: 'bruce', age: 19, hobby: Array(2)}
      
  • 数组展开

    • 在数组中使用展开运算符,可以将一个数组的元素插入到另一个数组的指定位置。

    • 类似于python中的两个列表相加

    • let list1 = [1, 2, 3];
      let list2 = [...list1, 4, 5, 6];
      console.log(list2); // [1, 2, 3, 4, 5, 6]
      
  • 函数参数展开

    • 在函数调用时,可以使用展开运算符将一个数组的元素作为单独的参数传递给函数。

    • function addFunc(a, ...b) {
          let c = b.reduce((acc, item) => acc + item, a);
          console.log(c);
      }
      
      addFunc(1, 2, 3, 4);
      
  • 小结:

    • 展开运算符为我们在处理对象和数组时提供了极大的灵活性。
    • 无论是复制对象属性、合并数组,还是将数组元素作为参数传递给函数,展开运算符都能简化代码并提高效率。

(7)模块化

  • 默认导出和导入

    • 默认导出每个模块中只能有一个默认导出

      • 默认导出的成员可以是任何类型的值(变量、函数、对象、类等)。

      • 在导入时,可以使用自定义的名称来接收这个导出的成员,script标签需要指定类型type为module。

      • 未导出的任何类型变量都不能被导入

      • // 导出
        // utils.js
        let name = 'bruce'
        let age = 18
        function add(a, b) {
            return a + b
        }
        export default {
            name, add
        }
        
      • // 导入
        <script type="module">
            import utils from "./test/utils.js";
        
            console.log(utils.name) // bruce
            console.log(utils.age) // undefined
            console.log(utils.add(1, 1)) // 2
        </script>
        
  • 命名导出和导入

    • 命名导出:每个模块中可以有多个命名导出。

    • 每个导出的成员都需要一个名字,这个名字在导入时也需要被使用,基本都需要{}

    • // 导出
      // utils.js
      export let name = 'bruce'
      
      export function add(a, b) {
          return a + b
      }
      
      export const age = 10
      
    • // 导出方式一:
      <script type="module">
          import {add, age} from './test/utils.js'
      
          console.log(add(1, 1)) // 2
          console.log(age)    // 10
      </script>
      
    • // 导出方式二:全部导入起别名
      <script type="module">
          import * as info from './test/utils.js'
      
          console.log(info.add(1, 1)) //2
          console.log(info.age) //10
      </script>
      
    • // 导出方式二:起别名
      <script type="module">
          import {add as myAdd} from './test/utils.js'
      
          console.log(myAdd(1, 1)) // 2
      </script>
      
  • index.js文件

    • 如果文件夹下的js文件叫做index.js,那么导入就可以省略/index.js,只需要导入到文件夹这层就可以

    • 无论是命名导入还是默认导入

    • image-20240430192435630

    • # 导入
      <script type="module">
          import * as info from './test'
      
          console.log(info.add(1, 1)) //2
          console.log(info.age) //10
      </script>
      

【2】JS中循环遍历

(1)遍历数组

  • for循环:基于索引遍历数组。
const array = ['a', 'b', 'c'];
for (let i = 0; i < array.length; i++) {
    console.log(array[i]);
}
  • for…of循环:ES6中引入的,基于迭代取值
const array = ['a', 'b', 'c'];
for (let value of array) {
    console.log(value);
}
  • forEach方法:数组内置方法,遍历每个元素
const array = ['a', 'b', 'c'];
array.forEach(function(value) {
    console.log(value);
});
  • map方法:数组内置方法,根据指定方法,创建一个新数组
const array = [1, 3, 5];
const newArray = array.map(value => value * value);
console.log(newArray); // [1, 9, 25]

(2)遍历对象

  • for…in循环:遍历对象的可枚举属性(包括原型链上的属性)。
const obj = {name: 'bruce', age: 18};
for (let key in obj) {
    console.log(key, obj[key]);
}
// name bruce
// age 18
  • Object.keys方法:对象方法,返回对象的所有键值,和for…in一样
const obj = {name: 'bruce', age: 18};
Object.keys(obj).forEach(key => {
    console.log(key, obj[key]);
});
  • Object.values方法:对象方法,只返回对象的所有值,没有键
const obj = {name: 'bruce', age: 18};
Object.values(obj).forEach(function (value) {
    console.log(value)
})
// bruce
// 18

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

紫外激光打标机适合在哪些材料表面进行标记

紫外激光打标机适合在多种材料表面进行标记&#xff0c;特别是那些对热敏感或者需要高精度、高清晰度标记的材料。以下是一些常见的适用材料&#xff1a; 1. 塑料&#xff1a;紫外激光打标机在塑料材料上表现尤为出色&#xff0c;因为紫外激光的短波长和高能量密度使得它能够在…

基于树莓派的六足机器人方案设计+源代码+工程内容说明

文章目录 源代码下载地址项目介绍项目内容说明简单预览 项目备注源代码下载地址 源代码下载地址 点击这里下载源码 项目介绍 项目内容说明 hardware为项目相关硬件设计 机械结构为六足机器人的3d建模工程&#xff0c;包括本体和云台遥控器在ESP32最小开发板上集成了MPU605…

ChatGPT DALL-E绘图,制作各种表情包,实现穿衣风格的自由切换

DALL-E绘图功能探索&#xff1a; 1、保持人物形象一致&#xff0c;适配更多的表情、动作 2、改变穿衣风格 3、小女孩的不同年龄段展示 4、不同社交平台的个性头像创作 如果不会写代码&#xff0c;可以问GPT。使用地址&#xff1a;我的GPT4 视频&#xff0c;B站会发&#…

茅台申购,多平台签到与通知 | 使用极空间NAS部署一个神级脚本『DailyCheckIn』

茅台申购&#xff0c;多平台签到与通知 | 使用极空间NAS部署一个神级脚本『DailyCheckIn』 哈喽小伙伴们好&#xff0c;我是Stark-C~&#xff0c;今天为大家分享一个极空间上非常实用且好玩的项目。 小伙伴们都知道&#xff0c;目前很多平台为了促进用户的活跃度和黏性&#…

ENVI拓展工具资源去哪里找

ENVI拓展工具资源去哪里找&#xff1f; 文章目录 ENVI拓展工具资源去哪里找&#xff1f;前言网站&#xff08;链接见文末&#xff09;ENVI应用商店&#xff08;App Store&#xff09;ENVI官方提供第三方制作自己制作 总结参考 前言 ENVI 拓展工具是指 ENVI 软件的扩展功能或插…

WordPress插件:链接自动识别转为超链接

WordPress插件&#xff1a;链接自动识别转为超链接 <?phpfunction open_links_in_new_tab() {add_filter(the_content, make_clickable);function autoblank($text) {$return str_replace(<a, <a target"_blank", $text);return $return;}add_filter(th…

海外市场成 ISV 新掘金地?生成式 AI 如何加速业务创新实践?Zilliz 有话说

期望了解 Zilliz 最新动态&#xff1f;想要与 Zilliz 线下探讨 AI 时代向量数据库的全球化布局思考及典型实践&#xff1f; 机会来啦&#xff01;5 月 10 日&#xff0c;Zilliz 将闪现亚马逊云科技的两场活动现场&#xff08;苏州、西安&#xff09;&#xff0c;与大家共话行业…

【Kubernetes集群一主二从安装教程】

文章目录 环境准备主机间做信任安装ansible工具 升级内核版本使用elrepo源升级内核查看最新版内核安装最新的内核版本设置系统默认内核设置默认内核为我们刚才升级的内核版本 初始化关闭防火墙关闭selinux关闭swap修改主机名修改hosts文件将桥接的IPv4流量传递到iptables的链配…

52岁前宝丽金小花懒理旧爱郭晋安离婚,大晒美腿甜蜜放闪

TVB三届视帝郭晋安与欧倩怡早前在社交平台共同宣布离婚&#xff0c;并透露二人已分居两年&#xff0c;18年夫妻情画上句号&#xff0c;惊爆全城。郭晋安曾受访指&#xff0c;遇上欧倩怡前只有两段深刻的感情&#xff0c;一段是初恋&#xff0c;另一段则是刘小慧。 旧爱刘小慧懒…

贪吃蛇游戏(C语言实现)

目录 游戏效果展示文件代码的展示test.cSnake.cSnake.h 下一个坐标不是食物 游戏效果展示 QQ录屏20240507163633 文件 代码的展示 test.c #define _CRT_SECURE_NO_WARNINGS#include<locale.h> //设置本地化 #include"Snake.h"//游戏的测试逻辑 void test() {…

【服务治理中间件】consul介绍和基本原理

目录 一、CAP定理 二、服务注册中心产品比较 三、Consul概述 3.1 什么是Consul 3.2 Consul架构 3.3 Consul的使用场景 3.4 Consul健康检查 四、部署consul集群 4.1 服务器部署规划 4.2 下载解压 4.3 启动consul 五、服务注册到consul 一、CAP定理 CAP定理&#xff…

STM32使用ADC单/多通道检测数据

文章目录 1. STM32单片机ADC功能详解 2. AD单通道 2.1 初始化 2.2 ADC.c 2.3 ADC.h 2.4 main.c 3. AD多通道 3.1 ADC.c 3.2 ADC.h 3.3 main.c 3.4 完整工程文件 1. STM32单片机ADC功能详解 STM32单片机ADC功能详解 2. AD单通道 这个代码实现通过ADC功能采集三脚电…

掌握Android Fragment开发之魂:Fragment的深度解析(上)

Fragment是Android开发中用于构建动态和灵活界面的基石。它不仅提升了应用的模块化程度&#xff0c;还增强了用户界面的动态性和交互性&#xff0c;允许开发者将应用界面划分为多个独立、可重用的部分&#xff0c;每个部分都可以独立于其他部分进行操作。本文将从以下几个方面深…

ttkbootstrap界面美化系列之PanedWindow(七)

在界面设计中经常用PanedWindow控件来对整个界面进行切割布局&#xff0c;让整个界面看上去有层次感&#xff0c;不至于说杂乱无章。在我之前的文章中有对tkinter的该控件做了详细的介绍&#xff0c;链接如下基于Tkinter的PanedWindow组件进行窗口布局-CSDN博客 本文主要是介绍…

无人直播需要什么软件系统?最新AI实景自动无人直播软件:智能化引领直播拓客新时代

随着互联网的快速发展&#xff08;无人直播招商加盟&#xff1a;hzzxar&#xff09;直播行业已经成为商家品牌推广和商品销售的热门方式。近年来&#xff0c;人工智能技术的飞速发展&#xff0c;催生了一款令人惊叹的AI实景自动无人直播软件&#xff0c;为商家提供了全新的直播…

2024视觉与学习青年学者研讨会(VALSE 2024)热点推文预告

视觉与学习青年学者研讨会&#xff08;VALSE&#xff09;是国内人工智能领域顶尖学者一年一度的研讨会。该会议的特点是大、全、新。会议的规模大&#xff0c;参会者达到五千人以上&#xff1b;会议的主题全&#xff0c;全面覆盖人工智能的各大领域&#xff1b;会议的内容新&am…

SQL奇难怪状知识点分享

SQL执行顺序 select 语句的完整结构&#xff1a; select 去重 要查询的字段 from表&#xff08;注意&#xff1a;表和字段可以取别名&#xff09; xxxx&#xff08;left/right/full&#xff09; join 要连接的表 on 等值判断&#xff08;顺序&#xff1a;先on再where&#x…

内存卡罢工,数据危机?别急,有救!

在日常生活和工作中&#xff0c;我们越来越依赖于各种电子设备来存储重要数据。其中&#xff0c;内存卡因其便携性和大容量而广受欢迎。然而&#xff0c;当内存卡突然损坏打不开时&#xff0c;我们该如何应对&#xff1f;本文将为您详细解析这一问题&#xff0c;并提供有效的解…

JAVA版本的ATM编程问题记录

前段时间用C语言写了个银行ATM系统&#xff0c;还写了一篇文章记录了一些&#xff0c;C语言的ATM文章。后来又用IDEA写了一个JAVA版本的银行ATM。有人就会问为啥浪费这个时间写ATM呢&#xff1f;&#x1f9d0;其实是我本科代码没学好&#xff0c;所以现在想利用比较熟悉的ATM系…

探秘编程之旅:Baidu Comate 智能代码助手的魔法揭秘

目录 Baidu Comate智能代码助手1.场景需求2.安装步骤3.功能介绍3.1 /指令3.2 插件3.3 #知识 4.使用体验5.总结 Baidu Comate智能代码助手 智能编程助手的意义在于提升编程体验和效率&#xff0c;使开发人员能够更轻松、更快速地完成编码任务&#xff0c;是如今人工智能技术的一…
最新文章