笔记来源:廖雪峰老师的javascript全栈教程

ES6:JavaScript的标准,ECMAScript在不断发展,最新版ECMAScript 6标准(简称ES6)已经在2015年6月正式发布了,不过大多数时候,我们还是用JavaScript这个词。如果你遇到ECMAScript这个词,简单把它替换为JavaScript就行了。

1.strict模式

为了修补JavaScript严重设计缺陷,ECMA在后续规范中推出了strict模式,在strict模式下运行的JavaScript代码,强制通过var申明变量,未使用var申明变量就使用的,将导致运行错误。

启用strict模式的方法是在JavaScript代码的第一行写上:

  1. 'use strict';

2.模版字符串

如果有很多变量需要连接,用+号就比较麻烦。ES6新增了一种模板字符串,它会自动替换字符串中的变量:

  1. var name = '小明';
  2. var age = ;
  3. var message = `你好, ${name}, 你今年${age}岁了!`;
  4. alert(message);

3.循环

for ... in

for循环的一个变体是for ... in循环,它可以把一个对象的所有属性依次循环出来:

  1. var o = {
  2. name: 'Jack',
  3. age: ,
  4. city: 'Beijing'
  5. };
  6. for (var key in o) {
  7. alert(key); // 'name', 'age', 'city'
  8. }

4.Met 与 Set

最新的ES6规范引入了新的数据类型Map,Map是一组键值对的结构,具有极快的查找速度。

举个例子,假设要根据同学的名字查找对应的成绩,如果用Array实现,需要两个Array

  1. var names = ['Michael', 'Bob', 'Tracy'];
  2. var scores = [, , ];

给定一个名字,要查找对应的成绩,就先要在names中找到对应的位置,再从scores取出对应的成绩,Array越长,耗时越长。

如果用Map实现,只需要一个“名字”-“成绩”的对照表,直接根据名字查找成绩,无论这个表有多大,查找速度都不会变慢。用JavaScript写一个Map如下:

  1. var m = new Map([['Michael', ], ['Bob', ], ['Tracy', ]]);
  2. m.get('Michael'); //

初始化Map需要一个二维数组,或者直接初始化一个空MapMap具有以下方法:

  1. var m = new Map(); // 空Map
  2. m.set('Adam', ); // 添加新的key-value
  3. m.set('Bob', );
  4. m.has('Adam'); // 是否存在key 'Adam': true
  5. m.get('Adam'); //
  6. m.delete('Adam'); // 删除key 'Adam'
  7. m.get('Adam'); // undefined

由于一个key只能对应一个value,所以,多次对一个key放入value,后面的值会把前面的值冲掉:

  1. var m = new Map();
  2. m.set('Adam', );
  3. m.set('Adam', );
  4. m.get('Adam'); //

Set

SetMap类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在Set中,没有重复的key。

要创建一个Set,需要提供一个Array作为输入,或者直接创建一个空Set

  1. var s1 = new Set(); // 空Set
  2. var s2 = new Set([, , ]); // 含1, 2, 3

重复元素在Set中自动被过滤:

  1. var s = new Set([, , , , '']);
  2. s; // Set {1, 2, 3, "3"}

注意数字3和字符串'3'是不同的元素。

通过add(key)方法可以添加元素到Set中,可以重复添加,但不会有效果:

  1. >>> s.add()
  2. >>> s
  3. {, , , }
  4. >>> s.add()
  5. >>> s
  6. {, , , }

通过delete(key)方法可以删除元素:

  1. var s = new Set([, , ]);
  2. s; // Set {1, 2, 3}
  3. s.delete();
  4. s; // Set {1, 2}

5.iterable

  1.  

遍历Array可以采用下标循环,遍历MapSet就无法使用下标。为了统一集合类型,ES6标准引入了新的iterable类型,ArrayMapSet都属于iterable类型。具有iterable类型的集合可以通过新的for ... of循环来遍历。

  1.  
  1. for ... of循环遍历集合,用法如下:
  2.  
  3. var a = ['A', 'B', 'C'];
  4. var s = new Set(['A', 'B', 'C']);
  5. var m = new Map([[, 'x'], [, 'y'], [, 'z']]);
  6. for (var x of a) { // 遍历Array
  7. alert(x);
  8. }
  9. for (var x of s) { // 遍历Set
  10. alert(x);
  11. }
  12. for (var x of m) { // 遍历Map
  13. alert(x[] + '=' + x[]);
  14. }
  1.  

