ES6学习札记
来源:互联网 发布:js extend函数 编辑:程序博客网 时间:2024/04/28 06:12
由于JavaScript语言的缺点和弱点,加之上次ESMCScript修订还是在2009年。es6终于在2015年闪亮现身了,并越来越多的运用在实际开发中。整理一下学到的新特性:
1、新增let和const关键字
① 在之前的标准中,是没有块级作用域的。
<span style="font-size:14px;"> for (var i = 0; i < 3;i++){ setTimeout(function(){console.log(i)},1000); } //输出全是2</span>
我们只能通过闭包的方式模仿块级作用域。
<span style="font-size:14px;">for (var i = 0; i < 3;i++){ ;(function(i){ setTimeout(function(){ console.log(i) },1000);})(i); } </span>
通过let定义变量,便可以产生块级作用域,即只在let所在的代码块内是有效的。
②当在全局情况下定义时,变量并不会污染window。
<span style="font-size:14px;">var a = 'a';let b = 'b';console.log(window.b);//undefined</span>
③不像var那样会产生变量提升。不过实际开发中,变量提升的情况我们也用的比较少。
④不能在相同的作用域中使用let重复声明同一个变量。
⑤不能再函数内部重新声明参数。
使用const定义变量后,表明其实常量,一旦定义后不可修改。
2 、解构赋值
实际上就是对变量进行批量赋值。
<span style="font-size:14px;">let arr = [3,32,3,4];let m = Math.max(...arr);console.log(m)</span>又如:
<span style="font-size:14px;">let arr = [1,[2.1,2.2],3];let [, [,x]] =arr; console.log(x)//x=2.2let [a,b,...other] =arr; //...叫拓展运算符,把后面的整体放在一个数组中,但是拓展运算符不能放在中间console.log(other);//3</span>3、箭头
<span style="font-size:14px;">let say = name =>name; //第一个name是参数,第二个参数是返回值//相当于下面的写法/*var say = function(name){ return name}*/</span>又如:
<span style="font-size:14px;">let say2 = (name2,age2) => { var a =5; return `${name2} ${age2} ${a}`}//相当于let say3 = function(name2,age2){ var a =5; return `${name2} ${age2} ${a}`}</span>4、新增数据类型Symbol
是第七种数据类型,通常用于共同操作DOM的时候。不可参与运算,toString后才可以。
<span style="font-size:14px;">let sybx =Symbol('subx');let syby =Symbol('suby');console.log(sybx,syby,sybx == syby);//Symbol(subx) Symbol(suby) falseconsole.log(typeof sybx,sybx.toString() === syby.toString());//symbol false</span>
5、Set和Map
①set:存的是类似数组的东西,相当于集合的概念,会自动在里面进行去重。
<span style="font-size:14px;">let set = new Set(['a','b','c','c']);let arr = [...set];console.log(arr);//a,b,c</span>set的并差交集
<span style="font-size:14px;">let s1 = new Set([1,3,5,7]);let s2 = new Set([1,4,5,8]);//并集合let sb = new Set([...s1,...s2]);console.log(sb);//交集let sj = new Set([...s1].filter(item =>s2.has(item)));console.log(sj);//差集let cj = new Set([...s1].filter(item =>!s2.has(item)));console.log(cj);</span>
Weakset:如:let arr = =[1,2,3,4,obj]如果把引用类型obj删掉了,weakset里会释放掉它,不会出现内存泄漏。不会占着它不让释放此对象。
②Map:比如你写动画时,dom元素上绑x,y元素,想要一种数据结构,key是dom元素,value是对dom的描述。适合用map
Weakmap:它的key是个对象,如果此对象被外界删除了,它不会再引用,不会出现内存泄漏的问题。
6、类
很像java中的类的概念
<span style="font-size:14px;">class Person{ constructor(name){ this.name=name; this.hobbies = []; } getName(){ console.log(this.name); return this.name; } get hobby(){ return this.hobbies; } set hobby(hobby){ this.hobbies.push(hobby); }}class Student extends Person{ constructor(name){ super(name);//子类中先调用父类构造函数 this.name = name; } getStuNum(){ console.log('988') } getName(){ console.log(super.getName(),this.name); }}var p = new Person('qiqi');p.hobby = 'smoking';p.hobby = 'drinking';console.log(p.hobby)p.getName()var g= new Student('qiqi1');g.getName();g.getStuNum();</span>
7、字符串扩展
有很多变化,目前只接触到模板字符串
<span style="font-size:14px;">let name = 'qiqi';let age = 6;console.log(`${name} is ${age} years old`)//相当于下者</span><pre name="code" class="javascript"><span style="font-size:14px;">console.log(name+" is "+ age +' years old')//qiqi is 6 years old</span>8、模块
如果你想将所有js放在一个文件中,或者你要在应用的不同地方使用相同的功能,你就要使用模块,记住魔术的关键词是export,在你的函数之前使用export。假设Project 和 WebProject 都储存在application.js文件中,如下源码结构:
<span style="font-size:14px;"> myproject (folder) | -- modules (folder) | | | -- helpers.js | -- application.js</span>
如果我们从application.js中分离arrayToString(),然后放入modules/helpers.js,这样我们在其他地方可以重用它:
<span style="font-size:14px;">//这样我们只需要导入我们的模块即可:// application.jsimport { arrayToString } from 'modules/helpers';class WebProject extends Project { constructor(name, technologies) { super(name); this.technologies = technology; } info() { return this.name + " uses " + arrayToString(this.technology); }}</span>9、Promise
Promises是处理异步操作的一种模式,之前在很多三方库中有实现,比如jQuery的deferred对象。当你发起一个异步请求,并绑定了.when(), .done()等事件处理程序时,其实就是在应用promise模式。
<span style="font-size:14px;">//创建promisevar promise = new Promise(function(resolve, reject) { // 进行一些异步或耗时操作 if ( /*如果成功 */ ) { resolve("Stuff worked!"); } else { reject(Error("It broke")); }});//绑定处理程序promise.then(function(result) {//promise成功的话会执行这里 console.log(result); // "Stuff worked!"}, function(err) {//promise失败会执行这里 console.log(err); // Error: "It broke"});</span>先总结到这。
- ES6学习札记
- Promise 的含义(ES6 学习札记)
- 学习札记
- 学习札记
- 学习札记
- 学习札记
- ES6学习
- ES6学习
- ES6学习
- ES6学习
- es6学习
- es6学习
- es6学习
- es6开发:ES6学习笔记
- J2ME学习札记
- SNMP学习札记
- Java学习札记
- J2ME学习札记3
- python in learning math
- 树——二叉树中最大路径和and二叉树节点间的最大距离
- JQuery datatables测试!
- 流工具(1)
- 我的书签栏
- ES6学习札记
- JAVA_SE使用反射机制new实例简例
- [C++]二叉树应用--Huffman code
- willMoveToParentViewController和didMoveToParentViewController
- asin数学函数应用实例
- 编译原理实验二:语义分析
- 单例模式の懒汉式和饿汉式
- 无法加载 MySQL ODBC 5.3 Unicode Driver ODBC 驱动程序的安装例程,因为存在错误代码126.
- C#入门之流程控制练习题(排序)