ES6学习小计
1.增加了for of语法,对应C#里的foreach,注意ES5中的 for in只会传递0,1,2.....序号,并且是字符
for-of循环语句通过方法调用来遍历各种集合。数组、Maps对象、Sets对象【可迭代器对象-》所有拥有[Symbol.iterator]的对象】
for (var value of myArray) { console.log(value); }
2.map对象,对应Dictionary,即字典
for (var [key, value] of phoneBookMap) { console.log(key + "'s phone number is: " + value); }
支持的操作:
new Map
:返回一个新的、空的Map
。new Map(pairs)
:根据所含元素形如[key, value]
的数组pairs
来创建一个新的Map
。这里提供的pairs
可以是一个已有的Map
对象,可以是一个由二元数组组成的数组,也可以是逐个生成二元数组的一个生成器,等等。map.size
:返回Map
中项目的个数。map.has(key)
:测试一个键名是否存在,类似key in obj
。map.get(key)
:返回一个键名对应的值,若键名不存在则返回undefined
,类似obj[key]
。map.set(key, value)
:添加一对新的键值对,如果键名已存在就覆盖。map.delete(key)
:按键名删除一项,类似delete obj[key]
。map.clear()
:清空Map
。map[Symbol.iterator]()
:返回遍历所有项的迭代器,每项用一个键和值组成的二元数组表示。map.forEach(f)
类似for (let [key, value] of map) { f(value, key, map); }
。这里诡异的参数顺序,和Set
中一样,是对应着Array.prototype.forEach()
。map.keys()
:返回遍历所有键的迭代器。map.values()
:返回遍历所有值的迭代器。map.entries()
:返回遍历所有项的迭代器,就像map[Symbol.iterator]()
3.生成器:生成器是迭代器。所有的生成器都有内建.next()和[Symbol.iterator]()方法的实现
格式: 比函数多了一个*号 function* XXX(){....yield....}
yield作用:当生成器执行yields语句,生成器的堆栈结构(本地变量、参数、临时值、生成器内部当前的执行位置)被移出堆栈。然而,生成器对象保留了对这个堆栈结构的引用(备份),所以稍后调用.next()可以重新激活堆栈结构并且继续执行。
function* range(start, stop) { for (var i = start; i < stop; i++) yield i; }
// 应该弹出三次 "ding" for (var value of range(0, 3)) { alert("Ding! at floor #" + value); }
4.反撇号(`)->模板字符串(template strings)。除了使用反撇号字符 ` 代替普通字符串的引号 ' 或 " 外,看起来与普通字符串一致。 与普通字符串不同的是,模板字符串可以多行书写
function authorize(user, action) { if (!user.hasPrivilege(action)) { throw new Error( `用户 ${user.name} 未被授权执行 ${action} 操作。`); } }
- 模板占位符中的代码可以是任意JavaScript表达式,所以函数调用、算数运算等这些都可以作为占位符使用,你甚至可以在一个模板字符串中嵌套另一个,我称之为模板套构(template inception)。
- 如果这两个值都不是字符串,可以按照常规将其转换为字符串。例如:如果action是一个对象,将会调用它的.toString()方法将其转换为字符串值。
- 如果你需要在模板字符串中书写反撇号,你必须使用反斜杠将其转义:`\``等价于"`"。
- 同样地,如果你需要在模板字符串中引入字符$和{。无论你要实现什么样的目标,你都需要用反斜杠转义每一个字符:`\$`和`\{`。
5.不定参数:...paramsname 采用...+变量名,默认为空数组【不为undefine】
function containsAll(haystack, ...needles) { for (var needle of needles) { if (haystack.indexOf(needle) === -1) { return false; } } return true; }
6.默认参数 定义形式为[param1[ = defaultValue1 ][, ..., paramN[ = defaultValueN ]]],对于每个参数而言,定义默认值时=后的部分是一个表达式,如果调用者没有传递相应参数,将使用该表达式的值作为参数默认值
默认值表达式在函数调用时自左向右求值,没有默认值的参数隐式默认为undefined
function animalSentence(animals2="tigers", animals3="bears") { return `Lions and ${animals2} and ${animals3}! Oh my!`; }
7.解构赋值【成对赋值】 允许你使用类似数组或对象字面量的语法将数组和对象的属性赋给各种变量
var [foo, [[bar], baz]] = [1, [[2], 3]]; console.log(foo); // 1 console.log(bar); // 2 console.log(baz); // 3 var [,,third] = ["foo", "bar", "baz"]; console.log(third); // "baz" var [head, ...tail] = [1, 2, 3, 4]; console.log(tail); // [2, 3, 4]
可以用于多个返回值
function returnMultipleValues() { return [1, 2]; } var [foo, bar] = returnMultipleValues();
8.箭头函数Arrow Functions: => 同C#Lambda表达式
// ES5 var selected = allJobs.filter(function (job) { return job.isSelected(); }); // ES6 var selected = allJobs.filter(job => job.isSelected());
9.集合Set:一个Set
是一群值的集合。它是可变的,能够增删元素
Set不会包含相同元素
Set的数据存储结构专门为一种操作作了速度优化:包含性检测:has方法
Set不能提供索引 SetObj[111]->undefine
支持的所有操作:
new Set
:创建一个新的、空的Set
。new Set(iterable)
:从任何可遍历数据中提取元素,构造出一个新的集合。set.size
:获取集合的大小,即其中元素的个数。set.has(value)
:判定集合中是否含有指定元素,返回一个布尔值。set.add(value)
:添加元素。如果与已有重复,则不产生效果。set.delete(value)
:删除元素。如果并不存在,则不产生效果。.add()
和.delete()
都会返回集合自身,所以我们可以用链式语法。set[Symbol.iterator]()
:返回一个新的遍历整个集合的迭代器。一般这个方法不会被直接调用,因为实际上就是它使集合能够被遍历,也就是说,我们可以直接写for (v of set) {...}
等等。set.forEach(f)
:直接用代码来解释好了,它就像是for (let value of set) { f(value, value, set); }
的简写,类似于数组的.forEach()
方法。set.clear()
:清空集合。set.keys()
、set.values()
和set.entries()
返回各种迭代器,它们是为了兼容Map
而提供的
10.弱集合:WeakMap和WeakSet
WeakMap和WeakSet被设计来完成与Map、Set几乎一样的行为,除了以下一些限制:
- WeakMap只支持new、has、get、set 和delete。
- WeakSet只支持new、has、add和delete。
- WeakSet的值和WeakMap的键必须是对象。
还要注意,这两种弱集合都不可迭代,除非专门查询或给出你感兴趣的键,否则不能获得一个弱集合中的项。