ES6 新特性讲解 梦里梦外; 2024-03-30 12:18 61阅读 0赞 **目录** 一:什么是ECMAScript? 1.ECMAScript的快速发展 二:let 和 const 命令 三:字符串扩展 四:解构表达式 五:函数优化 六:map和reduce 七:扩展运算符 八:Promise 九:set和map 十:class(类)的基本语法 十一:Generator函数 十二:转码器 十三:修饰器 十四:模块化 现在使用主流的前端框架中,如 ReactJS 、 Vue.js 、 angularjs 等,都会使用到 ES6的新特性,作为一名高级工程师而言, ES6 也就成为了必修课。 ES6 ,是 ECMAScript 6 的简称,它是 JavaScript 语言的下一代标准,己于 2015 年 6 月正式发 布。 它的目标是使 JavaScript 语言可以用于编写复杂的大型应用程序,成为企业级开发语言。 ## 一:**什么是****ECMAScript****?** ## 来看下前端的发展历程: > **web1.0时代:** * 最初的网页以HTML为主,是纯静态的网页。网页是只读的,信息流只能从服务的到客户端单向流通。**开发人员也只关心页面的样式和内容**即可。 > **web2.0时代:** * 1995年,网景工程师Brendan Eich 花了10天时间设计了JavaScript语言。 * 1996年,微软发布了JScript,其实是JavaScript的逆向工程实现。 * 1997年,为了统一各种不同script脚本语言,ECMA(欧洲计算机制造商协会)以JavaScript为基础,制定了 * ECMAscript 标准规范。JavaScript和JScript都是 ECMAScript 的标准实现者,随后各大浏览器厂商纷纷实现了 ECMAScript 标准。 所以, ECMAScript 是浏览器脚本语言的规范,而各种我们熟知的 js 语言,如 JavaScript 则是规范的具体实现。 #### **1.ECMAScript****的快速发展** #### 而后, ECMAScript 就进入了快速发展期。 * 1998年6月,ECMAScript 2.0 发布。 * 1999年12月,ECMAScript 3.0 发布。这时,ECMAScript 规范本身也相对比较完善和稳定了,但是接下来的 * 事情,就比较悲剧了。 * 2007年10月。。。。ECMAScript 4.0 草案发布。 * 这次的新规范,历时颇久,规范的新内容也有了很多争议。在制定ES4的时候,是分成了两个工作组同时工作的。 1. 一边是以 Adobe, Mozilla, Opera 和 Google为主的 ECMAScript 4 工作组。 2.一边是以 Microsoft 和 Yahoo 为主的 ECMAScript 3.1 工作组。 ECMAScript 4 的很多主张比较激进,改动较大。而 ECMAScript 3.1 则主张小幅更新。最终经过 TC39 的会议,决定将一部分不那么激进的改动保留发布为 ECMAScript 3.1 ,而 ES4 的内容,则延续到了后来的 ECMAScript5和 6 版本中 * 2009年12月,ECMAScript 5 发布。 * 2011年6月,ECMAScript 5.1 发布。 * 2015年6月,ECMAScript 6,也就是 ECMAScript 2015 发布了。 并且从 ECMAScript 6 开始,开始采用年号 * 来做版本。即 ECMAScript 2015,就是ECMAScript6。 * 2016年 6月,小幅修订的《ECMAScript 2016标准》 (简称 ES2016)如期发布,这个版本可以看作是 ES6.1 版,因为两者的差异非常小(只新增了数组实例的 includes 方法 和指数运算符),基本上可以认为是同 一个标准 。 * 2017 年 6 月发布了ES2017 标准。 因此, ES6 既是一个历史名词,也是一个泛指,含义是 5.1 版本以后的 JavaScript 的下一代 标准,涵盖了 ES2015、 ES2016 、 ES2017 等,而 ES2015 则是正式名称,特指当年发布的正式 版本的语言标准 。 ## 二:**let** **和** **const** **命令** ## > var 之前,我们写 js 定义变量的时候,只有一个关键字: var var 有一个问题,就是定义的变量有时会莫名奇妙的成为全局变量。 例如这样的一段代码: for(var i = 0; i < 5; i++){ console.log(i); } console.log("循环外:" + i) 运行打印的结果是如下: ![161d91182e564c23b1aa632a29e733a4.png][] 可以看出,在循环外部也可以获取到变量 i 的值,显然变量 i的作用域范围太大了,在做复杂页面时,会带来很大的问题。 > **let** let 所声明的变量,只在 let 命令所在的代码块内有效。 我们把刚才的 var 改成 let 试试: for (let i = 0; i <5; i++) { console.log(i); } console.log("循环外:"+i); 结果: ![c35b3a72d2b34881928d3373122e3dc5.png][] 这样,就把变量的 i 的作用域控制在了循环内部。 > **const** const 声明的变量是常量,不能被修改,类似于 java 中 fifinal 关键字。 const str="abc"; console.log(str); //重新赋值 str="123"; console.log(str); ![b00370eaac734f1f9a911b9eceaa0d4b.png][] 可以看到,变量str的值是不能修改的。 ## ## ## 三:**字符串扩展** ## 在 ES6 中,为字符串扩展了几个新的 API : <table style="width:500px;"> <tbody> <tr> <td> <div> <span style="color:#333333;"> includes() </span> </div> </td> <td><span style="color:#333333;">返回布尔值,表示是否找到了参数字符串</span></td> </tr> <tr> <td><span style="color:#333333;">startsWith() </span></td> <td><span style="color:#333333;">返回布尔值,表示参数字符串是否在原字符串的头部</span></td> </tr> <tr> <td><span style="color:#333333;">endsWith() </span></td> <td><span style="color:#333333;">返回布尔值,表示参数字符串是否在原字符串的尾部</span></td> </tr> </tbody> </table> 测试一下: let str = "hello tangyuan"; //includes() :返回布尔值,表示是否找到了参数字符串 console.log(str, " 中是否包含了tangyuan => ", str.includes("tangyuan")); console.log(str, " 中是否包含了libai => ", str.includes("libai")); //startsWith() :返回布尔值,表示参数字符串是否在原字符串的头部 console.log(str, " 中是否以hello开头 => ", str.startsWith("hello")); console.log(str, " 中是否以tangyuan开头 => ", str.startsWith("tangyuan")); //endsWith() :返回布尔值,表示参数字符串是否在原字符串的尾部。 console.log(str, " 中是否以hello结束 => ", str.endsWith("hello")); console.log(str, " 中是否以tangyuan结束 => ", str.endsWith("tangyuan")); ![bd358bcdcb024db191a4ccea7519efe1.png][] > **字符串模板** ES6 中提供了 \` 来作为字符串模板标记。我们可以这么玩: let str2 = ` hello tangyuan libai `; console.log(str2); ![d524fe7ac3894929b4a37a634c2022b6.png][] 在两个\`之间的部分都会被作为字符串的值,可以任意换行。 ## 四:**解构表达式** ## **解构**:ES6中允许按照一定模式从数组和对象中提取值,然后对变量进行赋值,这被称为解构 (Destructuring)。 > **数组解构** 比如有一个数组: let arr = [1,2,3]; 之前,我想获取其中的值,只能通过角标。 ES6 可以这样: let arr = [1,2,3] const [x,y,z] = arr;// x,y,z将与arr中的每个位置对应来取值 // 然后打印 console.log(x,y,z); const [a] = arr; //只匹配1个参数 console.log(a); 结果: ![eb92caa8a53245ad89810e95f35ad9e6.png][] > **对象解构** 例如有个 person 对象: const person = { name:"jack", age:21, language: ['java','js','css'] } 我们可以这么做: // 解构表达式获取值 const {name,age,language} = person; console.log(name, age, language); 结果: ![13d729347c9749b1b38b3c218dba1ac1.png][] 如过想要用其它变量接收,需要额外指定别名: //用新的变量名 let {name:n,age:a,language:l}= person; console.log(n, a, l); * \{name:n\} :name是person中的属性名,冒号后面的n是解构后要赋值给的变量。 ## ## ## 五:**函数优化** ## 在 ES6 中,对函数的操作做了优化,使得我们在操作函数时更加的便捷。 > **函数参数默认值** 在 ES6 以前,我们无法给一个函数参数设置默认值,只能采用变通写法: function add(a , b) { // 判断b是否为空,为空就给默认值1 b = b || 1; /* if(!b){ b=1; }*/ return a + b; } console.log(add(10));//11 现在可以这么写: function add(a , b = 1) { return a + b; } // 传一个参数 console.log(add(10));//11 > **箭头函数** 一个参数时: function print(a) { console.log(a); } // 简写为: let print2= a => console.log(a); print("Hello Wrold!"); print2("Hello Libai!"); 多个参数: // 两个参数的情况: // 简写为: let sum= (a,b) => console.log(a+b); //多个参数多行代码 //代码不止一行,可以用 {} 括起来。 let sum2= (a,b) =>{ return a+b; } sum(10,15); console.log(sum2(35, 10)); 没有参数: //没有参数时,需要通过()进行占位,代表参数部分 let sayHello = () => console.log("hello!"); sayHello(); // 多行,没有返回值 let sayHello2 = () => { console.log("hello!"); console.log("world!"); } sayHello2(); > **对象的函数属性简写** 比如一个 Person 对象,里面有 eat 方法: let person = { name: "jack", eat: function (food) { console.log(this.name + "在吃" + food); }, // 箭头函数版: //eat2: food => console.log(this.name + "在吃" + food),// 这里拿不到this eat2: food => console.log(person.name + "在吃" + food), // 简写版:直接写函数 eat3(food){ console.log(this.name + "在吃" + food); } } person.eat("西瓜");//jack在吃西瓜 person.eat2("南瓜"); person.eat3("冬瓜"); > **箭头函数结合解构表达式** 比如有一个函数: const person = { name:"jack", age:21, language: ['java','js','css'] } function hello(person) { console.log("hello," + person.name) } 如果用箭头函数和解构表达式 const hello2 = ({name}) => console.log("hello," + name); hello(person); hello2(person); ## 六:**map****和****reduce** ## ES6 中,数组新增了 map 和 reduce 方法。 > **map** 接收一个函数,将原数组中的所有元素用这个函数处理后放入新数组返回 举例:有一个字符串数组,我们希望转为 int 数组 let arr = ['1','20','-5','3']; console.log(arr); let newArr = arr.map(s => parseInt(s)); console.log(newArr); let newArr2 = arr.map(function (s) { return parseInt(s); }); console.log(newArr2); 结果: ![518f6a1f249f4c608656fedcedb987c1.png][] > **reduce** 接收一个函数(必须)和一个初始值(可选),该函数接收两个参数: * 第一个参数是上一次reduce处理的结果 * 第二个参数是数组中要处理的下一个元素 reduce() 会从左到右依次把数组中的元素用 reduce 处理,并把处理的结果作为下次 reduce 的第一个参数。如果 是第一次,会把前两个元素作为计算参数,或者把用户指定的初始值作为起始参数 结果: const arr = [1,20,-5,3]; let result= arr.reduce((a,b)=>{ return a+b; }); console.log(result);//19 没有初始值时: 输出结果为19,将数组里的第一个元素作为a,将数组的第二个元素作为b,进行相加,将结果存储为a,将数组的第三个元素作为b,以此依次进行相加,输出最后结果 const arr = [1,20,-5,3]; let result= arr.reduce((a,b)=>{ return a+b; },1); //当我们传递初始值时,a就是初始值,b是数组的第一个元素值 console.log(result);//20 有初始值时: 将会将初始值作为a,数组里的第一个元素作为b,进行相加,将结果存储为a,数组的第二个元素作为b,以此类推进行相加,输出最后结果 ## 七:**扩展运算符** ## 扩展运算符 (spread) 是三个点 (...), 将一个数组转为用逗号分隔的参数序列 。 用法: console.log (...[1, 2, 3]);//1 2 3 console.log(1, ...[2, 3, 4], 5);//1 2 3 4 5 function add(x, y) { return x + y; } var numbers = [1, 2]; console.log(add(...numbers)); // 3 // 数组合并 let arr = [...[1,2,3],...[4,5,6]]; console.log(arr); //[1, 2, 3, 4, 5, 6] // 与解构表达式结合 const [first, ...rest] = [1, 2, 3, 4, 5]; console.log(first, rest) //1 [2, 3, 4, 5] //将字符串转成数组 console.log([...'hello']) //["h", "e", "l", "l", "o"] ## ## ## 八:**Promise** ## 所谓 Promise ,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。 Promise 提供统一的 API ,各种异步操作都可以用同样的方法进行处理。 我们可以通过 Promise 的构造函数来创建 Promise 对象,并在内部封装一个异步执行的结果。 语法: const promise = new Promise(function(resolve, reject) { // ... 执行异步操作 if (/* 异步操作成功 */){ resolve(value);// 调用resolve,代表Promise将返回成功的结果 } else { reject(error);// 调用reject,代表Promise会返回失败结果 } }); 这样,在 promise 中就封装了一段异步执行的结果。 如果我们想要等待异步执行完成,做一些事情,我们可以通过 promise 的 then 方法来实现 , 语法: promise.then(function(value){ // 异步执行成功后的回调 }); 如果想要处理 promise 异步执行失败的事件,还可以跟上 catch : promise.then(function(value){ // 异步执行成功后的回调 }).catch(function(error){ // 异步执行失败后的回调 }) 示例: const p=new Promise((resolve, reject) => { //写异步的操作,通常是ajax的操作 // 这里我们用定时任务模拟异步 setTimeout(()=>{ //异步操作 let num=Math.random(); if(num<0.5){ //认为成功了 resolve("成功了"+num); }else{ //认为失败了 reject("失败了"+num); } }); }); // 调用promise p.then(value => { //异步执行成功后的回调 console.log(value); }).catch(reason => { // 异步执行失败后的回调 console.log(reason); }); 结果: ![5e2ca52c82f74a5eb980fac10f33798d.png][] ## 九:**set****和****map** ## ES6 提供了 Set 和 Map 的数据结构。 Set ,本质与数组类似。不同在于 Set 中只能保存不同元素,如果元素相同会被忽略。和 java 中的 Set 集合非常相似。 构造函数: // Set构造函数可以接收一个数组或空 let set = new Set(); set.add(1);// [1] // 接收数组 let set2 = new Set([2,3,4,5,5]);// 得到[2,3,4,5] 方法: set.add(1);// 添加 set.clear();// 清空 set.delete(2);// 删除指定元素 set.has(2); // 判断是否存在 set.forEach(function(){})//遍历元素 set.size; // 元素个数。是属性,不是方法。 map ,本质是与 Object 类似的结构。不同在于, Object 强制规定 key 只能是字符串。而 Map 结构的 key 可以是任意对象。即: > * object是 <string,object>集合 > * map是<object,object>集合 构造函数: // map接收一个数组,数组中的元素是键值对数组 const map = new Map([ ['key1','value1'], ['key2','value2'], ]) // 或者接收一个set const set = new Set([ ['key1','value1'], ['key2','value2'], ]) const map2 = new Map(set) // 或者其它map const map3 = new Map(map); 方法: map.set(key, value);// 添加 map.clear();// 清空 map.delete(key);// 删除指定元素 map.has(key); // 判断是否存在 map.forEach(function(key,value){})//遍历元素 map.size; // 元素个数。是属性,不是方法 map.values() //获取value的迭代器 map.keys() //获取key的迭代器 map.entries() //获取entry的迭代器 用法: for (let key of map.keys()) { console.log(key); } 或: console.log(...map.values()); //通过扩展运算符进行展开 ## 十:**class****(类)的基本语法** ## JavaScript 语言的传统方法是通过构造函数定义井生成新对象。 ES6 中引入了 class 的概念,通过 class 关键字自定义类。 基本用法: class User { //构造函数 constructor(name, age = 20) { // 构造方法 this.name = name; // 添加属性并且赋值 this.age = age; } sayHello(){ // 定义方法 return "hello"+this.name; } //静态函数 static isAdult(age){ //静态方法 if(age >= 18){ return "成年人"; } return "未成年人"; } } let user = new User("张三"); // 测试 console.log(user); // User {name: "张三", age: 20} console.log(user.sayHello()); //hello张三 console.log(User.isAdult(20)); // 成年人 类的继承: class Lisi extends User{ constructor(){ super("李四", 30); //如果父类中的构造方法有参数, // 那么子类必须通过super调用父类的构造方法 } test(){ return "test------>"+this.name; } } let lisi=new Lisi(); console.log(lisi); console.log(lisi.test()); //调用父类的方法 console.log(lisi.sayHello()); //调用父类的静态方法 console.log(Lisi.isAdult(18)); ## 十一:**Generator****函数** ## Generator 函数是 ES6 提供的 一种异步编程解决方案,语法行为与传统函数完全不同 。 Generator 函数有两个特征 : 一是 function 命令与函数名 之间有一个星号 : 二是 函数体内部使用 yield 吾句定义不同的内部状态。 用法: <script> function* hello () { yield "hello"; yield "world"; return "done"; } let h = hello(); console.log(h.next()); //{value: "hello", done: false} 当执行遇到yield,就会停止返回结果 console.log(h.next()); //{value: "world", done: false} console.log(h.next()); //{value: "done", done: true} console.log(h.next()); //{value: undefined, done: true} </script> 可以看到,通过 hello() 返回的 h 对象,每调用一次 next() 方法返回一个对象,该对象包含了 value 值和 done 状态。直到遇到return 关键字或者函数执行完毕,这个时候返回的状态为 ture ,表示已经执行结束了。 > **for...of** **循环** 通过 for...of 可以循环遍历 Generator 函数返回的迭代器。 用法: <script> function* hello () { yield "hello"; yield "world"; return "done"; } let h = hello(); for (let obj of h) { console.log(obj); } </script> // 输出: hello world ## 十二:**转码器** ## * Babel (babeljs.io)是一个广为使用的 ES6 转码器,可以将 ES6 代码转为 ES5 代码,从而在浏览器或其他环境 执行 。 * Google 公司的 Traceur 转码器 Cgithub.com/google/traceur-compiler), 也可以将 ES6 代码转为ES5的代 码。 这 2 款都是非常优秀的转码工具,在这里中并不会直接使用,而是会使用阿里的开源企业级 react 框架: UmiJS。 > **UmiJS** 官网:[UmiJS - 插件化的企业级前端应用框架][UmiJS -] ![29c34da184e44a55a767624c659ca324.png][] UmiJS 读音:(乌米) **特点:** * **插件化** umi 的整个生命周期都是插件化的,甚至其内部实现就是由大量插件组成,比如 pwa 、按需加载、一键切换 preact 、一键兼容 ie9 等等,都是由插件实现。 * **开箱即用** 你只需一个 umi 依赖就可启动开发,无需安装 react 、 preact 、 webpack 、 react-router 、 babel 、 jest 等等。 * **约定式路由** 类 next.js 的约定式路由,无需再维护一份冗余的路由配置,支持权限、动态路由、嵌套路由等等。 > **部署安装** : #首先,需要安装Node.js #在资料中,找到node-v8.12.0-x64.msi,一路下一步安装 #安装完成后,通过node -v 命令查看其版本号 F:\code\itcast-es6>node -v v8.12.0 #接下来,开始安装yarn,其中tyarn使用的是npm.taobao.org的源,速度要快一些 #可以把yarn看做了优化了的npm npm i yarn tyarn -g #-g 是指全局安装 tyarn -v #进行测试,如果能够正常输出版本信息则说明安装成功了 #如果安装失败,是由于将yarn添加到环境变量中导致,参见 http://www.easysb.cn/index.php/2017/06/04/11/ #下面开始安装umi tyarn global add umi umi #进行测试 > **快速入门** #通过初始化命令将生成package.json文件,它是 NodeJS 约定的用来存放项目的信息和配置等信息的文件。 tyarn init -y #通过umi命令创建index.js文件 umi g page index #可以看到在pages下创建好了index.js和index.css文件 #将下面内存拷贝到index.js文件中进行测试 @T //通过@符号进行引用该方法,类似java中的注解 class User { constructor(name, age = 20){ this.name = name; this.age = age; } } function T(target) { //定义一个普通的方法 console.log(target); //target对象为修饰的目标对象,这里是User对象 target.country = "中国"; //为User类添加一个静态属性country } console.log(User.country); //打印出country属性值 #通过命令行启动umi的后台服务,用于本地开发 umi dev #通过浏览器进行访问:http://localhost:8000/,查看效果 #值得注意的是,这里访问的是umi的后台服务,不是idea提供的服务 结果: ![e4b5d717c9d84c27ae811dd1aa1b257e.png][] 查看编码后的 js 文件: ![4e6807e7e73e416695573c7e6a6fe606.png][] 可以看到,将我们写的代码进行的编码。 ## 十三:**修饰器** ## 修饰器 (Decorator) 是一个函数, 用来修改类的行为。 ES2017 引入了这项功能, 目前 Babel 转码器己经支持。 使用: <script> @T //通过@符号进行引用该方法,类似java中的注解 class User { constructor(name, age = 20){ this.name = name; this.age = age; } } function T(target) { //定义一个普通的方法 console.log(target); //target对象为修饰的目标对象,这里是User对象 target.country = "中国"; //为User类添加一个静态属性country } console.log(User.country); //打印出country属性值 </script> 运行报错: ![6b4622136f8c4801a29a2463d95f4ab6.png][] 原因是,在 ES6 中,并没有支持该用法,在 ES2017 中才有,所以我们不能直接运行了,需要进行编码后再运行。 转码的意思是:将 ES6 或 ES2017 转为 ES5 执行。类似这样: //转码前 input .map(item =>item + 1); //转码后 input.map(function (item) { return item + 1; }) ## 十四:**模块化** ## 模块化就是把代码进行拆分,方便重复利用。类似 java 中的导包:要使用一个包,必须先导包。 而 JS 中没有包的概念,换来的是 模块。 模块功能主要由两个命令构成: export 和 import 。 * export 命令用于规定模块的对外接口, * import 命令用于导入其他模块提供的功能。 > **export** 比如我定义一个 js 文件 :Util.js ,里面有一个 Util 类: class Util { static sum = (a, b) => a + b; } //导出该类 export default Util; > **import** 使用 export 命令定义了模块的对外接口以后,其他 JS 文件就可以通过 import 命令加载这个模块。 例如我要使用上面导出的 Util : //Index.js //导入Util类 import Util from './Util' //使用Util中的sum方法 console.log(Util.sum(1, 2)); 通过 http://localhost:8000/ 进行访问测试。 ok,结果输出成功,over ![15d1680b80444b029032df0d1111d607.jpeg][] [161d91182e564c23b1aa632a29e733a4.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/30/6c7fdaa629dd47fc900df805a2bb96ab.png [c35b3a72d2b34881928d3373122e3dc5.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/30/8b120e754600415889b4125d1a236964.png [b00370eaac734f1f9a911b9eceaa0d4b.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/30/00f448aeccc9487a84dc98d91bd506ac.png [bd358bcdcb024db191a4ccea7519efe1.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/30/6bda235c51eb40d19100410898c21cd2.png [d524fe7ac3894929b4a37a634c2022b6.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/30/c4a2c82a71db4281babc69c2d430013d.png [eb92caa8a53245ad89810e95f35ad9e6.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/30/37b13932bbff4f9d8a895f0d9e477792.png [13d729347c9749b1b38b3c218dba1ac1.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/30/bc2b9fdd190d4d58bd1852aa13120b39.png [518f6a1f249f4c608656fedcedb987c1.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/30/e292e1c9d4914d0c93cff5df97459e86.png [5e2ca52c82f74a5eb980fac10f33798d.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/30/04c48d4f298e4eb7919daa15a1fbf5a1.png [UmiJS -]: https://v3.umijs.org/zh-CN/ [29c34da184e44a55a767624c659ca324.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/30/223053a63b0d42daa262ab22a15ca081.png [e4b5d717c9d84c27ae811dd1aa1b257e.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/30/e992da749d2f42789d7e5d3f13791402.png [4e6807e7e73e416695573c7e6a6fe606.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/30/240ca6287f4b45449e6c9976a84ea5cb.png [6b4622136f8c4801a29a2463d95f4ab6.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/30/1cf97a8ca2ab43abba5819670b12ca6b.png [15d1680b80444b029032df0d1111d607.jpeg]: https://image.dandelioncloud.cn/pgy_files/images/2024/03/30/b7bfd9c550654c989f26b0115fa8e017.jpeg
相关 ES6 新特性讲解 目录 一:什么是ECMAScript? 1.ECMAScript的快速发展 二:let 和 const 命令 三:字符串扩展 四:解构表达式 五:函数优化 六:m 梦里梦外;/ 2024年03月30日 12:18/ 0 赞/ 62 阅读
相关 ES6常用新特性讲解 !干货长文预警! 目前没有找到比较全的 ES 6 新特性汇总(中文),于是就自己花了一下午收集了一下,不说 100% 全面,也至少收录了 90% 的新特性。 一共讲解了 绝地灬酷狼/ 2022年12月27日 12:59/ 0 赞/ 153 阅读
相关 ES6新特性 文章目录 一、ECMASript 介绍 二、ES6 新特性 2.1 let、const 关键字 2.2 变量的解构赋值 ゝ一世哀愁。/ 2022年09月06日 15:27/ 0 赞/ 288 阅读
相关 es6新特性 1.let && const •都是块级作用域 •不能重复定义 •避免了变量提升 ① let命令也用于声明对象,但是作用域为局部。 ![在这里插入图片描述][ 红太狼/ 2022年03月07日 21:24/ 0 赞/ 378 阅读
相关 es6新特性 es6语法 > es6语法用起来是十分方便的,但是有些浏览器还是不支持,但是做大型项目中基本上要用到转码器(babel转码器),可以把es6语法转为es5直接使用。 T 落日映苍穹つ/ 2022年01月25日 15:30/ 0 赞/ 379 阅读
相关 ES6新特性 转:[https://www.jianshu.com/p/87008f4f8513][https_www.jianshu.com_p_87008f4f8513] co Bertha 。/ 2022年01月12日 02:19/ 0 赞/ 352 阅读
相关 ES6新特性 转自:[https://www.jianshu.com/p/87008f4f8513][https_www.jianshu.com_p_87008f4f8513] 1.con 冷不防/ 2021年12月18日 07:07/ 0 赞/ 355 阅读
相关 es6新特性 https://www.cnblogs.com/minghui007/p/8177925.html 转载于:https://www.cnblogs.com/LWWTT/p/1 野性酷女/ 2021年11月02日 14:58/ 0 赞/ 516 阅读
相关 ES6新特性 1.变量声明let和const 在ES6以前,var关键字声明变量。无论声明在何处,都会被视为声明在函数的最顶部(不在函数内即在全局作用域的最顶部)。这就是函数变量提升例如: 我会带着你远行/ 2021年10月29日 07:08/ 0 赞/ 526 阅读
相关 ES6新特性 1.声明变量的关键字:const 和 let JavaScript ES6中引入了另外两个声明变量的关键字:const和let。在ES6中,我们将很少能看到var了。 co 电玩女神/ 2021年09月17日 01:12/ 0 赞/ 515 阅读
还没有评论,来说两句吧...