ECMAScript6之一

news2025/4/7 14:38:16

目录

一、介绍

二、新特性

2.1 let 和 const 命令

2.2 es6的模板字符串

2.3 增强的函数

2.4 扩展的字符串、对象、数组功能

2.5 解构赋值

2.6 Symbol

2.7 Map 和 Set

2.8 迭代器和生成器

2.9 Promise对象

2.10 Proxy对象

2.11 async的用法

2.22 类class

2.23 模块化实现


一、介绍

        ECMAScript 6.0(以下简称ES6,ES2015)是JavaScript语言的下一代标准,于2015年6月正式发布。使JavaScript语言可以用来编写复杂的大型应用程序。

二、新特性

2.1 let 和 const 命令

var

1、变量提升;

2、可以重复声明,覆盖;

let

1、声明变量,没有变量提升;

2、块作用域;

3、相同作用域内不能重复声明;

作用:1、for循环是一个经典的例子:

const arr = [];
for(let i = 0; i<10; i++){
    arr[i] = function(){
        return i;
    }
}
console.log(arr[5]());

2、不会污染全局变量。

在知道变量值需要被修改的情况下使用let

const

1、声明常量,一旦被声明,无法修改;

2、可以修改常量对象内部中的属性;

3、不能重复声明;

默认情况下使用const

2.2 es6的模板字符串

比较
传统字符串

1、使用单引号 '' 或者双引号 ""

2、多行文本需拼接,直接插入换行符会报错。

模版字符串

1、使用反单引号(backquote) `` 

2、可以插入表达式:`${express}`,express可以是任意常量、变量、函数调用,前后可有任意的其他合法字符;

3、可以多行文本,允许直接插入换行符。

2.3 增强的函数

1、带参数默认值的函数

ES5ES6
function add(a,b){
    a = a || 10;
    b = b || 20;
    return a+b;
}
console.log(add()); // 30

函数add需要两个参数,函数中先判断a、b两个参数是否有赋值,若没有,则默认值为10、20.

function add(a=10,b=20){
    return a+b;
}
console.log(add());// 30

1、可以看出哪些参数是可以省略的;

2、利于代码优化;

2、默认的表达式也可以是一个函数

function add( a, b = getVal(5) ){
    return a + b;
}
function getVal(val){
    return val + 5;
}
console.log(add(10)); // 20

3、 剩余参数

        把多个独立的合并到一个数组中

// 剩余参数:由三个点... 和一个紧跟着的具名参数指定 ...keys
    function pick(obj, ...keys){
        // ...keys 解决了arguments的问题,keys可以任意命名,建议根据需求命名
        // arguments 是伪数组
        let result = Object.create(null);
        for (let index = 0; index < keys.length; index++) {
            result[keys[i]] = obj[keys[i]];
        }
        return result;
    }
    let book = {
        title: '前端',
        author: 'XXX',
        year: 2023
    }
    let bookData = pick(book,'title','author');
    console.log(bookData); // {title:'前端',author:'XXX'}

4、 扩展运算符

        将一个数组分割,并将各个项作为分离的参数传给函数

// es5 处理数组中的最大值,使用apply
const arr = [10,20,30,33,45,5,100,90];
console.log(Math.max.apply(null,arr)); //100
// es6 使用扩展运算符
console.log(Math.max(...arr)); // 100

5、箭头函数

 使用 => 来定义,function(){} 等价于 ()=>{}

let add = (a,b)=>{
    return a + b;
}
// 简写
// let add = (a,b) => (a + b);
console.log(add(10,20)); // 30
// 仅有一个参数时可简写
let add1 = val => {
    return val + 5;
}
// 还可简写为
// let add1 = val => (val+5);
// let add1 = val => val; // 5
console.log(add1(10));  // 15

 箭头函数的this指向:

        箭头函数没有自己的this对象,内部的this值只能通过查找作用域链来确定。es5中的this指向取决于调用该函数的上下文对象。

注意事项:

1)如果箭头函数不需要参数或需要多个参数,就使用一个圆括号代表参数部分。

var f = () => 10;

var add = (a,b) => a + b;

2) 如果箭头函数的代码块部分多于一条语句,就要使用大括号将它们括起来,并且使用return语句返回。

var add = (a,b) => {return a + b;}

 3)由于大括号被解释为代码块,如果箭头函数返回的是一个对象,必须在对象外面加上括号,否则报错。

// 报错
let getTemp = id => {id: id, name: "张三"};
// 不报错
let getTemp = id => ({id: id, name: "张三"})

4) 不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。

