js中 ES6 新特性详解

ES6(ECMAScript 2015)是 JavaScript 的一次重大更新,引入了许多新的特性,使 JavaScript 代码更加简洁、可读和高效。以下是 ES6 的主要新特性及其原理

1. let 和 const 关键字

原理解析

1.1 作用域

  • var 关键字的作用域:在 ES5 及之前,JavaScript 只有函数作用域(Function Scope),即 var 声明的变量只在函数内部可见,但在块级 {} 内仍然可以访问:

    if (true) {var x = 10;
    }
    console.log(x); // 10,x 仍然可访问
    

    由于 xvar 声明的,它的作用域扩展到整个函数或全局,而非 if 代码块内部。

  • letconst 关键字的作用域

    • letconst块级作用域(Block Scope),即它们声明的变量只在当前代码块 {} 内有效
    • 这避免了 var 可能导致的全局污染问题。
    if (true) {let y = 20;
    }
    console.log(y); // ReferenceError: y is not defined
    

1.2 暂时性死区(Temporal Dead Zone, TDZ)

  • letconst 不会像 var 一样变量提升(Hoisting),而是进入暂时性死区,直到执行到变量声明的位置,变量才可用。

    console.log(a); // ReferenceError: Cannot access 'a' before initialization
    let a = 10;
    

    解释

    • 代码在执行时,会先创建变量的作用域。
    • 但是 let 声明的变量在作用域创建后,直到真正声明前,处于“暂时性死区”。
    • 只有 let a = 10; 执行后,a 才能被访问。

1.3 const 的特性

  • const 声明的变量不可被重新赋值
    const pi = 3.14;
    pi = 3.14159; // TypeError: Assignment to constant variable.
    

  • 但是对象类型(数组、对象)可以修改其内容
    const obj = { name: "Alice" };
    obj.name = "Bob"; // 允许修改对象的属性
    console.log(obj); // { name: "Bob" }
    

    解释
    • const 只是确保 obj 这个变量的引用地址不会变,但对象的内部属性仍然可以修改。

2. 模板字符串(Template Literals)

原理解析

2.1 变量插值

  • 传统字符串拼接需要 + 号,而模板字符串可以使用 ${} 插入变量:
    let name = "Alice";
    let greeting = `Hello, ${name}!`;
    console.log(greeting); // "Hello, Alice!"
    

2.2 多行字符串

  • 传统的字符串换行必须使用 \n
    let str = "Hello\nWorld";
    

  • 但模板字符串可以直接换行
    let str = `Hello
    World`;
    console.log(str);
    


3. 箭头函数(Arrow Functions)

原理解析

