【ES6知识】简介、语法变化、解构赋值

news2025/1/10 11:01:34

文章目录

    • 一、概述
      • 1.1 ECMAScript 简介
      • 1.2 ECMAScript 背景
      • 1.3 ECMAScript 的历史
      • 1.4 ES6 的目标与愿景
      • 1.5 学习路线图
      • 1.6 环境搭建
    • 二、语法变化
      • 2.1 let 与 const
      • 2.2 解构赋值
      • 2.3 Symbol

一、概述

1.1 ECMAScript 简介

ES6, 全称 ECMAScript 6.0 ,是 JavaScript 的下一个版本标准,2015.06 发布。

ES6 主要是为了解决 ES5 的先天不足,比如 JavaScript 里并没有类的概念,但是目前浏览器的 JavaScript 是 ES5 版本,大多数高版本的浏览器也支持 ES6,不过只实现了 ES6 的部分特性和功能。

1.2 ECMAScript 背景

JavaScript 是大家所了解的语言名称,但是这个语言名称是商标( Oracle 公司注册的商标)。因此,JavaScript 的正式名称是 ECMAScript 。1996年11月,JavaScript 的创造者网景公司将 JS 提交给国际化标准组织 ECMA(European computer manufactures association,欧洲计算机制造联合会),希望这种语言能够成为国际标准,随后 ECMA 发布了规定浏览器脚本语言的标准,即 ECMAScript。这也有利于这门语言的开放和中立。

1.3 ECMAScript 的历史

ES6 是 ECMAScript 标准十余年来变动最大的一个版本,为其添加了许多新的语法特性。

  • 1997 年 ECMAScript 1.0 诞生。
  • 1998 年 6 月 ECMAScript 2.0 诞生,包含一些小的更改,用于同步独立的 ISO 国际标准。
  • 1999 年 12 月 ECMAScript 3.0诞生,它是一个巨大的成功,在业界得到了广泛的支持,它奠定了 JS 的基本语法,被其后版本完全继承。直到今天,我们一开始学习 JS ,其实就是在学 3.0 版的语法。
  • 2000 年的 ECMAScript 4.0 是当下 ES6 的前身,但由于这个版本太过激烈,对 ES 3 做了彻底升级,所以暂时被"和谐"了。
  • 2009 年 12 月,ECMAScript 5.0 版正式发布。ECMA 专家组预计 ECMAScript 的第五个版本会在 2013 年中期到 2018 年作为主流的开发标准。2011年6月,ES 5.1 版发布,并且成为 ISO 国际标准。
  • 2013 年,ES6 草案冻结,不再添加新的功能,新的功能将被放到 ES7 中;2015年6月, ES6 正式通过,成为国际标准。

1.4 ES6 的目标与愿景

以成为更好编写的开发语言为目标。

可以适应更复杂的应用;实现代码库之间的共享;不断迭代维护新版本。

1.5 学习路线图

img

1.6 环境搭建

查看浏览器兼容:http://kangax.github.io/compat-table/es6/4

支持ES6(ES2015)的浏览器:IE10+、Chrome、Firefox、移动端、NodeJS

ES6语法编译、转换

  • 在线转换 通过 script[src] 引入 browser.js
  • 提前编译

babel === browser.js

二、语法变化

2.1 let 与 const

关键字 var 的问题

  • 可以重复声明

    var a = 10;
    var a = 20;
    console.log("a:",a);
    
  • 无法限制修改

    var b = 10;
    b = 20;
    console.log("b:",b);
    
  • 没有块级作用域(存在变量提升)

    {
        var a = 10;
    }
    ​
    if(true){
        var b = 10;
    }
    console.log("a:",a,"b:",b)
    ​
    for(var i = 0; i < 10; i++){
        console.log("i:",i);
    }
    console.log("i:",i);
    