5)不能使用new关键字来实例化对象,箭头函数不是一个对象,其实就是一个语法糖。

2.4 扩展的字符串、对象、数组功能

1、扩展的对象功能

1)es6直接写入变量和函数,作为对象的属性和方法

const name = '张三', age = 20;
const person = {
    name, //等价于name: name
    age,
    sayName: function(){
       console.log(this.name); 
    }
}
person.sayName(); // 张三

 2)对象的方法

方法一: is(),比较两个值是否严格相等,与严格比较运算符 === 的行为基本一致。

console.log(Object.is(NaN,NaN));  // true

console.log(NaN === NaN); // false

方法二: 对象的合并: Object.assign(target,obj1,obj2,......),第一个参数是目标对象,后面的参数都是源对象,若有同名属性,则后面的属性会覆盖前面的属性。

// 浅拷贝,返回合并之后的新对象
let newObj = Object.assign({},{name:'张三'},{age:20});
console.log(newObj); //{name: '张三', age: 20}

 如果源对象某个属性的值是个对象,那么目标对象拷贝得到的是这个对象的引用,源对象的任何变化都会反映到目标对象上面。

2、扩展的数组功能

方法一:from()  将伪数组转换成真正的数组

function add(){
    console.log(arguments); // 伪数组,缺少数组方法
    // es5 转换
    let arr = [].slice.call(arguments);
    console.log(arr);

    //es6 
    let arrEs6 = Array.from(arguments);
    console.log(arrEs6);
}
add(1,2,3)

 主要应用于遍历dom,例:

<ul>
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
</ul>
let lis = document.querySelectorAll('li');
console.log(Array.from(lis));
// 扩展运算符  将伪数组转换成真正的数组
console.log([...lis]);

        from() 方法还可接收一个函数作为第二个参数,用来对每个元素进行处理,将处理后的值放入返回的数组。

let liCons = Array.from(lis, ele => ele.textContent);
console.log(liCons); //['1', '2', '3', '4']

        还可以应用于判断字符串的长度:

let str = "我爱你,中国!";
console.log(Array.from(str).length); // 7

方法二: of() 将任意的数据类型,转换成数组

console.log(Array.of(3,11,20,[1,2,3],{id:123})); // [3, 11, 20, [1,2,3], {id:123}]

 方法三:copyWithin() 在当前数组内部,将指定位置的成员复制到其他位置(会覆盖原有成员),然后返回当前数组。

接收三个参数:

参数一: target --必需,从目标位置开始替换数据,如果为负值,表示倒数。

参数二: start --可选,从该位置开始读取数据,默认为0,负值,表示从末尾开始计算

参数三: end --可选,到该位置停止读取数据,默认等于数组长度,负值,表示从末尾开始计算

// 表示从位置3开始到数组结尾(8、9、10),替换从0号位置开始的数值(1、2、3)
console.log([1,2,3,8,9,10].copyWithin(0,3)); //[8, 9, 10, 8, 9, 10]

 方法四:find() 找出第一个符合条件的数组成员,如果没有符合条件的成员,则返回undefined

let num = [1,2,-10,-20,9,2].find(n => n<0);
console.log(num); // -10

方法五:findIndex() 返回第一个符合条件的数组成员的位置,如果所有成员都不符合条件,则返回-1

let index = [1,2,-10,-20,9,2].findIndex(n => n<0);
console.log(index); // 2

 方法六: keys() 对键名的遍历

for(let index of ['a','b'].keys()){
    console.log(index);
}
// 0
// 1

  方法七: values() 对值的遍历

for(let ele of ['a','b'].values()){
    console.log(ele);
}
// a
// b

   方法八: entries() 对键值对的遍历

for(let [index,ele] of ['a','b'].entries()){
    console.log(index,ele);
}
// 0 'a'
// 1 'b'

 以上方法皆返回一个遍历器,可以使用for...of循环进行遍历。

方法九: includes() 返回一个布尔值,表示某个数组是否包含给定的值,有返回true,没有返回false

console.log([1,2,3].includes(2)); // true

2.5 解构赋值

 是对赋值运算符的一种扩展,针对数组和对象来进行操作,优点是代码书写上简洁易读。

1) 对象解构赋值

let node = {
    type: 'iden',
    name: 'foo'
}
// 完全解构
let {type,name} = node;
console.log(type,name); //iden foo
let obj = {
    a: {
        name: '詹丹'
    },
    b:[],
    c:'hello world'
}
// 不完全解构,可忽略
let {a} = obj;
console.log(a); // {name: '詹丹'}
// 搭配使用剩余运算符
let {a,...res} = obj;
console.log(res); // {b:[],c:"hello world"}
// 默认值
let {a, b=30} = {a:20}
console.log(a,b); //20 30

 2)数组的解构赋值

