ES6引入了2种新的数据结构
- Set
- Map
Set()是什么?
定义:
-
Set()
是一个构造函数。 - 必须使用new调用。
- 用来实例化一个set对象。
- set对象用来存储任何类型的唯一值。
语法
new Set() //创建一个空set对象
new Set(iterable)//创建一个有值的set对象
- iterable:可迭代对象。
返回值:
返回一个set对象
示例:
//1.创建一个空set
const s1 = new Set()
console.log(s1); //{size: 0}
//2.使用可迭代对象创建一个set对象
const arr = [1,2,3,4]
const s1 = new Set(arr)
console.log(arr); //[1, 2, 3, 4]
console.log(s1); //{1, 2, 3, 4}
//3.使用包含重复值的数组创建一个set对象
const arr = [1,2,3,4,4,3,2,1]
const s1 = new Set(arr)
console.log(arr); //[1, 2, 3, 4, 4, 3, 2, 1]
console.log(s1); //{1, 2, 3, 4} //set对象会排重,包含的值都是唯一的
//4.使用包含重复值的数组创建一个set对象,对象也比例外,对象存储的是地址
const obj = {x:1}
const arr = [obj,{x:1},3,4,4,3,{x:1},obj]
const s1 = new Set(arr)
console.log(arr); //[{…}, {…}, 3, 4, 4, 3, {…}, {…}]
console.log(s1); //{{…}, {…}, 3, 4, {…}}
Set.prototype.add()
定义:
用于向Set对象中添加新值。(如果值也存在,那么就不做添加)
语法:
set.add(value) //value:任意类型的值 在小括号里面只能添加一个值,要添加多个值,在后面在进行添加:set1.add(1).add(2)
返回值:
返回更新后的Set对象
示例:
const set1 = new Set()
set1.add(1)
set1.add('hello')
set1.add(true)
set1.add(undefined)
set1.add(NaN)
set1.add([1,2,3])
set1.add({x:1})
console.log(set1); //{1, 'hello', true, undefined, NaN, …}
const set1 = new Set()
set1.add(1).add(2) //可以重复添加
set1.add('hello')
set1.add(true)
set1.add(undefined).add(undefined) //不可以重复添加
set1.add(NaN).add(NaN) //不可以重复添加
set1.add([1,2,3])
set1.add({x:1})
console.log(set1); //{1, 'hello', true, undefined, NaN, …}
Set.prototype.has()
定义:
Has()方法用于检索set对象中是否存在指定值
语法:
set.has(value) //value是你要检索的值
返回值:
返回一个布尔值
- true:表示存在
- false:表示不存在
示例:
const set1 = new Set()
set1.add(1)
set1.add('hello')
set1.add(true)
set1.add(undefined)
set1.add(NaN)
set1.add([1,2,3])
set1.add({x:1})
console.log(set1);
const find = set1.has(undefined)
console.log(find); //true
Set.prototype.delete()
定义:
delete() 方法从 Set 对象中删除指定的值(如果该值在 Set 中)。
语法:
delete(value)
返回值:
成功删除返回 true,否则返回 false。
示例:
const mySet = new Set();
mySet.add("foo");
console.log(mySet.delete("bar")); // 返回 false,不包含 "bar" 这个元素
console.log(mySet.delete("foo")); // 返回 true,删除成功
console.log(mySet.has("foo")); // 返回 false,"foo" 已经成功删除
如何修改set对象中的值
set API 没有提供一种直接的修改值的方法,我们只能曲线
Set.prototype.forEach()
定义:
MDN:forEach() 方法对set对象中的每个值安插入
forEach() 方法对 Set 对象中的每个值按插入顺序执行一次提供的函数。
语法:
// 回调函数
forEach(callbackFn)
forEach(callbackFn, thisArg)
// 箭头函数
forEach(() => { /* ... */ } )
forEach((value) => { /* ... */ } )
forEach((value, key) => { /* ... */ } )
forEach((value, key, set) => { /* ... */ } )
// 内联回调函数
forEach(function() { /* ... */ })
forEach(function(value) { /* ... */ })
forEach(function(value, key) { /* ... */ })
forEach(function(value, key, set) { /* ... */ })
forEach(function(value, key, set) { /* ... */ }, thisArg)
callbackFn:对set对象中的每一个值调用一次回调函数。回调有三个参数
- value:传入set的每一个值
- key:传入value的key
- Set:传入set对象本身
返回值:
没有返回值或者说返回:undefined
示例:
const set = new Set(['a','b','c'])
const set2 = new Set()
set.forEach((value,key,set) => {
console.log(value);
console.log(key);
console.log(set);
if(value === 'b') value = 'bbbb'
set2.add(value)
console.log(set2);
})
console.log(set2);
计算属性
定义:
ES6新增对象属性名语法:计算属性是使用(方括号[])设置对象的属性名
方括号:
方括号是一个操作符,操作符是用来操作表达式的。
我们可以在方括号内传入一个表达式
const a = 1
Map() 构造函数
定义:
- Map()是ES6新增的内置构造函数
- Map()构造函数用于创建Map对象
- 单词Map:意思:映射、地图
语法:
const map = Map() //直接报错
//必须使用new调用,不然会报错
new Map()
new Map(iterable) //传入可迭代对象 必须是:key/value形式
示例:
- 直接报错
const map = Map() //直接报错
- 传入一个数组,也不会报错
const arr = [1,2,3]
const map = new Map(arr)
console.log(map);
- 必须传入一个键值对形式的对象。
const arr = [[1,'张三'],[2,'李四'],[3,'麻醉']]
const map2 = new Map(arr)
console.log(map2); //{1 => '张三', 2 => '李四', 3 => '麻醉'}
关于Map的知识点
- 定义
- 如何创建
- 增删改查 5个方法(含删除全部)
- 查询key|value|元素:三个方法
- 遍历:1个方法
- map.size属性
- Map和Object的区别
- map有长度,object没有
- map可迭代,object不可以迭代
- map的key可以是任意类型
- object的可以只能是字符串、计算属性、symbol
- Map是键值对的有序集合
- object是键值对的无序集合
Map对象是什么
Map是键值对的有序集合
定义:
- Map对象是ES6引入的一种新型数据结构
- 和ES中的Object一样,也使用键值对形式存储数据类型
- 和Object不一样的地方在于:
- 有序存储:Map会记录存储的位置
- Map对象中的key可以是任意数据类型
创建Map对象
语法
new Map()
new Map(iterable)
lterable:1.必须是可迭代对象。注意:传入的可迭代对象必须是键值对形式
2.可迭代对象必须是键值对
3.key可以是任意类型
const map = new Map([1,2,3]) //报错
const arr = [[1,'2'],[2,'3'],[3,'4'],[4,'w'],[5,'五']] //可以
const map = new Map({x:1}) //报错
const map = new Map(‘hello') //报错
const map3 = new Map([
[0,'a'],
['hello','b'],
[true,'c'],
[undefined,'b'],
[null,'e'],
[{x:1},'f'],
[[1,2,3],'g'],
[function () {},'h']
])
console.log(map3);
map对象的添加、增加
map对象的删除
map对象的改
map对象的查询
Map.prototype.forEach()
map.get()
定义:
get() 方法用于查询指定key的value
语法:
mao.get(key)
返回值:
- 返回查询到的value
- undefined
示例:
Map.prototype.set()
定义:
set用于向map对象添加或修改键值对
语法:
map.set(key,value)
返回值:
返回更新的对象
示例:
console.log(map3.set('黄永福','投影仪管理员'));
console.log(map3.get('黄永福'));
console.log(map3.set('黄永福','纪律委员','饮水机管理员'));
console.log(map3.get('黄永福'));
Map.prototype.has()
定义:
has() 方法用于检索map对象中是否具有指定的key
语法:
map.has(key)
返回值:
返回 true;否则返回 false。
示例:
console.log(map3.has('mmm'));
Map.prototype.delete()
定义:
delete方法用于删除Map 对象中指定的key元素。
语法:
map.delete
返回值:
返回 true;否则返回 false。
示例:
console.log(map3.delete('mmm'));
Map.prototype.forEach()
定义:
forEach()方法用于遍历
语法:
// 回调函数
forEach(callbackFn)
forEach(callbackFn, thisArg)
// 箭头函数
forEach(() => { /* … */ } )
forEach((value) => { /* … */ } )
forEach((value, key) => { /* … */ } )
forEach((value, key, map) => { /* … */ } )
// 内联回调函数
forEach(function() { /* … */ })
forEach(function(value) { /* … */ })
forEach(function(value, key) { /* … */ })
forEach(function(value, key, map) { /* … */ })
forEach(function(value, key, map) { /* … */ }, thisArg)
返回值:
- undefined
示例:
Map.prototype.keys()
定义:
keys()用于获取map对象的keys
语法:
map.keys()
返回值:
返回一个新的Map迭代器对象。
示例:
const myMap = new Map();
myMap.set("0", "foo");
myMap.set(1, "bar");
myMap.set({}, "baz");
const mapIter = myMap.keys();
console.log(mapIter.next().value); // "0"
console.log(mapIter.next().value); // 1
console.log(mapIter.next().value); // Object
总结
对象和Map是什么?
- 对象是键值对的无序集合
- Map是键值对的有序集合
Set()是什么?
- set对象是一种新型数据结构
- set对象是一种存储任何类型的唯一值的新型数据结构
Set()语法?
语法
new Set() //创建一个空set对象
new Set(iterable)//创建一个有值的set对象
NaN是什么,有什么特点?
- 不是数值的数值类型
- 代表非数字值的特殊值
数组转字符串的方法
- 1.使用toString ()函数,它能够把数组中每个元素转换为字符串,然后以逗号连接输出显示。
- 2.使用join ()函数,它把数组中的所有元素转换一个字符串,元素间通过指定的分隔符进行分隔。
字符串转数组的方法
- 1.使用split ()方法,可以将给定字符串str拆分为字符串数组,语法“str.split (separator)”,separator指定分割的地方。
- 2.使用Array.from ()方法,字符串的每个字母都转换为新数组实例的元素。
什么是计算属性?
- 计算属性是ES6引入的一种命名对象key的方法
去重字符串
const arr2 = 'tamato'
const se2 = new Set(arr2)
console.log(se2);
console.log([...arr2]);
console.log([...arr2].join(''));
console.log([...se2].join(''));
对象中的key的语法是什么?{x:1}
- 对象的属性名(key):必须是字符串或Symbol()或计算属性
const obj = {
x:1,
"y":2,
0:'hello',
undefined:'world',
for:'I miss you',
}
console.log(obj);
console.log(obj.for);
console.log(obj["0"]);
Set.prototype.add()
- 用于向Set对象中添加新值。(如果值也存在,那么就不做添加)
Set.prototype.has()
- Has()方法用于检索set对象中是否存在指定值
Set.prototype.delete()
- delete() 方法从 Set 对象中删除指定的值(如果该值在 Set 中)。
Set.prototype.forEach()
- MDN:forEach() 方法对set对象中的每个值安插入
- forEach() 方法对 Set 对象中的每个值按插入顺序执行一次提供的函数。
Map和Object的区别
- map有长度,object没有
- map可迭代,object不可以迭代
- map的key可以是任意类型
- object的可以只能是字符串、计算属性、symbol
- Map是键值对的有序集合
- object是键值对的无序集合