2.2 解构赋值

  • 左右两边结构必须一样

    // 错误示例
    let [a, b] = {a:1, b:2};
    // 类型错误 TypeError: {(intermediate value)(intermediate value)} is not iterable
    
  • 右边必须是一个合法值

    // 错误示例
    let {a, b} = {12, 5}; //{12, 5} 啥也不是
    // 语法错误 SyntaxError: Unexpected token ','
    
  • 声明和赋值不能分开(必须在一句话中完成)

    // 错误示例
    let [a,b];
    [a, b] = [1, 2];
    // SyntaxError: Missing initializer in destructuring declaration
    // 语法错误 在解构声明中缺少初始化式
    

2.3 Symbol

ES6 引入了一种新的原始数据类型 Symbol ,表示独一无二的值,最大的用法是用来定义对象的唯一属性名,这样就从根本上防止属性名的冲突。

Symbol 函数栈不能用 new 命令,因为 Symbol 是原始数据类型,不是对象。基本上可以说,它是一种类似于字符串的数据类型。

Symbol 函数可以接受一个字符串作为参数,表示对 Symbol 实例的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区分。

let s1 = Symbol('foo');
let s2 = Symbol('bar');
​
s1 // Symbol(foo)
s2 // Symbol(bar)
​
s1.toString() // "Symbol(foo)"
s2.toString() // "Symbol(bar)"

上面代码中,s1s2是两个 Symbol 值。如果不加参数,它们在控制台的输出都是Symbol(),不利于区分。有了参数以后,就等于为它们加上了描述,输出的时候就能够分清,到底是哪一个值。

ES2019 提供了一个实例属性description,直接返回 Symbol 的描述。

const sym = Symbol('foo');
sym.description // "foo"

由于每一个 Symbol 的值都是不相等的,所以 Symbol 作为对象的属性名,可以保证属性不重名。这对于一个对象由多个模块构成的情况非常有用,能防止某一个键被不小心改写或覆盖。

let mySymbol = Symbol("foo");
​
// 第一种写法
let a = {};
a[mySymbol] = 'Hello!';
​
// 第二种写法
let a = {
  [mySymbol]: 'Hello!'
};
​
// 第三种写法
let a = {};
Object.defineProperty(a, mySymbol, { value: 'Hello!' });
​
// 以上写法都得到同样结果
a[mySymbol] // "Hello!"

注意,Symbol 值作为对象属性名时,不能用点运算符

const mySymbol = Symbol();
const a = {};
​
a.mySymbol = 'Hello!';//这里mySymbol作为a的属性进行赋值
a[mySymbol] // undefined
a['mySymbol'] // "Hello!"

上面代码中,因为点运算符后面总是字符串,所以不会读取mySymbol作为标识名所指代的那个值,导致a的属性名实际上是一个字符串,而不是一个 Symbol 值。同理,在对象的内部,使用 Symbol 值定义属性时,Symbol 值必须放在方括号之中。

Symbol 作为属性名,遍历对象的时候,该属性不会出现在for...infor...of循环中,也不会被Object.keys()Object.getOwnPropertyNames()JSON.stringify()返回。如果要读取到一个对象的 Symbol 属性,可以通过 Object.getOwnPropertySymbols()Reflect.ownKeys() 取到。

let syObject = {};
syObject[sy] = "kk";
console.log(syObject);
 
for (let i in syObject) {
  console.log(i);
}    // 无输出
 
Object.keys(syObject);                     // []
Object.getOwnPropertySymbols(syObject);    // [Symbol(key1)]
Reflect.ownKeys(syObject);                 // [Symbol(key1)]

Symbol 值作为属性名时,该属性是公有属性不是私有属性,可以在类的外部访问。

Symbol.for() 类似单例模式,首先会在全局搜索被登记的 Symbol 中是否有该字符串参数作为名称的 Symbol 值,如果有即返回该 Symbol 值,若没有则新建并返回一个以该字符串参数为名称的 Symbol 值,并登记在全局环境中供搜索。

let yellow = Symbol("Yellow");
let yellow1 = Symbol.for("Yellow");
yellow === yellow1;      // false
 
let yellow2 = Symbol.for("Yellow");
yellow1 === yellow2;     // true

