ES6引入了2种新的数据结构

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形式

示例:

  1. 直接报错
const map = Map() //直接报错
  1. 传入一个数组,也不会报错
const arr = [1,2,3]
const map = new Map(arr)
console.log(map);
  1. 必须传入一个键值对形式的对象。
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是键值对的无序集合

Map - JavaScript | MDN (mozilla.org)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容