原有字面量加强
- 更安全的二进制字面量(0b1111101)
- 更安全的八进制字面量(0o767)
- 字符串支持 Unicode
- 正则表达式字面量添加 Unicode 支持(u 标记)
- 正则表达式添加 y 标记,支持粘滞匹配
新增数据类型
- Symbol类型《JS中的Symbol是什么》
- 一个迭代器对象 ,知道如何每次访问集合中的一项, 并跟踪该序列中的当前位置。在 JavaScript 中 迭代器是一个对象,它提供了一个
next()
方法,用来返回序列中的下一项。这个方法返回包含两个属性:done
和value
。
1 | function 发布器(){ |
生成器
- ES6提供了新的语法糖更方便的定义一个迭代器
1 | function* 发布器(){ |
可迭代对象
- 一个定义了迭代行为的对象,比如在for…of中循环了哪些值。一些内置类型,如
Array
或Map
具有默认的迭代行为,而其他类型(如Object
)没有。
1 | var array = [1,2,3] |
- 为什么
Array
和Object
都能实现遍历,而Array
能迭代,Object
不能迭代?Array
不是属于Object
么? - 首先
Array
和Object
的__proto__
不同,其实数组和Object
的key值顺序不一定是按照遍历的顺序来的,如下图。他们本质的区别就是Array
的__proto__
指向的是Array.prototype
,Object
的__proto__
指向的是Object.prototype
。
-
既然原型链不同,对应的属性也不会相同。一个可迭代的对象必须代有
Symbol.iterator
属性。1
2
3
4
5var array = [1,2,3]
var object = {a:'x',b:'y',c:'z'}
array[Symbol.iterator]//ƒ values() { [native code] }
object[Symbol.iterator]//undefined -
现在给上面
object
添加Symbol.iterator
属性1
2
3
4
5
6
7
8
9object[Symbol.iterator] = function* (){
let keys = Object.keys(object)
for(i = 0;i < keys.length; i++){
yield object[keys[i]]
}
}
for(let key of object){
console.log(key)
}// x y z