es6语法总结

news2024/11/17 12:23:53

【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.coloradmin.cn/o/1665252.html

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

相关文章

C++:关于圆形鱼眼半全景图转为等距圆柱投影图

C&#xff1a;空间坐标映射到球面坐标/全景图_如何将球体坐标映射到球面uv-CSDN博客 C&#xff1a;关于360全景图像和立方体6面全景图像的相互转换_彩色全景拆解正方体6个面-CSDN博客 之前记录了立方体和360全景之间的转换&#xff0c;这次记录下鱼眼图与360全景图之间的转换…

Doris【部署 01】Linux部署MPP数据库Doris稳定版(下载+安装+连接+测试)

本次安装测试的为稳定版2.0.8官方文档 https://doris.apache.org/zh-CN/docs/2.0/get-starting/quick-start 这个简短的指南将告诉你如何下载 Doris 最新稳定版本&#xff0c;在单节点上安装并运行它&#xff0c;包括创建数据库、数据表、导入数据及查询等。 Linux部署稳定版Do…

【Python】PYQT5详细介绍

本专栏内容为&#xff1a;Python学习专栏 通过本专栏的深入学习&#xff0c;你可以了解并掌握Python。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;Python &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&#x1f69a; &#x1f3…

Array.map解析

map方法会创建一个新数组。该方法会循环数组中的每个值&#xff0c;如果仅仅是想循环数组不需要返回值使用数组的forEach方法就可以。原数组中的每个元素都调用一次提供的函数后的返回值组成。Array.map 它接收一个函数 这个函数可以接收三个参数 数组的每个值item 这个值的索引…

ICode国际青少年编程竞赛- Python-4级训练场-嵌套for循环入门

ICode国际青少年编程竞赛- Python-4级训练场-嵌套for循环入门 1、 for i in range(3):Dev.step(3)for j in range(3):Dev.turnLeft()Dev.step(-2)Dev.turnLeft()2、 for i in range(3):Dev.turnLeft()Dev.step(4)Dev.turnRight()Dev.step(2)for i in range(4):Dev.step(2)D…

ardupilot开发 --- opencv 篇

0. 一些概念 官网&#xff1a;https://opencv.org/ 1. 卸载 sudo apt-get --purge remove libopencv sudo apt-get --purge remove libopencv-dev sudo apt-get --purge remove libopencv* sudo apt-get --purge remove opencv sudo apt-get --purge remove *opencv* sudo a…

视频剪辑达人分享:一键批量置入随机封面,创意无限

在数字化媒体飞速发展的今天&#xff0c;视频内容已经成为我们表达创意、分享故事、传递信息的主要方式之一。而在视频制作过程中&#xff0c;封面作为视频的“脸面”&#xff0c;往往决定了观众是否愿意点击观看。因此&#xff0c;为视频选择合适的封面变得至关重要。 在大量…

3D数字化解决方案助力文博行业转型,让文物“活”起来!

博物馆是保护和传承人类文明的重要殿堂&#xff0c;是连接过去、现在、未来的桥梁&#xff0c;为了进一步加强文物及藏品保护&#xff0c;不断提高博物馆服务和科普宣传水平&#xff0c;博物馆数字化转型已是当下发展趋势。 在科技的“加持”下&#xff0c;不少博物馆凭借强大的…

LeetCode-258. 各位相加【数学 数论 模拟】

LeetCode-258. 各位相加【数学 数论 模拟】 题目描述&#xff1a;解题思路一&#xff1a;循环解题思路二&#xff1a;进阶 O(1)解题思路三&#xff1a; 题目描述&#xff1a; 给定一个非负整数 num&#xff0c;反复将各个位上的数字相加&#xff0c;直到结果为一位数。返回这个…

Linux下VMamba 环境复现+环境测试

# 1. 创建自己的虚拟环境 conda create -n VMamba python3.10.13 conda activate VMamba # 2. cuda-11.8 conda install cudatoolkit11.8 -c nvidia # 3. torch torchvision torchaudio 与 官网命令一致 pip install torch2.1.1 torchvision0.16.1 torchaudio2.1.1 --index-url…

OpenGL入门第四步:摄像机视角变换与交互

