Set 的应用
是相对于arr 的进阶,arr 是以为索引按索引排序。插入的话会导致原有数据重新排列。
Set 是以键为索引,取值和插拔速度是非常快的。
Array: 数组用来搜索元素的方法时间复杂度为0(N)。换句话说,运行时间的增长速度与数据大小的增长速度相同。
Set用于搜索、删除和插入元素的方法的时间复杂度都只有O(1),这意味着数据的大小实际上与这些方法的运行时间无关。
weakSet 即 值 只能为对象。
WeakSet 中的对象都是弱引用,即垃圾回收机制不考虑 WeakSet 对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于 WeakSet 之中
WeakSet 适合临时存放一组对象,以及存放跟对象绑定的信息。只要这些对象在外部消失,它在 WeakSet 里面的引用就会自动消失。
// 举一个goole 的面试题
Eg : 已知数组 arr [1,3,4,5,6] 和常量sum = 9,判断数组内的数组内是否存在2数字之和等于sum, 存在返回true 不存在返回false
const arr = [1, 2, 3, 4, 5, 6];
const sum = 9;
const findSum = (arr, val) => {
let searchValues = new Set();
searchValues.add(val - arr[0]);
for (let i = 1, length = arr.length; i < length; i++) {
let searchVal = val - arr[i];
if (searchValues.has(arr[i])) {
return true;
} else {
searchValues.add(searchVal);
}
};
return false;
};
const findSum2 = (arr, sum) =>
arr.some((set => n => {
console.log(set)
return set.has(n) || !set.add(sum - n)
})(new Set));
// findSum3 是对 find some2 的解释
// const findSum3 = (arr, sum) => {
// return arr.some((function (set) {
// return (n, ind, array) => {
// return set.has(n) || !set.add(sum - n)
// }
// })(new Set))
// }
// 方法3 其实 箭头函数也不是特别好,还是 function 的定义函数好点。
// 如果使用箭头函数,this 是没有的!!注意是没有的!!所以 some 的第三个参数失效!
const calc = (arr,sum)=>{
return arr.some(function(n,ind,array){
return this.has(n) || !this.add(sum - n)
},new Set)
}
calc(arr, sum)
console.log('--calc', calc(arr, sum))
Map 的前世今生
对obj 的进阶。Obj 的key 只能为字符串。不能为对象
WeakMap只接受对象作为键名(null除外),不接受其他类型的值作为键名;