jsmap和set
js map 和set
map
JavaScript 的对象(Object),本质上是键值对的集合(Hash 结构),但是传统上只能⽤字符串当作键(ES6加⼊了Symbol作为属性名称)。这给它的使⽤带来了很⼤的限制。
它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。
也就是说,
Object 结构提供了“字符串—值”的对应,
Map 结构提供了“值—值”的对应,是⼀种更完善的 Hash 结构实现。如果你需要“键值对”的数据结构,Map ⽐ Object 更合适。
//map的使⽤
const map =new Map([
["a",111],
["b",222],
]);
console.log(map.size);
console.("a"));
map.set("c",333);
console.log(map.size);
console.log(map.has("c"));
console.log(map.delete("c"));
console.log(map.size);
map.clear();
console.log(map.size)
//map的迭代
console.log(map.keys());
for(let key of map.keys()){
console.log(key);
}
for(let value of map.values()){
console.log(value);
}
for(let item ies()){
console.log(item);
}
for(let[key, value]ies()){
console.log(key,value);
}
//迭代器模式  for( of ) 迭代      for( in )  遍历对象
遍历⽅法
Map 结构原⽣提供三个遍历器⽣成函数和⼀个遍历⽅法。
keys():返回键名的遍历器。
values():返回键值的遍历器。
entries():返回所有成员的遍历器。
forEach():遍历 Map 的所有成员。
需要特别注意的是,Map 的遍历顺序就是插⼊顺序。
另外map中不存储重复的值。
let obj ={ a:1};
map.forEach(function(key, value, map){
console.log(key, value,this.a);
}, obj);
//  obj就相当于作⽤域 this的指向
//map 数组对象直接的转换
//前端是map数据对象我要把数据传到后端
如果 Map 的键是⼀个基础类型的值(数字、字符串、布尔值),则只要两个值严格相等,Map 将其视为⼀个键,⽐如0和-0就是⼀个键,布尔值true和字符串true则是两个不同的键。
另外,undefined和null也是两个不同的键。
虽然NaN不严格相等于⾃⾝,但 Map 将其视为同⼀个键。
原生js和js的区别//map转数组
const map =new Map([
["a",111],
["b",222],
]);
//                        ...map ==  ["a", 111],["b", 222],    [] 或者 {}
// ... 对象的⼀个扩展运算符,取出对象中所有可以遍历的属性,拷贝到当前的对象
console.log([...map]);
const obj ={};
for(let[key, value]ies()){
obj[key]= value;
}
console.log(obj);
对象的数据解构扩展
ES6 允许直接写⼊变量和函数,作为对象的属性和⽅法。这样的书写更加简洁。
代码表明,ES6 允许在对象之中,直接写变量。这时,属性名为变量名, 属性值为变量的值。右侧是另⼀个例⼦。
function f(x,y){
return{x,y};
}
//等价于
function f(x,y){
return{x:x,y:y};
}
除了属性简写,⽅法也可以简写。
const f={
method(){
return"1";
//等价于
// method=function(){
//return "1";
}
}
注意,简洁写法的属性名总是字符串,这会导致⼀些看上去⽐较奇怪的结果。
JavaScript 定义对象的属性,有两种⽅法。
⽅法⼀是直接⽤标识符作为属性名
⽅法⼆是⽤表达式作为属性名,这时要将表达式放在⽅括号之内。
但是,如果使⽤字⾯量⽅式定义对象(使⽤⼤括号),在 ES5 中只能使⽤⽅法⼀(标识符)定义属性。
ES6 允许字⾯量定义对象时,⽤⽅法⼆(表达式)作为对象的属性名,即把表达式放在⽅括号内。
对象可枚举
对象的每个属性都有⼀个描述对象(Descriptor),⽤来控制该属性的⾏为。
描述对象的enumerable属性,称为“可枚举性”,如果该属性为false,就表⽰某些操作会忽略当前属性。
⽬前,有四个操作会忽略enumerable为false的属性。
for…in循环:只遍历对象⾃⾝的和继承的可枚举的属性。
Object.keys():返回对象⾃⾝的所有可枚举的属性的键名。
JSON.stringify():只 串⾏化 对象⾃⾝的可枚举的属性。
Object.assign(): 忽略enumerable为false的属性,只拷贝对象⾃⾝的可枚举的属性。
ES6 ⼀共有 5 种⽅法可以遍历对象的属性。
(1)for…in
for…in循环遍历对象⾃⾝的和继承的可枚举属性(不含 Symbol 属性)
(2)Object.keys(obj)
Object.keys返回⼀个数组,包括对象⾃⾝的(不含继承的)所有可枚举属性(不含 Symbol 属性)的键名。
(3)OwnPropertyNames(obj)
(5)Reflect.ownKeys(obj)
Reflect.ownKeys返回⼀个数组,包含对象⾃⾝的所有键名,不管键名是 Symbol 或字符串,也不管是否可枚举。
set
ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯⼀的,没有重复的值。
Set本⾝是⼀个构造函数,⽤来⽣成 Set 数据结构。
set 允许你存储 任何类型的值 成员的值是唯⼀的 没有重复的值
//set ⽤法
let arr =[1,2,3,4,4];
const set=new Set(arr);//左侧代码也展⽰了⼀种去除数组重复成员的⽅法。
//可以使⽤add()⽅法向 Set 结构加⼊成员
set.add(5);
console.log(set.size);
console.log(set.has(5));
console.log(set.delete(5));
console.log(set.size);
[...new Set("aaadfac")].join();//adfc
/
/左侧的⽅法也可以⽤于,去除字符串⾥⾯的重复字符。
向 Set 加⼊值的时候,不会发⽣类型转换,所以5和“5”是两个不同的值。Set 内部判断两个值是否不同,使⽤的算法叫做“Same-value-zero equality”,它类似于精确相等运算符(===),主要的区别是NaN等于⾃⾝,⽽精确相等运算符认为NaN不等于⾃⾝。
Set 结构的实例有以下属性。
structor:构造函数,默认就是Set函数。
Set.prototype.size:返回Set实例的成员总数。
Set 实例的⽅法分为两⼤类:操作⽅法(⽤于操作数据)和遍历⽅法(⽤于遍历成员)。下⾯先介绍四个操作⽅法。
add(value):添加某个值,返回 Set 结构本⾝。
delete(value):删除某个值,返回⼀个布尔值,表⽰删除是否成功。
has(value):返回⼀个布尔值,表⽰该值是否为Set的成员。
clear():清除所有成员,没有返回值。
Array.from⽅法可以将 Set 结构转为数组
const a=new Set([1,2,3,4]);
cont array=Array.from(a);
Set数据结构的遍历操作
value):删除某个值,返回⼀个布尔值,表⽰删除是否成功。
has(value):返回⼀个布尔值,表⽰该值是否为Set的成员。
clear():清除所有成员,没有返回值。
Array.from⽅法可以将 Set 结构转为数组
const a=new Set([1,2,3,4]);
cont array=Array.from(a);
Set数据结构的遍历操作
Set 结构的实例与数组⼀样,也拥有forEach⽅法,⽤于对每个成员执⾏某种操作,没有返回值。这⾥需要注意,Set 结构的键名就是键值(两者是同⼀个值),因此第⼀个参数与第⼆个参数的值永远都是⼀样的。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。