JavaScript 新旧替换六:键值对数据

摘要:
目录导入器ES5模式ES2015+模式区分了引用导入器“键值对”的数据结构。此前,基本上使用了{},新规范中有一个更合适的选择。在上一篇JavaScript文章中,将旧的替换为新的:函数嵌套。OriginMyGitHubES5模式的基本用法是使用{}来存储键值对。只支持两种类型的键:字符串和符号。BacktopES2015+提供了Map数据结构来解决上述关键类型的问题。映射结构提供“值-值”映射,更适合存储“键值对”。基本用法常量=newMap;安慰日志安慰日志结果Map数据结构的基本属性大小是成员总数。在频繁增加或删除键值对的情况下,它不会被优化。

目录

引子

“键值对”的数据结构,之前基本上都是使用 {} ,新的规范中有更合适的选择了。

上一篇 JavaScript 新旧替换五:函数嵌套

ES5 方式

基本用法

使用 {} 存储键值对,键的类型只支持两种:StringSymbol

const obj1 = {1:'1'};
const obj2 = {'name':'Tom'};
const mark = Symbol('age');
const obj3 = {[mark]:19};
console.log(obj1);
console.log(obj2);
console.log(obj3);

结果

78-object-base

上面的 obj1 的键名虽然是一个数字,但会被转换为字符串。

操作

添加/修改

添加和修改使用 .[] 的方式:

const obj = {};
obj.name = 'Tom';
obj['name'] = 'Jim';

对于 Symbol 类型的键值,必须要用 [] 的方式才行。

读取

跟添加类似使用 .[] 的方式:

const mark = Symbol('age');
const obj = {name:'Tom',};
obj[mark] = 19;
console.log(obj.name);
console.log(obj[mark]);

删除

删除使用 delete 操作符:

const mark = Symbol('age');
const obj = {name:'Tom',};
obj[mark] = 19;
delete obj.name;
delete obj[mark];
console.log(obj);

遍历

遍历的常用方法有:for-infor-of

let obj = {name:'Tom',1:'1'};
const mark = Symbol('age');
obj[mark] = 19;
for (const ele of Object.keys(obj)) {
  console.log(ele);
}

// 1
// name

这种数据结构的键是无序的,此外,键如果是 Symbol 类型,无法被遍历。

Back to top

ES2015+ 方式

为了解决上述键类型的问题,ES2015+ 中提供了 Map 数据结构。Map 结构提供了“值-值”的对应,更加适合存储“键值对”。

基本用法

const m = new Map([
  [1,'1'],
  ['name','Tom'],
  [Symbol('age'),19],
  [{other:'play'},'basketball'],
]);
console.log(m);
console.log(m.size);

结果

78-map-base

Map 数据结构基本属性 size 是成员的总数。

操作

添加/修改

set(key, value) 方法设置键 key 对应的值为 value ,并返回整个 Map 结构,因此可以链式调用。如果 key 已经存在,则键值会被更新。

const m = new Map();
m.set(1,'1').set('name','Tom');
const mark = Symbol('age');
m.set(mark,19);
const obj = {other:'play'};
m.set(obj,'basketball');
console.log(m);

读取

get(key) 方法读取 key 对应的值,如果找不到 key ,返回 undefined

const m = new Map([
  ['name','Tom'],
]);
const mark = Symbol('age');
m.set(mark,19);

console.log(m.get('name'));
console.log(m.get(mark));

删除

delete(key) 方法删除键 key ,删除成功则返回 true ,否则返回 false

const m = new Map([
  ['name','Tom'],
]);

const result = m.delete('name');
console.log(result) // true
console.log(m.delete('age')) // false

其它

  • has(key) : 判断是否有键 key
  • clear() : 清除所有成员。

遍历

遍历的常用方法有: forEachfor-of

const m = new Map([
  ['name','Tom'],
  [1,'1'],
  [Symbol('age'),19],
  [{other:'play'},'basketball'],
]);
for (const ele of m.keys()) {
  console.log(ele);
}

// name
// 1
// Symbol(age)
// {other: "play"}

键名是有序的,Symbol 类型的键也可以遍历到。

区别

维度MapObject
意外的键默认情况不包含任何键,只包含显式插入的键。原型链上的键名有可能与设置的键名产生冲突。
键的类型键可以是任意值。键必须是一个 String 或 Symbol 。
键的顺序有序无序
键的统计通过 size 属性获取要手动计算
迭代Map 可以直接被迭代。以某种方式(例如 Object.keys(obj))处理后才能迭代。
性能在频繁增删键值对的场景下表现更好。在频繁增删除键值对的场景下未作优化。
Back to top

参考资料

免责声明:文章转载自《JavaScript 新旧替换六:键值对数据》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Oracle 死锁的检测查询及处理java线上内存溢出问题排查步骤下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

python嵌入C++ boost.python如何在C++中调用含有不定长参数tuple变量和关键字参数dict变量的函数

    这个问题是在我尝试利用pygraphviz嵌入我的C++代码绘制二叉树的时候发现的.找了半天资料,这里我把几种常用的C++调用 PYTHON利用 boost.python 的方法作一个总结,希望能让别人少走弯路,因为有些内容还找不到中文文档,虽然都不难但是开始摸索 还是费时间的.     我个人认为boost.python真的是非常的COOL,基...

c++ 关于char *的类库函数

转自:c++ 关于char *的类库函数 一,拷贝:   char stpcpy(char *dest,const char *src) 将字符串src复制到dest   char strncpy(char *dest,const char *src,size_t maxlen) 复制src中的前maxlen个字符到dest中   char strnse...

Spring中RestTemplate的使用方法

一、REST 在互联网中,我们会通过请求url来对网络上的资源做增删改查等动作,这里的请求包含两部分:动词,主要包括增、删、改、查;名词,就是网络中的各种资源。传统的非REST风格的请求方式是把动词和名词全都放在url中。例如,对设备的操作可能是这样的:添加设备:http://test/device/add删除设备:http://test/device/d...

Puppeteer的使用

资源链接 Puppeteer官方文档:https://github.com/GoogleChrome/puppeteer puppeteer社区:https://slack.com/ 安装 //安装puppeteer cnpm i puppeteer //安装puppeteer-core cnpm i puppeteer-core 常用方法或属性 1.pu...

Haskell语言学习笔记(23)MonadReader, Reader, ReaderT

MonadReader 类型类 class Monad m => MonadReader r m | m -> r where ask :: m r ask = reader id local :: (r -> r) -> m a -> m a reader :: (r -> a)...

mysql触发器

四要素:1.监视表(table)2.监视事件(insert/update/delete)3.触发时间(after/before)4.触发事件(insert/update/delete) 语法: CREATE TRIGGER triggername AFTER/BEFORE INSERT/UPDATE/DELETE ON 表名 FOR EACH ROW #这...