OpenGL入门第一步:创建窗口、重写虚函数-CSDN博客 OpenGL入门第二步:颜色、纹理设置(解析)-CSDN博客 OpenGL入门第三步:矩阵变换、坐标系统-CSDN博客 目录 函数解析 具体代码 函数解析 相机视角变换需要与鼠标键盘进行交互,需要重写鼠标和键盘响应函数。 初始化 …

获取Android开发板已连接WiFi密码

硬件/软件环境&#xff1a; 1&#xff09;全志芯片开发板A40i 2&#xff09;Android Studio Giraffe | 2022.3.1 Patch 3 连接条件&#xff1a; 1)两端都是USB-A接口线&#xff0c;一端插入电脑端USB接口&#xff0c;另一端插入开发板USB接口&#xff1b; 2&#xff09;Andr…

【向信而行 笃行致远】2024·C3合作伙伴大会即将启幕

向信而行&#xff0c;笃行致远。2024C3合作伙伴大会将于5月17日在南京拉开帷幕。 数字机遇&#xff0c;智能变革。在数智化的澎湃浪潮中&#xff0c;唯有聚合众力&#xff0c;方能乘风破浪&#xff0c;驶向更远的未来。 2023年&#xff0c;我们直面企业数字转型的需求与挑战&…

BUU-[GXYCTF2019]Ping Ping Ping

考察点 命令执行 题目 解题 简单测试 ?ip应该是一个提示&#xff0c;那么就测试一下?ip127.0.0.1 http://0c02a46a-5ac2-45f5-99da-3d1b0b951307.node4.buuoj.cn:81/?ip127.0.0.1发现正常回显 列出文件 那么猜测一下可能会有命令执行漏洞&#xff0c;测试?ip127.0.…

Pikachu 靶场 CSRF 通关解析

前言 Pikachu靶场是一种常见的网络安全训练平台&#xff0c;用于模拟真实世界中的网络攻击和防御场景。它提供了一系列的实验室环境&#xff0c;供安全专业人士、学生和爱好者练习和测试他们的技能。 Pikachu靶场的目的是帮助用户了解和掌握网络攻击的原理和技术&#xff0c;…

vue3.0(六) toRef,toValue,toRefs和toRow,markRaw

文章目录 toReftoValuetoRefstoRowmarkRawtoRef和toRefs的区别toRaw 和markRaw的用处 toRef toRef 函数可以将一个响应式对象的属性转换为一个独立的 ref 对象。返回的是一个指向源对象属性的 ref 引用&#xff0c;任何对该引用的修改都会同步到源对象属性上。使用 toRef 时需…

ue引擎游戏开发笔记(37)——实现敌人接收攻击伤害,并作出反应

1.需求分析&#xff1a; 现在已经显示造成实际伤害&#xff0c;但敌人对实际伤害并未产生反馈&#xff0c;例如还击&#xff0c;或者死亡倒地等等&#xff0c;实现敌人对于受击的反馈。 2.操作实现&#xff1a; 1.思路&#xff1a;在动画蓝图中添加死亡动画&#xff0c;并通过…

QT6 android程序界面强制横屏显示不旋转

QT6开发的Android程序有时候旋转后程序会变形&#xff0c;比如想让其固定位横屏显示&#xff0c;就需要进行特殊设置&#xff0c;本文提供一种简便的设置方法。 一.AndroidManifest.xml文件介绍 Android的Manifest.xml文件是一个重要的配置文件&#xff0c;用于描述应用程序的…

Hive 特殊的数据类型 Array、Map、Struct

Array 数组类型&#xff0c;存储数据类型一致的列表数据。 我们可以使用 array 方法来创建一个数组&#xff0c;如下所示&#xff1a; select array(1,2,3,4,5);如果其中的数据类型不一致&#xff0c;那么它会转换成统一的数据类型&#xff08;前提是能够进行转换&#xff0…

[leetcode] 68. 文本左右对齐

文章目录 题目描述解题方法贪心java代码复杂度分析 题目描述 给定一个单词数组 words 和一个长度 maxWidth &#xff0c;重新排版单词&#xff0c;使其成为每行恰好有 maxWidth 个字符&#xff0c;且左右两端对齐的文本。 你应该使用 “贪心算法” 来放置给定的单词&#xff…