知识回顾
数组
1m17
js本身并没有数组这个概念,数组本身也是对象,而对象,数组它的索引部分本质上是一个字符串,数组的索引是数字,JavaScript底层本身是在模拟字符串的样子
set
time 4m51s
var set=new Set();//成员是唯一的“数组”
/*map是一个对象,键名可以是一个对象,不必须是一个字符串
* 先可以就这样简单的理解,以后可以看出区别*/
新增API
time 8:25
const map=new Map();
const set=new Set();
const p=new Promise();
const p1=new Proxy();
新增API,无法通过Babel降级成、翻译成es5
可以用Babel插件降级,现在浏览器都支持了这些api
set数据
time 12m12s
const set = new Set();
console.log(set);
time 16m20s
const set = new Set();
set.add(5);
set.add(7);
console.log(set);//Set(2){5, 7}
var set = new Set([5,7]);
// var set = new Set({5,7});
/*
不行 报错 必须具有迭代接口Uncaught SyntaxError: Unexpected number,
参数是具备iterator的接口的数据结构;[],类数组
*/
// set.add(5);
// set.add(7);
console.log(set);//Set(2){5, 7}
不能重复
time 21m07s
set中没有重复的值
var set = new Set([1, 2, 3, 4, 5, 5]);
// var set = new Set({5,7});
/*
不行 报错 必须具有迭代接口Uncaught SyntaxError: Unexpected number,
参数是具备iterator的接口的数据结构;[],类数组
*/
set.add(5);
set.add(7);
console.log(set);
time 23m25s
与undefined、null
var set = new Set([undefined,undefined]);
console.log(set);//Set(1){undefined}
var set = new Set([undefined, undefined]);
console.log(set);//Set(1){undefined}
var set = new Set([undefined, undefined, null, null]);
console.log(set);//Set(2) { undefined, null }
var set = new Set([undefined, undefined, null, null, 5, '5', true, 1, NaN, NaN]);
console.log(set);//Set(7) { undefined, null, 5, '5', true, 1, NaN }
/*数组、对象都是新的,new出来的,地址不一样*/
var set = new Set([{}, {}, [], []]);
console.log(set);//Set(4) { {}, {}, [], [] }
console.log({}==={});//false
对象与set,链式调用
time 32m36s
var set = new Set();
var x = {id: 1}, y = {id: 2};
/*可以链式调用
* x指向的地址,再第二次添加时,添加的是同一个地址*/
// set.add(x).add(y).add(x);//分开写比较好,容易读懂,易读性
set.add(x)
.add(y)
.add(x);
/*add方法返回值为set对象
*添加值,返回是set结构本身 */
console.log(set.add(x));//Set(2) { { id: 1 }, { id: 2 } }
console.log(set);//Set(2) { { id: 1 }, { id: 2 } }
删除
time 37m
var set = new Set();
var x = {id: 1}, y = {id: 2};
/*可以链式调用
* x指向的地址,再第二次添加时,添加的是同一个地址*/
// set.add(x).add(y).add(x);
set.add(x)
.add(y)
.add(x);
/*add方法返回值为set对象
*添加值,返回是set结构本身 */
console.log(set.add(x));//Set(2) { { id: 1 }, { id: 2 } }
console.log(set);//Set(2) { { id: 1 }, { id: 2 } }
console.log(set.size);//2
console.log(set.delete(y));//true
console.log(set);//Set(1) { { id: 1 } }
console.log(set.delete(y));//false
has
time 38m49s
var set = new Set();
var x = {id: 1}, y = {id: 2};
set.add(x)
.add(y)
.add(x);
console.log(set.has(x));//true
console.log(set);//Set(2) { { id: 1 }, { id: 2 } }
set.clear();
console.log(set);//Set(0) {}
迭代器
time 48m57s
set没有键名,键名键值都一样
let set = new Set(['a', 'b', 'c', 'd', 'e', 'f', 'g']);
console.log(set);//Set(7) { 'a', 'b', 'c', 'd', 'e', 'f', 'g' }
// console.log(set.keys());
// console.log(set.values());
console.log(set.entries());
/* for(let i of set.keys()){
console.log(i)
}
for(let i of set.values()){
console.log(i)
}*/
for(let i of set.entries()){
console.log(i)
}
单独遍历set
54m39s
let set = new Set(['a', 'b', 'c', 'd', 'e', 'f', 'g']);
for (let i of set) {
console.log(i);
}
/*迭代set运行的是set.value上面的迭代方法*/
console.log(Set.prototype[Symbol.iterator]===Set.prototype.values);
foreach
time 57m55s
es6箭头函数简化写法
let set = new Set(['a', 'b', 'c', 'd', 'e', 'f', 'g']);
set.forEach((value, keys, set)=>console.log(value,keys,set))
应用,与展开运算符等的结合
time 1h00m55s
数组去重
把数组放在set中,利用set的特性,可以去重,之后再展开数组
let set = new Set(['a', 'b', 'c', 'd', 'e', 'f', 'g']);
console.log(...set);//a b c d e f g
console.log([...set]);//['a', 'b', 'c', 'd', 'e', 'f', 'g']
set、map翻倍
time 1h5m32s
let set=new Set([1,2,3,4,5,6,7]);
let set1=new Set([...set].map(value => value*2));
console.log(set1);
parseInt
time 1h8m
var arr = [1, 2, 3, 4];
var arr1=arr.map(parseInt);
console.log(arr1);//[1, NaN, NaN, NaN]
fillter
time 1h15m
交集、并集、差集
time 1h17m39s
并集
time 1h20m27s
from
time 1h29m
与map意思一样
映射一个新的解构
Map
time 1h30m47s
不能实现键与值一一对应,进行了Object原型上面的toString方法转化
bar
map使用
time 1h39m
let m = new Map();
var x = {id: 1},
y = {id: 2};
m.set(x,'foo');
m.set(y,'bar');
console.log(m.get(x));
console.log(m.get(y))
console.log(m);
迭代
time 1h41m
双源数据结构 【键名,键值】
let m=new Map([
['name','zhangsan'],
['name1','lisi']
])
console.log(m);
map.set添加
time 1h46m26s
let m = new Map();
m.set('name', 'zhangsan');
m.set('title', 'lisi');
console.log(m);
覆盖
let m = new Map();
m.set('name', 'zhangsan');
m.set('name', 'zhangsan11');
m.set('title', 'lisi');
console.log(m);
set 分析
time 1h51m47s
map(【】)等同于把数组循环之后,再set(数组的item,每一项),底层是这样实现的,类似于这样实现的
上面代码模拟map(参数),传参过程
覆盖
time 1h59m
get
time 2h1m
var map=new Map();
map.set(1,'map');
map.set(1,'bar');
console.log(map.get(1));//bar
引用值
time 2h3m
var map = new Map();
/*map.set(1,'map');
map.set(1,'bar');
console.log(map.get(1));//bar*/
map.set([5], 555);
console.log(map.get([5]));//undefined
map.set({}, 555);
console.log(map.get({}));//undefined
这样就行了,需要变量指向地址,变量储存地址
探究原始值、引用值的覆盖情况
time 2h6m
其它方法
set、map基本上是一样的
总结
time 2h17m
set没有键名,所以只需要add往里面添加,取值把它变成数组,该怎么取就怎么取值
map
time 2h21m