你可能会有疑问,for ... of循环和for ... in循环有何区别?

for ... in循环由于历史遗留问题,它遍历的实际上是对象的属性名称。一个Array数组实际上也是一个对象,它的每个元素的索引被视为一个属性。

当我们手动给Array对象添加了额外的属性后,for ... in循环将带来意想不到的意外效果:

  1. var a = ['A', 'B', 'C'];
  2. a.name = 'Hello';
  3. for (var x in a) {
  4. alert(x); // '0', '1', '2', 'name'
  5. }

for ... in循环将把name包括在内,但Arraylength属性却不包括在内。

for ... of循环则完全修复了这些问题,它只循环集合本身的元素:

  1. var a = ['A', 'B', 'C'];
  2. a.name = 'Hello';
  3. for (var x of a) {
  4. alert(x); // 'A', 'B', 'C'
  5. }

这就是为什么要引入新的for ... of循环。

6.arguments

JavaScript还有一个免费赠送的关键字arguments,它只在函数内部起作用,并且永远指向当前函数的调用者传入的所有参数。arguments类似Array但它不是一个Array

  1. function foo(x) {
  2. alert(x); //
  3. for (var i=; i<arguments.length; i++) {
  4. alert(arguments[i]); // 10, 20, 30
  5. }
  6. }
  7. foo(, , );

7.rest参数

ES6标准引入了rest参数:

  1. function foo(a, b, ...rest) {
  2. console.log('a = ' + a);
  3. console.log('b = ' + b);
  4. console.log(rest);
  5. }
  6.  
  7. foo(, , , , );
  8. // 结果:
  9. // a = 1
  10. // b = 2
  11. // Array [ 3, 4, 5 ]
  12.  
  13. foo();
  14. // 结果:
  15. // a = 1
  16. // b = undefined
  17. // Array []

8.局部作用域

由于JavaScript的变量作用域实际上是函数内部,我们在for循环等语句块中是无法定义具有局部作用域的变量的:

  1. 'use strict';
  2.  
  3. function foo() {
  4. for (var i=; i<; i++) {
  5. //
  6. }
  7. i += ; // 仍然可以引用变量i
  8. }

为了解决块级作用域,ES6引入了新的关键字let,用let替代var可以申明一个块级作用域的变量:

  1. 'use strict';
  2.  
  3. function foo() {
  4. var sum = ;
  5. for (let i=; i<; i++) {
  6. sum += i;
  7. }
  8. i += ; // SyntaxError
  9. }

9.常量

由于varlet申明的是变量,如果要申明一个常量,在ES6之前是不行的,我们通常用全部大写的变量来表示“这是一个常量,不要修改它的值”:

  1. var PI = 3.14;

ES6标准引入了新的关键字const来定义常量,constlet都具有块级作用域:

  1. 'use strict';
  2.  
  3. const PI = 3.14;
  4. PI = ; // 某些浏览器不报错,但是无效果!
  5. PI; // 3.14

