set 数据结构,类似数组。所有的数据都是唯一的,没有重复的值。它本身是一个构造函数。
- // 去重
- var s = new Set([1, 2, 2, 3, 4, 4, 5, 6])
- console.log(s);
- //返回 Set(6) {1, 2, 3, 4, 5, …}
- // [[Entries]]
- // 0: 1
- // 1: 2
- // 2: 3
- // 3: 4
- // 4: 5
- // 5: 6
- // size: 6
- // [[Prototype]]: Set
- // 转成真的的数组
- console.log(Array.from(s)); // [1, 2, 3, 4, 5, 6]
属性和方法:
size:数据的长度
- // 获取set集合长度
- var s = new Set([1, 2, 2, 3, 4, 4, 5, 6])
- console.log(s.size); //6
add():添加某个值,返回set结构本身,改变原数组
- // // 使用add方法添加值 返回set集合本身,改变原数组
- var s = new Set([1, 2, 2, 3, 4, 4, 5, 6])
- console.log(s.add(7));
- console.log(s);
- // 返回的都是
- // Set(6) {1, 2, 3, 4, 5, …}
- // [[Entries]]
- // 0: 1
- // 1: 2
- // 2: 3
- // 3: 4
- // 4: 5
- // 5: 6
- // 6: 7
- // size: 7
- // [[Prototype]]: Set
delete()删除某个值,返回一个布尔值,表示删除是否成功,改变原数组
- // delete 删除某个值返回布尔值,改变原数组
- var s = new Set([1, 2, 2, 3, 4, 4, 5, 6])
- console.log(s.delete(1)); // true
- console.log(s);
- //返回 Set(5) { 2, 3, 4, 5, …}
- // [[Entries]]
- // 0: 2
- // 1: 3
- // 2: 4
- // 3: 5
- // 4: 6
- // size: 5
- // [[Prototype]]: Set
has()查找某条数据,返回一个布尔值
- // has 查找某个值,返回布尔值
- var s = new Set([1, 2, 2, 3, 4, 4, 5, 6])
- console.log(s.has(9)); //false
clear() 清除所有成员,没有返回值
- // clear 清除所有成员,没有返回值
- var s = new Set([1, 2, 2, 3, 4, 4, 5, 6])
- console.log(s.clear()); // undefined
- console.log(s); //Set(0) {size: 0}
- var obj = { name: "zhangsan", age: 30 };
- console.log(Object.keys(obj));// ['name', 'age']
- console.log(Object.values(obj));// ['zhangsan', 30]
- console.log(Object.entries(obj));// [[name,zhangsan],[age,30] ]
数组中的值会自动解析到对应接收该值的变量中,数组的解构赋值要一一对应,如果有对应不上的就是undefined
- // 数组的解构赋值
- // 赋值和顺序有关
- let arr = ["前端", "后端", "大数据"]
- let [qianduan, houduan, dashuju] = arr
- console.log(qianduan, houduan, dashuju);
- // 前端 后端 大数据
对象的解构赋值
对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值有他的位置决定的;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值
- // 对象的解构赋值
- // 赋值和顺序无关,属性名和变量名是必须一致,否则返回undefined
- let obj = {
- name: "张三",
- age: 30,
- data: {
- msg: "成功",
- status: 200
- }
- }
- let { name, age, data: { msg, status } } = obj
- console.log(name, age, msg, status); // 张三 30 成功 200
给解构出来的变量修改名字
- let obj = {
- name: "张三",
- age: 30,
- data: {
- msg: "成功",
- status: 200
- }
- }
- // 给解构出来的变量修改名字
- let { name: username, age: userage, data: { msg: usermsg, status: userstatus } } = obj
- console.log(username, userage, usermsg, userstatus);// 张三 30 成功 200
可以给解构出来的变量设置默认值
☆当对象里面的属性值是undefined,或者压根就没有这个属性,这时候就会给变量赋值成默认值
- //可以给解构出来的变量设置默认值
- // ☆当对象里面的属性值是undefined,或者压根就没有这个属性,这时候就会给变量赋值成默认值
- let obj = {
- name: undefined,
- age: 30,
- data: {
- msg: "成功",
- status: 200
- }
- }
- let { name: username = "李四", age: userage, data: { msg: usermsg, status: userstatus } } = obj
- console.log(username, userage, usermsg, userstatus); // 李四 30 成功 200
1.利用es6 拓展运算符来实现字符串转数组
- var str = "abcdefg"
- // 字符串转数组
- console.log(str.split("")); // ['a', 'b', 'c', 'd', 'e', 'f', 'g']
- // 利用es6 拓展运算符来实现字符串转数组
- console.log([...str]); //['a', 'b', 'c', 'd', 'e', 'f', 'g']
2.利用es6 拓展运算符实现set集合转成真数组
不可以使用Array.prototype.slice.call(s) 把Set集合转数组,这种方式适合把函数中的参数集合(例:arguments)转成真正的数组
- let arr = [1, 22, 22, 33, 3, 4, 44, 5]
- let s = new Set(arr)
- // 转化成真数组
- console.log(Array.from(s)); //[1, 22, 33, 3, 4, 44, 5]
-
- // 利用es6 拓展运算符实现set集合转成真数组
- let narr = [...s]
- console.log(narr); // [1, 22, 33, 3, 4, 44, 5]
- // 不可以使用下面的方法 把Set集合转数组,这种方式适合把函数中的参数集合(例:arguments)转成真正的数组
- console.log(Array.prototype.slice.call(s)); // []
3.利用es6拓展运算符完成数组拼接
- let arr1 = [1, 2, 3]
- let arr2 = [4, 5, 6]
- // 利用数组concat方法完成数组拼接
- let narr1 = arr1.concat(arr2)
- console.log(narr1); // [1, 2, 3, 4, 5, 6]
- // 利用es6拓展运算符完成数组拼接
- let narr2 = [...arr1, ...arr2]
- console.log(narr2); // [1, 2, 3, 4, 5, 6]
4.利用es6拓展运算符解决,把传过来的多个参数,组成数组
- // 把传过来的多个参数,组成数组
- // 利用es6拓展运算符解决
- function fn(...rest) {
- console.log(rest); // [1, 2, 3, 4, 5]
- }
- fn(1, 2, 3, 4, 5)
传两个参数,第一个参数需要使用,其他的组成数组
- function fn(a, ...b) {
- console.log(a, b); // 1 (4) [2, 3, 4, 5]
- }
- fn(1, 2, 3, 4, 5)
只传一个参数
- function fn(a, ...b) {
- console.log(a, b); // 1 []
- }
- fn(1)
不传参数
- function fn(a, ...b) {
- console.log(a, b); // undefined []
- }
- fn()
JavaScript的对象(object),本质是上键值对的集合,但是传统上只能用字符串当做键值对。
为了解决这个问题,ES6提供了map数据结构。它列私语对象,也是键值对的集合。但是这个键的范围不限于字符串,各种类型的值(包括对象)都可以当做键。也就是说object结构提供了(字符串-值)的对应。
返回map的元素数
- var m = new Map();
- m.set("name", "张三")
- m.set("5", "李四")
- m.set(5, "王老五")
- console.log(m.size); // 3
(1)set()
给map添加数据,返回添加后的map(给已存在的键赋值后会覆盖掉之前的值)
- var m = new Map();
- m.set("name", "张三")
- m.set("5", "李四")
- m.set(5, "王老五")
- console.log(m.size); // 3
- console.log(m); // Map(3) {'name' => '张三', '5' => '李四', 5 => '王老五'}
(2)get()
获取某个key的值,返回key对应的值,没有则返回undefined
- // get() 获取某个key的值,返回key对应的值,没有则返回undefined
- var m = new Map();
- m.set("name", "张三")
- m.set("5", "李四")
- m.set(5, "王老五")
- console.log(m.get("5")); // 李四
- console.log(m.get("")); // undefined
(3)has()
检测是否存在某个key,返回布尔值
- var m = new Map();
- m.set("name", "张三")
- m.set("5", "李四")
- m.set(5, "王老五")
- // has() 检测是否存在某个key,返回布尔值
- console.log(m.has("5")); // true
(4)delete()
删除某个key及其对应的value,返回布尔值,成功删除则为true
- var m = new Map();
- m.set("name", "张三")
- m.set("5", "李四")
- m.set(5, "王老五")
- // delete() 删除某个key及其对应的value,返回布尔值,成功删除则为true
- console.log(m.delete("5"));// true
- console.log(m);// Map(2) {'name' => '张三', 5 => '王老五'}
(5)clear()
清除所有的值,返回undefined
- var m = new Map();
- m.set("name", "张三")
- m.set("5", "李四")
- m.set(5, "王老五")
- // clear() 清除所有的值,返回undefined,括号里面的值可为任何数,同样可以清除所有
- console.log(m.clear()) // undefined
- console.log(m) // Map(0) {size: 0}
注意:map的遍历顺序就是插入顺序
(1)keys()
获取map的所有key
- var m = new Map();
- m.set("name", "张三")
- m.set("5", "李四")
- m.set(5, "王老五")
- console.log(m.keys()); // MapIterator {'name', '5', 5}
(2)values()
获取map的所有值
- var m = new Map();
- m.set("name", "张三")
- m.set("5", "李四")
- m.set(5, "王老五")
- console.log(m.values());// MapIterator {'张三', '李四', '王老五'}
(3)entries()
获取map的所有成员
- var m = new Map();
- m.set("name", "张三")
- m.set("5", "李四")
- m.set(5, "王老五")
- console.log(m.entries());// MapIterator {'name' => '张三', '5' => '李四', 5 => '王老五'}
(4)for (va i of aa)
如果是for(var key of m.entries()),则此处的key表示是一个数组,数组的第一项是key,第二项是value
- var m = new Map();
- m.set("name", "张三")
- m.set("5", "李四")
- m.set(5, "王老五")
- for (var key of m.keys()) {
- console.log(key);// name "5" 5
- }
- for (var key of m.values()) {
- console.log(key);// 张三 李四 王五
- }
- // ☆ 此处key是一个数组,数组的第一项是key,第二项是value
- for (var key of m.entries()) {
- console.log(key);
- // 返回
- // ['name', '张三']
- // ['5', '李四']
- // [5, '王老五']
- }
使用for of 可以用来循环map迭代器(MapIterator),遍历map的所有成员
for of 不可以用来遍历对象,会提示对象不是一个迭代器 遍历对象只能遍历for in
for of 可以用来遍历数组,里面的变量的值是数组的每一项
- // 使用for of 可以用来循环map迭代器,
- // for of 不可以用来遍历对象,会提示对象不是一个迭代器 遍历对象只能遍历for in
- // for of 可以用来遍历数组,里面的变量的值是数组的每一项
- var arr = [{ name: "张三", age: 30 }, { name: "李四", age: 40 }]
- for (var item of arr) {
- console.log(item);
- // 返回
- // {name: '张三', age: 30}
- // {name: '李四', age: 40}
- }
(5)foreach函数
- // set集合
- var s = new Set();
- s.add("小明1")
- s.add("小明2")
- s.add("小明3")
- // 第一个参数和第二个参数都是set集合中的元素,第三个参数是set集合本身
- s.forEach(function (key, value, set) {
- console.log(key, value, set);
- // 小明1 小明1
- // 小明2 小明2
- // 小明3 小明3
- })
-
- // map集合
- var m = new Map([
- ["xiaoming", "祖传中医"],
- [123, "清廷御用御医"],
- ["LIUQING", "新一代网红精神小妹余额过万"]
- ])
- // // 第一个参数是值,第二个参数是键,第三个参数是map集合本身
- m.forEach(function (value, key, map) {
- console.log(value, key, set);
- //祖传中医 xiaoming
- // 清廷御用御医 123
- //新一代网红精神小妹余额过万 LIUQING
- })
-
练习:
- let map1 = new Map([
- [1, 'One'],
- [2, 'Two'],
- [3, 'Three']
- ])
-
- console.log([...map1.keys()]); // [ 1, 2, 3 ]
- console.log([...map1.entries()]); // [ [ 1, 'One' ], [ 2, 'Two' ], [ 3, 'Three' ] ]
- console.log(...map1.entries()); // [ 1, 'One' ] [ 2, 'Two' ] [ 3, 'Three' ]
- var obj = { name: "zhangsan", age: 30 };
- console.log(Object.keys(obj));// ['name', 'age']
- console.log(Object.values(obj));// ['zhangsan', 30]
- console.log(Object.entries(obj));// [[name,zhangsan],[age,30] ]