// 完全解构
let [a, b, c] = [1, 2, 3];
console.log(a,b,c); //1 2 3
// 嵌套数组解构
let [foo, [[bar], baz]] = [1, [[2], 3]];
console.log(foo, bar, baz); //1 2 3

let [, , third] = ["foo", "bar", "baz"];
third // "baz"

let [x, , y] = [1, 2, 3];
x // 1
y // 3

let [head, ...tail] = [1, 2, 3, 4];
head // 1
tail // [2, 3, 4]


// 如果解构不成功,变量的值就等于undefined
let [x, y, ...z] = ['a'];
x // "a"
y // undefined
z // []
// 不完全解构
let [x, y] = [1, 2, 3];
x // 1
y // 2

let [a, [b], d] = [1, [2, 3], 4];
a // 1
b // 2
d // 4

 如果等号的右边不是可遍历的结构,将会报错。

// 报错
let [foo] = 1;
let [foo] = false;
let [foo] = NaN;
let [foo] = undefined;
let [foo] = null;
let [foo] = {};

// Uncaught SyntaxError: Identifier 'foo' has already been declared

2.6 Symbol

2.7 Map 和 Set

2.8 迭代器和生成器

2.9 Promise对象

2.10 Proxy对象

2.11 async的用法

2.22 类class

2.23 模块化实现

路漫漫其修远兮,吾将上下而求索!

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

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

相关文章

linux内核中kmalloc与vmalloc

kmalloc 和 vmalloc 是 Linux 内核中的两种内存分配方法&#xff0c;它们都用于为内核分配内存&#xff0c;但它们在使用和管理内存方面存在一些重要差异。下面我们详细讨论这两种内存分配方法的异同。 相同点&#xff1a; 都是内核空间的内存分配方法。都可以用于动态分配内…

anaconda目录下的pkgs文件夹很大,可以删除吗?

pkgs这个目录占用了6GB的硬盘空间。 其实里面是conda安装第三方包的时候保存在本地的下载文件&#xff0c;大部分是可以删除的。 只是删除后&#xff0c;后续你需要创建虚拟环境的时候或者在虚拟环境下pip安装第三方库的时候&#xff0c;会从网络去下载&#xff0c;没法直接从…

Jmeter的常用设置(一)

文章目录 前言一、Jmeter设置中文 方法一&#xff08;临时改为中文&#xff09;方法二&#xff08;永久改成中文&#xff09;二、启动Jmeter的两种方式 方法一&#xff08;直接启动&#xff0c;不打开cmd窗口&#xff09;方法二&#xff08;带有cmd窗口的启动&#xff09;三、调…

【xxl-job】本地部署并接入xxl-job到项目中

本地部署并接入xxl-job到项目中 一、xxl-job简介 XXL-JOB是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线&#xff0c;开箱即用。 什么是分布式任务调度 通常任务调度的程序是集成在应用…

SparkCoreDAG

DAG有向无环图 倒推 故推导程序的执行计划时&#xff0c;先看代码有几个action算子&#xff0c;从action倒推 一个action会产生一个JOB&#xff08;DAG&#xff09;&#xff08;即一个应用程序内的子任务&#xff09; 一个action一个Job一个DAG 一个application里面可以有多…

Latex:画图识别符号

http://detexify.kirelabs.org/classify.html

RDMA RoCev2 CM建链和Socket建链测试

前言 RDMA在高性能计算&#xff0c;AI大模型训练中发挥着重要的作用。 主流支持RDMA的协议有IB、RoCev1、RoCev2、iWARP。 其中RoCev2是应用最广泛的协议&#xff0c;因为其RDMA over UDP/IP&#xff0c;不依赖昂贵的IB网络设备&#xff0c;同时支持路由&#xff0c;性能上也…

Azure Kinect 之 Note(一)

Azure Kinect Azure Kinect DK 是一款开发人员工具包&#xff0c;配有先进的AI 传感器&#xff0c;提供复杂的计算机视觉和语音模型。 Kinect 将深度传感器、空间麦克风阵列与视频摄像头和方向传感器整合成一体式的小型设备&#xff0c;提供多种模式、选项和软件开发工具包(S…

Web开发模式

Web开发介绍 1 什么是web开发 Web&#xff1a;全球广域网&#xff0c;也称为万维网(www World Wide Web)&#xff0c;能够通过浏览器访问的网站。 所以Web开发说白了&#xff0c;就是开发网站的&#xff0c;例如下图所示的网站&#xff1a;淘宝&#xff0c;京东等等 那么我们…