3.1 this 绑定机制

  • 普通 functionthis 由调用者决定,但箭头函数的 this定义时的作用域 决定:

    function normalFunction() {console.log(this); // this 取决于调用方式
    }const arrowFunction = () => {console.log(this); // this 由定义时决定
    };
    

  • 事件回调、定时器、map/filter 中,箭头函数可以避免 this 绑定问题:

  • const obj = {value: 10,method: function () {setTimeout(() => {console.log(this.value); // 10}, 1000);}
    };
    obj.method();
    

    解释

    • setTimeout 里的回调是箭头函数,this 保持 method 里的 this,即 obj

3.2 语法简化

  • 省略 function 关键字:
    const add = (a, b) => a + b;
    
  • 单个参数可省略括号:
    const square = x => x * x;
    


4. 解构赋值(Destructuring Assignment)

原理解析

4.1 数组解构

  • 直接提取数组元素:
    let [a, b, c] = [1, 2, 3];
    console.log(a, b, c); // 1, 2, 3
    

  • 跳过某些元素
    let [first, , third] = [10, 20, 30];
    console.log(first, third); // 10, 30
    

4.2 对象解构

  • 提取对象属性:
    let { name, age } = { name: "Alice", age: 25 };
    console.log(name, age); // "Alice", 25
    

  • 给解构变量赋别名
    let { name: userName } = { name: "Alice" };
    console.log(userName); // "Alice"
    

4.3 默认值

  • 如果解构的值 undefined,可提供默认值:
    let { x = 10 } = {};
    console.log(x); // 10
    


5. 默认参数(Default Parameters)

原理解析

5.1 传统方式

  • 过去需要手动检查参数:
    function greet(name) {name = name || "Guest"; // 传统方式console.log(`Hello, ${name}!`);
    }
    greet(); // "Hello, Guest!"
    

5.2 ES6 语法

  • 直接在参数定义时提供默认值:
    function greet(name = "Guest") {console.log(`Hello, ${name}!`);
    }
    greet(); // "Hello, Guest!"
    

  • 默认参数只在传 undefined 时生效null 仍会覆盖默认值:
    greet(null); // "Hello, null!"
    

6. 扩展运算符(Spread Operator, ...)

原理解析

6.1 用于数组

  • 展开数组元素:使用 ... 运算符将数组的每一项展开,可以合并数组、拷贝数组,甚至将数组插入到另一个数组中。

    let arr1 = [1, 2, 3];
    let arr2 = [...arr1, 4, 5];
    console.log(arr2); // [1, 2, 3, 4, 5]
    

  • 拷贝数组:创建一个新数组,避免修改原数组:

    let arr1 = [1, 2, 3];
    let arr2 = [...arr1];
    arr2.push(4);
    console.log(arr1); // [1, 2, 3]
    console.log(arr2); // [1, 2, 3, 4]
    

6.2 用于对象

  • 展开对象的属性:

    let obj1 = { name: "Alice", age: 25 };
    let obj2 = { ...obj1, city: "New York" };
    console.log(obj2); // { name: "Alice", age: 25, city: "New York" }
    

  • 合并对象

    let obj1 = { name: "Alice" };
    let obj2 = { age: 25 };
    let obj3 = { ...obj1, ...obj2 };
    console.log(obj3); // { name: "Alice", age: 25 }
    

6.3 与函数参数结合使用

  • 直接展开数组作为函数参数:
    function sum(a, b, c) {return a + b + c;
    }
    let nums = [1, 2, 3];
    console.log(sum(...nums)); // 6
    


7. 对象增强语法(Enhanced Object Literals)

原理解析

7.1 属性简写

  • 如果对象字面量中的键名与变量名相同,可以省略键名:

    let name = "Alice";
    let person = { name };
    console.log(person); // { name: "Alice" }
    

7.2 方法简写

  • 定义对象方法时,不再需要 function 关键字:

    let person = {greet() {console.log("Hello!");}
    };
    person.greet(); // "Hello!"
    

7.3 动态属性名

  • 对象的属性名可以动态设置,使用方括号 []

    let propName = "age";
    let person = {[propName]: 25
    };
    console.log(person.age); // 25
    


8. for...of 迭代器

原理解析

8.1 迭代器(Iterator)

  • for...of 用于迭代对象,尤其适用于数组、字符串、SetMap 等可迭代对象。

    let arr = [1, 2, 3];
    for (let value of arr) {console.log(value); // 1, 2, 3
    }
    

8.2 与 for...in 的区别

  • for...in 遍历对象的属性名,而 for...of 遍历对象的值

    let arr = [10, 20, 30];for (let key in arr) {console.log(key); // 0, 1, 2(索引)
    }for (let value of arr) {console.log(value); // 10, 20, 30(元素值)
    }
    

8.3 可迭代对象

  • 迭代对象必须实现 [Symbol.iterator]() 方法,如 Array, String, Map, Set 等。
    let str = "Hello";
    for (let char of str) {console.log(char); // H, e, l, l, o
    }
    


9. MapSet

原理解析

9.1 Map

  • Map 是一个键值对集合,支持任意类型的键(不仅仅是字符串),并且有序(按插入顺序存储)。

    let map = new Map();
    map.set("name", "Alice");
    map.set(1, "one");
    console.log(map.get("name")); // Alice
    console.log(map.get(1)); // one
    

  • Map 还支持直接遍历:

    for (let [key, value] of map) {console.log(key, value); // name Alice, 1 one
    }
    

9.2 Set

  • Set 是一个值的集合,其中每个值都是唯一的,不允许重复。

    let set = new Set([1, 2, 3, 3, 4]);
    console.log(set); // Set { 1, 2, 3, 4 }
    

  • Set 可以用来自动去重:

    let arr = [1, 2, 3, 3, 4];
    let uniqueArr = [...new Set(arr)];
    console.log(uniqueArr); // [1, 2, 3, 4]
    


10. 类(Class)

原理解析

10.1 类的定义

  • ES6 引入了更直观的 class 语法,进行面向对象编程:

    class Person {constructor(name, age) {this.name = name;this.age = age;}greet() {console.log(`Hello, I'm ${this.name}`);}
    }let p = new Person("Alice", 25);
    p.greet(); // "Hello, I'm Alice"
    

10.2 类的继承

  • class 还支持继承,使用 extends 关键字:

    class Student extends Person {constructor(name, age, grade) {super(name, age);this.grade = grade;}study() {console.log(`${this.name} is studying`);}
    }let student = new Student("Bob", 20, "A");
    student.greet(); // "Hello, I'm Bob"
    student.study(); // "Bob is studying"
    

  • super() 调用父类构造函数。


11. Promise 和异步操作

原理解析

11.1 Promise 的构造

  • Promise 是用于处理异步操作的一种机制,可以简化回调函数的使用,避免回调地狱

    let promise = new Promise((resolve, reject) => {let success = true;if (success) {resolve("Operation successful");} else {reject("Operation failed");}
    });promise.then((message) => {console.log(message); // "Operation successful"
    }).catch((error) => {console.log(error); // "Operation failed"
    });
    

11.2 Promise 的链式调用

  • then() 返回一个新的 Promise,因此可以链式调用多个异步操作:

    let promise = new Promise((resolve, reject) => resolve(10));promise.then(value => {return value * 2;
    }).then(value => {console.log(value); // 20
    });
    


12. 模块化(Modules, import/export

原理解析

12.1 导出(export

  • 使用 export 将函数、变量或类导出,使其可以在其他文件中使用:

    // math.js
    export const pi = 3.14;
    export function add(a, b) {return a + b;
    }
    

12.2 导入(import

  • 使用 import 从其他模块导入:

    // main.js
    import { pi, add } from './math.js';
    console.log(pi); // 3.14
    console.log(add(2, 3)); // 5
    


13. Symbol 类型

原理解析

13.1 唯一性

  • Symbol 是一个 唯一的原始数据类型,每个 Symbol 值都是唯一的。

    let sym1 = Symbol("desc");
    let sym2 = Symbol("desc");
    console.log(sym1 === sym2); // false
    

13.2 用作对象的私有属性

  • Symbol 可以用于创建私有对象属性,防止外部访问:

    const secret = Symbol("secret");
    let obj = {[secret]: "hidden"
    };
    console.log(obj[secret]); // "hidden"
    

    j

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

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

相关文章

深入理解设计模式之解释器模式

深入理解设计模式之解释器模式 在软件开发的复杂世界中,我们常常会遇到需要处理特定领域语言的情况。比如在开发一个计算器程序时,需要解析和计算数学表达式;在实现正则表达式功能时,要解析用户输入的正则表达式来匹配文本。这些场景都涉及到对特定语言的解释和执行,而解…

巧妙实现右键菜单功能,提升用户操作体验

在动态交互式图库中,右键菜单是一项能够显著提升用户操作便捷性的功能。它的设计既要响应用户点击位置,又需确保菜单功能与数据操作紧密结合,比如删除图片操作。以下将通过一段实际代码实现,展示从思路到实现的详细过程。 实现右键…

​​​​​​​​​​​​​​如何使用函数指针来调用函数

在C和C编程中,函数指针是一种特殊类型的指针,它指向一个函数而不是一个变量。使用函数指针可以动态地调用不同的函数,这在实现回调函数、事件处理、策略模式等场景中非常有用。 以下是如何定义和使用函数指针来调用函数的步骤: 定…

KEGG条形图绘制

原始数据 setwd("C:\\Users\\HUAWEI\\Desktop\\proteomic_WGCNA\\bacteria\\Eggnog\\KEGGhun") library(ggplot2) library(cols4all) dt <- read.csv("bacteria_KEGG.csv")dt$KEGG_Term <- factor(dt$KEGG_Term, levels rev(dt$KEGG_Term))#基础富集…

My Metronome for Mac v1.4.2 我的节拍器 支持M、Intel芯片

应用介绍 My Metronome 是一款适用于 macOS 的专业节拍器应用程序&#xff0c;旨在帮助音乐家、作曲家、学生和任何需要精确节奏控制的人进行练习。无论是进行乐器练习、音乐创作还是演出排练&#xff0c;My Metronome 都能为用户提供精准的节拍支持和灵活的功能&#xff0c;确…

宇树科技13家核心零部件供应商梳理!

2025年2月6日&#xff0c;摩根士丹利&#xff08;Morgan Stanley&#xff09;发布最新人形机器人研报&#xff1a;Humanoid 100: Mapping the Humanoid Robot Value Chain&#xff08;人形机器人100&#xff1a;全球人形机器人产业链梳理&#xff09;。 Humanoid 100清单清单中…

Part 3 第十二章 单元测试 Unit Testing

概述 第十二章围绕单元测试展开&#xff0c;阐述了单元测试的实践与重要性&#xff0c;通过对比其他测试类型&#xff0c;突出其特点&#xff0c;还介绍了单元测试的最佳实践、避免的反模式以及与测试替身相关的内容&#xff0c;为编写高质量单元测试提供指导。 章节概要 1…

【Vite SVG 图标方案:vite-plugin-svg-icons 指南】

&#x1f31f; Vite SVG 图标方案&#xff1a;vite-plugin-svg-icons 指南 &#x1f4dc; 背景与痛点 &#x1f30d; 前端图标演进史 1.0 &#x1f5bc;️ 图片图标 → 2.0 &#x1f3ad; 字体图标 → 3.0 &#x1f3a8; SVG 图标传统方案存在三大痛点&#xff1a; 字体图标…

go flag参数 类似Java main 的args

两部分内容 go run test1.go aa -name 123 1. 解析&#xff1a;aa -name 123 2. 解析&#xff1a;name 123 代码 package mainimport ("log""os" )func main() {log.Println("main ...")if len(os.Args) > 0 {for index, arg : ra…

酒店旅游API:数据交互的隐形桥梁——以携程API为例

一、API&#xff1a;酒店 和第三方服务无缝连接。 核心价值&#xff1a; 实时数据互通&#xff1a;房态、价格、库存秒级同步。业务流程自动化&#xff1a;预订、支付、确认全程无需人工干预。生态扩展&#xff1a;开发者可基于API构建定制化工具&#xff08;如比价插件、智能…

深入理解 JSP 与 Servlet:原理、交互及实战应用

一、引言 在 Java Web 开发领域,JSP(JavaServer Pages)和 Servlet 是两个至关重要的技术,它们共同构成了动态网页开发的基础。Servlet 作为服务器端的 Java 程序,负责处理客户端请求并生成响应;而 JSP 则是一种简化的 Servlet 开发方式,允许开发者在 HTML 页面中嵌入 J…

【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter20-JavaScript API

二十、JavaScript API JavaScript API 随着 Web 浏览器能力的增加&#xff0c;其复杂性也在迅速增加。从很多方面看&#xff0c;现代 Web 浏览器已经成为构建于诸多规范之上、集不同 API 于一身的“瑞士军刀”。浏览器规范的生态在某种程度上是混乱而无序的。一些规范如 HTML5&…

AI芯片的关键特征

AI芯片是专门为人工智能应用设计的芯片&#xff0c;以下是其应具备的关键特征&#xff1a; 强大的并行计算能力&#xff1a;AI任务如深度学习中的神经网络训练和推理&#xff0c;涉及大量矩阵运算和并行数据处理。AI芯片需有众多计算单元&#xff08;如GPU的大量流处理器、ASIC…

go 模块管理

go version 查看版本 go version go1.21.12 windows/amd64 需要保证:go的版本升级为1.11以上,go mod依赖的最底版本 go env 查看go的环境变量 go env 开启go mod # 标识开启go的模块管理 set GO111MODULE=on GO111MODULE有三个值:off, on和auto(默认值)。 GO111M…

Unity 适用于单机游戏的红点系统(前缀树 | 数据结构 | 设计模式 | 算法 | 含源码)

文章目录 功能包括如何使用 功能包括 红点数据本地持久化 如果子节点有红点&#xff0c;父节点也要显示红点&#xff0c;父节点红点数为子节点红点数的和&#xff1b; 当子节点红点更新时&#xff0c;对应的父节点也要更新&#xff1b; 当所有子节点都没有红点时&#xff0c…

使用API有效率地管理Dynadot域名,为域名部署DNS安全拓展(DNSSEC)

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

Web - JS基础语法与表达式

概述 这篇文章主要介绍了 JavaScript 的基础语法&#xff0c;包括代码书写位置、ERPL 环境、变量&#xff08;命名规则、默认值、初始化&#xff09;、数据类型&#xff08;基本和复杂&#xff0c;及各类型特点、转换&#xff09;、表达式和运算符&#xff08;算数、特殊算数、…

一台服务器将docker image打包去另一天服务器安装这个镜像

一台服务器将docker image打到去另一天服务器安装这个镜像 1. 打包2.另一台服务器执行 1. 打包 docker save -o nebula-graph-studio.tar harbor1.vm.example.lan/dockerio/vesoft/nebula-graph-studioxxx.tar 是打包好的文件 后面的是 docker image 2.另一台服务器执行 docke…

一周学会Flask3 Python Web开发-response响应格式

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 在HTTP响应中&#xff0c;数据可以通过多种格式传输。大多数情况下&#xff0c;我们会使用HTML格式&#xff0c;这也是Flask中…

TCP和Http协议

TCP 三次握手&#xff1a; 第一次握手 &#xff1a; 初始状态&#xff1a;开始时&#xff0c;客户端处于 CLOSED&#xff08;关闭&#xff09;状态&#xff0c;服务端处于 LISTEN&#xff08;监听&#xff09;状态&#xff0c;等待客户端的连接请求。客户端发送请求&#xff…