问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

javascript中map和json是不是一个东西?他俩的格式为什么有什么区别吗...

发布网友 发布时间:2022-05-06 11:51

我来回答

2个回答

懂视网 时间:2022-05-14 23:57

本篇文章主要介绍了浅谈es6 javascript的map数据结构,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

本文介绍了es6 javascript的map数据结构,分享给大家,具体如下:

Map 结构的目的和基本用法

JavaScript 的对象( Object), 本质上是键值对的集合( Hash 结构), 但是传统上只能用字符串当作键。 这给它的使用带来了很大的限制。

var data = {}; 
var element = document.getElementById('myp'); 
data[element] = 'metadata'; 
data['[object HTMLpElement]'] // "metadata"

上面代码原意是将一个 DOM 节点作为对象data的键, 但是由于对象只接受字符串作为键名, 所以element被自动转为字符串[object HTMLpElement]。

为了解决这个问题, ES6 提供了 Map 数据结构。 它类似于对象, 也是键值对的集合, 但是“ 键” 的范围不限于字符串, 各种类型的值( 包括对象) 都可以当作键。 也就是说, Object 结构提供了“ 字符串— 值” 的对应, Map 结构提供了“ 值— 值” 的对应, 是一种更完善的 Hash 结构实现。 如果你需要“ 键值对” 的数据结构, Map 比 Object 更合适。

var m = new Map(); 
var o = { 
 p: 'Hello World' 
}; 
m.set(o, 'content') 
m.get(o) // "content" 
m.has(o) // true 
m.delete(o) // true 
m.has(o) // false

上面代码使用set方法, 将对象o当作m的一个键, 然后又使用get方法读取这个键, 接着使用delete方法删除了这个键。
作为构造函数, Map 也可以接受一个数组作为参数。 该数组的成员是一个个表示键值对的数组。

var map = new Map([ 
 ['name', ' 张三 '], 
 ['title', 'Author'] 
]); 
map.size // 2 
map.has('name') // true 
map.get('name') // " 张三 " 
map.has('title') // true 
map.get('title') // "Author"

上面代码在新建 Map 实例时, 就指定了两个键name和title。

Map 构造函数接受数组作为参数, 实际上执行的是下面的算法。

var items = [ 
 ['name', ' 张三 '], 
 ['title', 'Author'] 
]; 
var map = new Map(); 
items.forEach(([key, value]) => map.set(key, value));

下面的例子中, 字符串true和布尔值true是两个不同的键。

var m = new Map([ 
 [true, 'foo'], 
 ['true', 'bar'] 
]); 
m.get(true) // 'foo' 
m.get('true') // 'bar'

如果对同一个键多次赋值, 后面的值将覆盖前面的值。

let map = new Map(); 
map 
 .set(1, 'aaa') 
 .set(1, 'bbb'); 
map.get(1) // "bbb"

上面代码对键1连续赋值两次, 后一次的值覆盖前一次的值。

如果读取一个未知的键, 则返回undefined。

new Map().get('asfddfsasadf') 
 // undefined

注意, 只有对同一个对象的引用, Map 结构才将其视为同一个键。 这一点要非常小心。

var map = new Map(); 
map.set(['a'], 555); 
map.get(['a']) // undefined

上面代码的set和get方法, 表面是针对同一个键, 但实际上这是两个值, 内存地址是不一样的, 因此get方法无法读取该键, 返回undefined。

同理, 同样的值的两个实例, 在 Map 结构中被视为两个键。

var map = new Map(); 
var k1 = ['a']; 
var k2 = ['a']; 
map 
 .set(k1, 111) 
 .set(k2, 222); 
map.get(k1) // 111 
map.get(k2) // 222

上面代码中, 变量k1和k2的值是一样的, 但是它们在 Map 结构中被视为两个键。

由上可知, Map 的键实际上是跟内存地址绑定的, 只要内存地址不一样, 就视为两个键。 这就解决了同名属性碰撞( clash) 的问题, 我们扩展别人的库的时候, 如果使用对象作为键名, 就不用担心自己的属性与原作者的属性同名。

如果 Map 的键是一个简单类型的值( 数字、 字符串、 布尔值), 则只要两个值严格相等, Map 将其视为一个键, 包括0和 - 0。 另外, 虽然NaN不严格相等于自身, 但 Map 将其视为同一个键。

let map = new Map(); 
map.set(NaN, 123); 
map.get(NaN) // 123 
map.set(-0, 123); 
map.get(+0) // 123

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

vue-cli配置文件(详细教程)

使用jQuery封装animate.css(详细教程)

在vuex中如何实现闲置状态进行重置

热心网友 时间:2022-05-14 21:05

不是一个东西,但是可以相互转换,主要区别就是都有自己的格式,map相当于数组,json的格式是{key:value,key:value}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
为什么来大姨妈胸会胀 少儿学什么舞蹈 青年学什么舞蹈好 成年人学什么舞蹈 福州企业最低工资标准 2013年厦门的底薪是多少 生产要素的需求有哪些性质 生产要素的需求有何特点? 什么是生产要素需求 微观经济学要素需求什么是条件要素需求?它和要素需求有什么不同?_百度... 谁知道把电脑屏幕拿去修理店修理需要多久 电脑显示屏拿去修一般修多久? excel表格中,输入竖排文字,但是输入的"NO."也是竖着的,怎么把它改成横着的? 郑州纸箱厂好不好? 郑州哪里做土特产包装吗? 郑州纸箱厂哪家价格比较低,能承接小订单,质量稳定? 郑州纸箱厂 那家出货快 价格公道 郑州市君健纸箱有限公司怎么样? 郑州康师傅纸箱厂怎么样? 郑州哪里做瓦楞纸箱包装? 郑州市,纸箱包装厂哪一家做的最大最全最好。 郑州锦丰纸箱包装有限公司怎么样? 郑州前进包装纸箱有限公司怎么样? 纯牛奶对儿童有什么好处 郑州市弘泰纸箱包装有限公司怎么样? 郑州远航纸箱包装有限公司怎么样? 给孩子喝太纯的牛奶,对孩子都有什么好处? 经常喝纯牛奶对宝宝有什么好处?为什么呢? 经常喝纯牛奶对宝宝有什么好处? 可以给我画个加油吗 json,map,list区别 我在京东买的电脑屏幕坏掉啦,在保修期内,准备报修,一般京东修理的时间是多久?谢啦 一个放map的list,要怎么转成json格式??? 华硕笔记本电脑屏幕摔坏了维修需要多少时间 前台如何解析json格式的map 稻草人企业建站系统如何使用 激光“稻草人”能不能保护玉米作物免受鸟类的侵害? 一个叫“稻草人”的软件是干什么的??? 稻草人实现远程控制怎么做? 稻草人怎么在大乱斗里放假身 稻草人怎么放假人 稻草人是由多少部分组成的 蜀门稻草人是什么 四川稻草人动漫设计有限公司怎么样? 稻草人怎么玩啊 稻草人梗概 什么是M3货币 卸载稻草人后 电脑系统篡改了 求助!如何删除mac os x系统里的稻草人软件? 庄稼地放稻草人依据什么生态学原理