【*2400 线段树】CF444 C

Problem - C - Codeforces 题意&#xff1a; 思路&#xff1a; 首先询问的是权值和&#xff0c;那么维护一个区间和sum&#xff0c;因此pushup部分就好了 考虑修改&#xff0c;区间修改&#xff0c;因此要打标记 一次修改对区间和的贡献不能直接计算&#xff0c;因此我们考…

8-1、Deployment运行应用的机制

Kubernetes 通过各种 Controller 来管理 Pod 的生命周期。为了满足不同业务场景,Kubernetes 开发了 Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job 、 CronJob 等多种 Controller。 用户通过 kubectl 创建 Depl…

ENSP模拟器如何设置命令行和描述框的背景颜色及字体

ENSP模拟器如何设置命令行和描述框的背景颜色及字体 选择“菜单 > 工具 > 选项”&#xff0c; 在弹出界面中选择“字体设置”。 单击“字体”后的“选择”设置字体&#xff0c;单击“字体颜色”后的“选择”设置字颜色&#xff0c;单击“背景颜色”后的“选择”设置…

UnityVR--机械臂场景11-简单流水线应用3

目录 一. 前言 二. 设置一个定时器 三. 添加机械臂事件 四. 机械臂控制函数OnArmCtrl 五. 定义上面的3个机械臂移动方法 六. 机械臂各关节转动控制 七. 场景实现 八. 完整代码 一. 前言 上一篇使用了DoTween插件&#xff0c;并且改写了事件的相关参数&#xff0c;本篇…

jenkins 关闭关闭CSRF Protection(跨站请求伪造保护)

jenkins版本 我的jenkins版本是&#xff1a;2.332.4 背景 Jenkins版本自2.204.6以来的重大变更有&#xff1a;删除禁用 CSRF 保护的功能。 从较旧版本的 Jenkins 升级的实例将启用 CSRF 保护和设置默认的发行者&#xff0c;如果之前被禁用。 解决方法 老版本Jenkins的CSRF…

QT各种控件常用样式表qss示例

1、表格控件QTableWidget和QTableView 这个控件比较复杂&#xff0c;里面包含了滑动条、表头&#xff08;又细分为内容区/空白区&#xff09;、表格、整体、左上角按钮等多种不同的元素&#xff0c;他们之间有复杂的叠层关系。需要通过各种“选择器”来指定样式的作用范围。 …

解决openKylin显示不能自适应VMware窗口大小的教程

目录 前言解决步骤效果图 前言 相信很多朋友们使用VMware配置成功openKylin后对遇到不能全屏显示的问题很头痛&#xff0c;今天我用我自己的电脑为例&#xff0c;给大家示范一下。 网上对于虚拟机不能自适应VMware主要有两个方案 一个是编辑虚拟机设置----显示器----指定监…

如何用ChatGPT做咨询师,附Prompt

对基本问题研究得不深不透、得不到可靠的分析框架支持的情况下&#xff0c;仓促采取就事论事的应对措施 &#xff0c;由于未能触及事情的根本&#xff0c;往往非但不能获得预期的效果&#xff0c;相反可能引发新的矛盾。 ——吴敬琏&#xff08;著名经济学家&#xff0c;国务院…

【JavaEE初阶】JavaScript基础语法

摄影分享: 文章目录 1.初识JavaScript1.1JavaScript简介1.2JavaScript 和 HTML 和 CSS 之间的关系1.3JavaScript 运行过程1.4JavaScript 的组成 2.JS基础语法2.1在HTML中引入JS2.2第一个JS程序2.3变量2.4JS的内置类型2.4.1数字2.4.2字符串2.4.3布尔类型2.4.4undefined类型和nu…

821. 跳台阶

链接&#xff1a; 821. 跳台阶 - AcWing题库 题目&#xff1a; 一个楼梯共有 nn 级台阶&#xff0c;每次可以走一级或者两级&#xff0c;问从第 00 级台阶走到第 nn 级台阶一共有多少种方案。 输入格式 共一行&#xff0c;包含一个整数 nn。 输出格式 共一行&#xff0c;包含一…

性能测试:Jmeter压测过程中的短信验证码读取

目录 问题背景 解决思路 实现方法 1. 建立JDBC连接 2. 使用JDBC请求获取验证码 3. 使用正则将验证码提取并使用 问题背景 现如今国内的大部分软件或者网站应用&#xff0c;普遍流行使用短信业务&#xff0c;比如登录、注册以及特定的业务通知等。 对于这些业务&#xff…