栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

day3 可迭代元素 ,迭代器,Symbol

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

day3 可迭代元素 ,迭代器,Symbol

可迭代元素

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()

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/301236.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号