Symbol.keyFor() 返回一个已登记的 Symbol 类型值的 key ,用来检测该字符串参数作为名称的 Symbol 值是否已被登记。

let s1 = Symbol.for("foo");
Symbol.keyFor(s1) // "foo"
​
let s2 = Symbol("foo");
Symbol.keyFor(s2) // undefined

上面代码中,变量s2属于未登记的 Symbol 值,所以返回undefined

注意,Symbol.for()为 Symbol 值登记的名字,是全局环境的,不管有没有在全局环境运行。

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

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

相关文章

高性能MySQL实战(二):索引 | 京东物流技术团队

我们在上篇 高性能MySQL实战&#xff08;一&#xff09;&#xff1a;表结构 中已经建立好了表结构&#xff0c;这篇我们则是针对已有的表结构和搜索条件为表创建索引。 1. 根据搜索条件创建索引 我们还是先将表结构的初始化 SQL 拿过来&#xff1a; CREATE TABLE service_lo…

成功解决怎么使用Arthas定位CPU突然飙高的问题

1.Arthas的下载地址 https://alibaba.github.io/arthas/arthas-boot.jar 2.启动Arthas&#xff08;提前下载放到环境上&#xff09; java -jar arthas-boot.jar 3.dashboard 命令查看线程&#xff0c;CPU情况 可以看到发现确实有几个线程CPU占用过高 4.thread命令查看最繁…

K8S基础概念

1、Node Node作为集群中的工作节点&#xff0c;运行真正的应用程序&#xff0c;在Node上Kubernetes管理的最小运行单元是Pod。Node上运行着Kubernetes的Kubelet、kube-proxy服务进程&#xff0c;这些服务进程负责Pod的创建、启动、监控、重启、销毁、以及实现软件模式的负载均…

边缘计算技术

边缘计算是指在靠近数据源头的网络边缘侧&#xff0c;融合网络、计算、存储、应用核心能力的分布式开放平台&#xff0c;就近提供边缘智能服务&#xff0c;满足行业数字化在敏捷连接、实时业务、数据优化、应用智能、安全与隐私保护等方面的关键需求。它可以作为连接物理和数字…

count(*) 和 count(1) 有什么区别?哪个性能最好?

哪种 count 性能最好&#xff1f; count() 是什么&#xff1f; count() 是一个聚合函数&#xff0c;函数的参数不仅可以是字段名&#xff0c;也可以是其他任意表达式&#xff0c;该函数的作用是统计符合查询条件的记录中&#xff0c;函数指定的参数不为 NULL 的记录由多少条。…

淘宝api:本地图片上传至淘宝 获取url(联合拍立淘接口)

upload_img-上传图片到淘宝 请求参数 请求参数&#xff1a;imgcodehttps://img14.360buyimg.com/n0/jfs/t1/52280/38/7464/140698/5d511f6bE08290bd7/f0bb32ddb47451e8.jpg 参数说明&#xff1a;imgcode:base64加密后的图片内容(post方式),或者是直接上传(file方式) 响应参数…

无涯教程-JavaScript - NPV函数

描述 NPV函数通过使用折现率以及一系列未来付款(负值)和收入(正值)来计算投资的净现值。 语法 NPV (rate,value1,[value2],...)争论 Argument描述Required/OptionalRateThe rate of discount over the length of one period.RequiredValue11 to 254 arguments representing…

SQL数据分析实战:从导入到高级查询的完整指南

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 当进行SQL数据分析实战时…

2023年上半年系统规划与管理师下午真题及答案解析

试题一(25分) 小李是跨国公司新任命的IT服务经理&#xff0c;帮助提升中国区总部的IT服务管理水平。中国区总部的运维管理体系运营了近三年&#xff0c;内外部环境发生了很多变化&#xff0c;其中&#xff1a; (1)内部变化包括团队组织结构调整、部分团队精简改为外包支持、I…

LeetCode_拓扑排序_BFS_中等_1462.课程表 IV