ES6 学习笔记 (1)的更多相关文章

  1. es6学习笔记-class之一概念

    前段时间复习了面向对象这一部分,其中提到在es6之前,Javasript是没有类的概念的,只从es6之后出现了类的概念和继承.于是乎,花时间学习一下class. 简介 JavaScript 语言中,生 ...

  2. ES6学习笔记<五> Module的操作——import、export、as

    import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...

  3. ES6学习笔记<四> default、rest、Multi-line Strings

    default 参数默认值 在实际开发 有时需要给一些参数默认值. 在ES6之前一般都这么处理参数默认值 function add(val_1,val_2){ val_1 = val_1 || 10; ...

  4. ES6学习笔记<三> 生成器函数与yield

    为什么要把这个内容拿出来单独做一篇学习笔记? 生成器函数比较重要,相对不是很容易理解,单独做一篇笔记详细聊一聊生成器函数. 标题为什么是生成器函数与yield? 生成器函数类似其他服务器端语音中的接口 ...

  5. ES6学习笔记<二>arrow functions 箭头函数、template string、destructuring

    接着上一篇的说. arrow functions 箭头函数 => 更便捷的函数声明 document.getElementById("click_1").onclick = ...

  6. ES6学习笔记<一> let const class extends super

    学习参考地址1  学习参考地址2 ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015:也 ...

  7. ES6学习笔记之块级作用域

    ES6学习笔记:块级作用域 作用域分类 全局作用域 局部作用域 块级作用域 全局作用域示例 var i=2; for (var i = 0; i < 10; i++) { } console.l ...

  8. ES6学习笔记之变量的解构赋值

    变量的解构赋值 ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构. 数组的解构赋值 以前,为变量赋值,只能直接指定值: 1 2 3 var a = 1; var b = 2; ...

  9. ES6学习笔记(三):教你用js面向对象思维来实现 tab栏增删改查功能

    前两篇文章主要介绍了类和对象.类的继承,如果想了解更多理论请查阅<ES6学习笔记(一):轻松搞懂面向对象编程.类和对象>.<ES6学习笔记(二):教你玩转类的继承和类的对象>, ...

  10. JS&ES6学习笔记(持续更新)

    ES6学习笔记(2019.7.29) 目录 ES6学习笔记(2019.7.29) let和const let let 基本用法 let 不存在变量提升 暂时性死区 不允许重复声明 块级作用域 级作用域 ...

随机推荐

  1. CMD_命令行

    一.bat执行一闪而过 最后一个end下一行,加PAUSE   二.cmd命令:不是内部或外部命令,也不是可运行的程序或批处理文件 解决: 需将路径先切换到system32下  cd c:\WINDO ...

  2. nhibernate change connection

    http://stackoverflow.com/questions/4335827/changing-nhibernate-connectionstring http://stackoverflow ...

  3. Keen Team

    Keen Team (碁震安全研究团队,KeenTeam)是一支由在信息安全理论和技术研究方面全球领先的中国“白帽”安全专家组成的信息安全研究队伍,成员主要来自微软的安全漏洞研究.安全攻击和防御技术研 ...

  4. volatile型变量自增操作的隐患

      用FindBugs跑自己的项目,报出两处An increment to a volatile field isn't atomic.对应报错的代码例如以下: volatile int num = ...

  5. 2017.11.30 tomcat远程调试

    参考来自:http://blog.csdn.net/afgasdg/article/details/9236877 1.jpda 有两种方式,一种是修改tomcat的catalina.bat来配置jp ...

  6. java基础知识汇总4

    三.集合(collection.set.list.map) 一.定义: 集合是Java里面最经常使用的,也是最重要的一部分.可以用好集合和理解好集合对于做Java程序的开发拥有无比的优点. 容器:用来 ...

  7. 乌云主站所有漏洞综合分析&乌云主站漏洞统计

    作者:RedFree 最近的工作需要将乌云历史上比较有含金量的漏洞分析出来,顺便对其它的数据进行了下分析:统计往往能说明问题及分析事物的发展规律,所以就有了此文.(漏洞数据抓取自乌云主站,漏洞编号从1 ...

  8. ipv6 dns list

    ip v6 DNS list: 将首选DNS服务器地址填上2001:778::37 备用DNS服务器地址填上2001:df8:0:7::1

  9. Gperftools中tcmalloc的简介和使用(转)

    TcMalloc(Thread-CachingMalloc)是google-perftools工具中的一个内存管理库,与标准的glibc库中malloc相比,TcMalloc在内存分配的效率和速度上要 ...

  10. 機器學習基石(Machine Learning Foundations) 机器学习基石 作业四 Q13-20 MATLAB实现

    大家好,我是Mac Jiang,今天和大家分享Coursera-NTU-機器學習基石(Machine Learning Foundations)-作业四 Q13-20的MATLAB实现. 曾经的代码都 ...