Array Set Map string 类数组对象(nodelist,arguments)
Symbol 新增数据类型
迭代器 1.Array 有序并且可以重复,保存任意数据类型
2.Set 可以存储任意数据类型,无序,不重复的集合
创建方式
构造函数 Set()
let set=new Set() //参数是一个可迭代的数据结构,用作初始化set集合
2.1 Set.prototype api
size 获取set集合的元素个数
add() 向set集合中添加一个元素
delete() 将集合中的某个元素删除
clear() 清空集合
has() 判断某个值在不在set集合中
forEach() 和数组一样
keys() 获取遍历key的迭代器对象
values获取遍历value的迭代器对象
entries() 获取值-值对的迭代器对象
//获取set集合的长度
console.log(set.size);
// 给set集合在后面添加元素
set.add('tom')
let obj={name:'terry'}
let set =new Set([1,2,3,4,1,2,3,4,obj]);
// 删除set集合中的元素
// 不能删除对象 返回的是布尔值
let r=set.delete(obj)
console.log(r);
// 查看set集合中有没有某个值,找到返回true,找不到返回false
let r1=set.has('terry')
console.log(r1);
// 清空集合
set.clear()
// // 遍历集合
set.forEach((item,index)=>{
console.log(item,index);
})
console.log(set);
3.Map
类似于对象的数据结构,键的取值不再单单是字符串,可以为任意数值
map集合用于存放键值对 ,也就是一种映射关系
构造函数 Map()
let map =new Map([[1,2],[‘name’,‘tom’]]) //二维数组
//Map(2) { 1=>2,‘name’ => ‘tom’ }
3.1 Map.prototype api
Map.prototype.size
获取集合键值对个数
Map.prototype.set(key,value)
向集合中设置一个键值对
Map.prototype.get(key)
从集合中通过key获取value
Map.prototype.has(key)
判断集合是否包含key指定的键
Map.prototype.delete(key)
通过key删除一个键值对
Map.prototype.clear()
清空map集合
Map.prototype.keys()
//构建一个Map集合
let map =new Map([{},['name','zhangsan'],['age',12]]);
console.log(map);
// // 获取map集合的键值对的个数
console.log(map.size);
// // 给map集合设置键值对
map.set('gender','male')
console.log(map);
// 通过键获取键值
console.log(map.get('gender'));
// 查询map集合中是否有包含指定的键
console.log(map.has('gender'));
//通过key值删除键值对
map.delete('gender')
console.log(map);
map.forEach((item,index)=>{
console.log(item,index);
})
4.Symbol 新增的原始数据类型
Symbol的来源
es5的对象属性名都是字符串,这就容易造成属性名的冲突,为了保证每个属性的 名字都是独一无二的
Symbol就是一个类似字符串的值,不是对象,不要给其添加属性
// 创建不能使用new操作符 let s1=Symbol() let s2=Symbol() console.log(typeof s1);//symbol console.log(s1,s2);//Symbol() Symbol() //Symbol生成的都是有标识的值 console.log(s1==s2);//false
消除魔术字符串是指,在代码之中多次出现,与代码形成强耦合的某一个具体的字符串或者数值。风格良好的到吗,应该尽量消除魔术字符串,改由含义清晰的变量代替
// 计算一个形状的面积
let area=0
let s1=Symbol('sjx')
let shapeType={
Triangle:s1
}
function getArea(shape,options){
switch(shape){
case shapeType.Triangle:
area=.5*options.width*options.height
}
return area;
}
// getArea(shapeType,)
let r=getArea(shapeType,{width:10,height:3})
console.log(r);
获取一个对象中Symbol属性名
Symbol作为属性名,该属性不会出现在for…in 、for…of 循环中,也不会被Object.keys()、Object.getOwnPropertyName(),JSON.stringify()返回。
可以使用Object.getOwnPropertySymbols方法,可以获取指定对象的所有Symbol属性名
使用Reflect.ownKeys方法可以返回所有类型的键名,包括常规键名和Symbol键名
let s1=Symbol('lfl')
let obj={
name:'tom',
age:12,
// symbol类型作为键(属性名)时,需要中括号括起来
// 保证属性名不会重复,但是
[s1]:'女'
}
// getOwnPropertySymbols可以获取symbol属性名
let r1=Object.getOwnPropertySymbols(obj)
console.log(r1);//[ Symbol(lfl) ]
let r2=Reflect.ownKeys(obj)
console.log(r2);//[ 'name', 'age', Symbol(lfl) ]
Symbol值重复利用
Symbol.for()方法可以做到使用同一个Symbol值,参数接收的是一个字符串,该方法会搜索有没有以该参数作为名称的Symbol值,如果有,就返回这个Symbol值,否则就新建一个以该字符串为名称的Symbol值,并将其注册到全局
// .for 将s1注册到全局,不管它在不在全局
let s1=Symbol.for('foo')
let s2=Symbol.for('foo')
//s1和s2全等,说明symbol可以重复利用
console.log(s1===s2);//true
Symbol.keyFor()方法返回一个已登记的Symbol类型值key
let r=Symbol.(s1) console.log(r);//foo let r1=Symbol.forKey(s2) console.log(r1);//undefined内置Symbol
ES6中提供了11个内置的Symbol值,指向语言内部使用的方法
- Symbol.hasInstance
class MyClass {
[Symbol.hasInstance](foo) {
return foo instanceof Array;
}
}
[1, 2, 3] instanceof new MyClass() // true
指向内部一个方法,当其他对象使用instanceof运算符,判断是否为该对象的实例时,会调用这个方法
- Symbol.iterator
指向该对象的默认遍历器方法
//如何将类数组对象转化为可迭代对象
function add(a,b){
console.log(arguments);
// console.log(arguments[Symbol.iterator]);
// console.log(arguments[Symbol.iterator]());
console.log(arguments[Symbol.iterator]().next());
return a+b;
}
add(1,2,3,4)
5.迭代器
iterator是用来迭代可迭代对象的统一接口
value值和done值,value值返回的是数据结构的当前成员的值,done属性返回的是一个布尔值,表示遍历是否结束
内置类型拥有默认的迭代器行为
Array.prototype[Symbol.iterator]() // 数组迭代对象 TypedArray.prototype[Symbol.iterator]() //类数组迭代对象 String.prototype[Symbol.iterator]() //字符串迭代对象 Map.prototype[Symbol.iterator]() Set.prototype[Symbol.iterator]()
调用Iterator接口的场合
扩展运算符
yield *
for …of
Array.from()
Map(),Set(),WeakMap() ,WeakSet()
Promise.all()
Promise.race()