目录 1.题目2.思路3.代码实现&#xff08;Java&#xff09; 1.题目 你总共需要上 numCourses 门课&#xff0c;课程编号依次为 0 到 numCourses - 1 。你会得到一个数组 prerequisite &#xff0c;其中 prerequisites[i] [ai, bi] 表示如果你想选 bi 课程&#xff0c;你必须先…

解决Spring Boot文件上传问题:`MultipartException` 和 `FileUploadException`

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f6e0;️ 全栈技术 Full Stack: &#x1f4da…

aardio语言的通用数据表维护

import win.ui; /*DSG{{*/ var winform win.form(text"通用数据表维护";right617;bottom427;bgcolor15780518) winform.add( buttonAdd{cls"button";text"增加空行";left469;top40;right564;bottom80;flat1;z2}; buttonDel{cls"button&quo…

应用在触控一体机触摸屏中的电容式触控芯片

从智能手机出现以来&#xff0c;触控一体机行业迎来了飞速的发展&#xff0c;这种人机交互的方式&#xff0c;迅速改变了人们的生活&#xff0c;一时之间&#xff0c;触控无处不在&#xff0c;从智能手机延伸到平板电脑&#xff0c;再到商业领域的诸多触控产品&#xff0c;可以…

浅析三维模型3DTile格式轻量化处理常见问题与处理措施

浅析三维模型3DTile格式轻量化处理常见问题与处理措施 三维模型3DTile格式的轻量化处理是大规模三维地理空间数据可视化的关键环节&#xff0c;但在实际操作过程中&#xff0c;往往会遇到一些问题。下面我们来看一下这些常见的问题以及对应的处理措施。 变形过大&#xff1a;压…

【C++】详解std::mutex

2023年9月11日&#xff0c;周一中午开始 2023年9月11日&#xff0c;周一晚上23&#xff1a;25写完 目录 概述头文件std::mutex类的成员类型方法没有std::mutex会产生什么问题问题一&#xff1a;数据竞争问题二&#xff1a;不一致lock和unlock死锁 概述 std::mutex是C标准库中…

2024苹果手机软件备份软件工具iMazing

很多人都会忘记备份iOS 资料&#xff0c;或者因为设置备份时间、位置等不到位&#xff0c;导致需要用的时候找不到备份。接下来&#xff0c;小编就来教大家iMazing软件备份功能的几个设置小技巧&#xff0c;都在软件界面的“选项”内调整&#xff0c;减少备份过程中的出错。 图…

【Electron】electron与cljs的处理

实现效果: 前言&#xff1a; 如何用cljs的方式&#xff0c;编写electron应用&#xff0c;可以实现多窗体应用 要使用ClojureScript&#xff08;CLJS&#xff09;编写一个 Electron 应用程序&#xff0c;并实现多窗体功能&#xff0c;您可以按照以下步骤进行操作&#xff1a; …

管易云与金蝶云星空对接集成仓库查询打通仓库新增

管易云与金蝶云星空对接集成仓库查询打通仓库新增 接通系统&#xff1a;管易云 管易云是金蝶旗下专注提供电商企业管理软件服务的子品牌&#xff0c;先后开发了C-ERP、EC-OMS、EC-WMS、E店管家、BBC、B2B、B2C商城网站建设等产品和服务&#xff0c;涵盖电商业务全流程。 对接目…

KEIL5工程改名3步骤

实际上无法另存&#xff0c;通过复制改名方式来间接完成。 如下3个步骤可以完成改名 &#xff08;1&#xff09;直接修改FX3U_STM32F407.uvprojx 文件名称&#xff0c;体现在左上角第一行&#xff0c;Project&#xff1a;xxxx &#xff08;2&#xff09;点开工程option&#…

SEO和SEM的区别与联系:优化和推广的艺术

SEO和SEM的区别与联系&#xff1a;优化和推广的艺术 在当今商业竞争日益激烈的市场环境下&#xff0c;企业对于网站的建设和管理越来越重视。为了吸引更多的潜在客户&#xff0c;企业不得不花费大量时间和资源来进行SEO优化和SEM推广。虽然二者都是提高网站流量的有效方法&…